2.11. iptables与firewalld 防火墙

2.11.1. iptables中的常用参数

-P  设置默认策略
-F  清空规则链
-L  查看规则链
-A  在规则链的末尾加入新规则
-I num  在规则链的头部加入新规则
-D num  删除某一条规则
-s  匹配来源地址 IP/MASK,加叹号“!”表示除这个 IP 外
-d  匹配目标地址
-i 网卡名称  匹配从这块网卡流入的数据
-o 网卡名称  匹配从这块网卡流出的数据
-p  匹配协议,如 TCP、UDP、ICMP
--dport num  匹配目标端口号
--sport num  匹配来源端口号

查看已有的防火墙规则链

iptables -L
iptables -F     #清空已有的防火墙规则链

iptables -P INPUT DROP  #把INPUT链的默认策略设置为拒绝

#添加一条允许 ICMP 流量进入的策略规则
iptables -I INPUT -p icmp -j ACCEPT

#删除INPUT链中的规则
iptables -D INPUT 1

# 设置默认策略为允许
iptables -P INPUT ACCEPT

iptables -L

iptables -L INPUT                   # 列出某规则链中的所有规则
iptables -X allowed                 # 删除某个规则链 ,不加规则链,清除所有非内建的
iptables -Z INPUT                   # 将封包计数器归零
iptables -N allowed                 # 定义新的规则链
iptables -P INPUT DROP              # 定义过滤政策,将INPUT表默认设置为拒绝
iptables -A INPUT -s 192.168.0.1 -j DROP    #filter表添加一条入站规则,丢弃192.168.0.1主机发给防火墙本机的所有数据包
iptables -I INPUT -s 192.168.0.22 -p icmp -j REJECT     #ilter表添加一条入站规则,拒绝192.168.0.22 ping防火墙本机
iptables -A INPUT -s 192.168.1.1    # 比对封包的来源IP   # ! 192.168.0.0/24  ! 反向对比
iptables -A INPUT -d 192.168.1.1    # 比对封包的目的地IP
iptables -A INPUT -i eth0           # 比对封包是从哪片网卡进入
iptables -A FORWARD -o eth0         # 比对封包要从哪片网卡送出 eth+表示所有的网卡
iptables -A INPUT -p tcp            # -p ! tcp 排除tcp以外的udp、icmp。-p all所有类型
iptables -D INPUT 8                 # 从某个规则链中删除一条规则
iptables -D INPUT --dport 80 -j DROP         # 从某个规则链中删除一条规则
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.10 -j ACCEPT       #如果只允许一个固定的IP 能ssh
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT                      #开通从该服务器ssh 到别的服务器

iptables -R INPUT 8 -s 192.168.0.1 -j DROP   # 取代现行规则
iptables -I INPUT 8 --dport 80 -j ACCEPT     # 插入一条规则
iptables -A INPUT -i eth0 -j DROP            # 其它情况不允许
iptables -A INPUT -p tcp -s IP -j DROP       # 禁止指定IP访问
iptables -A INPUT -p tcp -s IP --dport port -j DROP               # 禁止指定IP访问端口
iptables -A INPUT -s IP -p tcp --dport port -j ACCEPT             # 允许在IP访问指定端口
iptables -A INPUT -p tcp --dport 22 -j DROP                       # 禁止使用某端口
iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP   # 禁止icmp端口
iptables -A INPUT -i eth0 -p icmp -j DROP                         # 禁止icmp端口
iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP                  # 阻止所有没有经过你系统授权的TCP连接
iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT   # IP包流量限制
iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT  # 除192.168.62.1外,禁止其它人ping我的主机
iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m recent --up
--seconds 5 --hitcount 20 --rttl --name WEB --rsource -j DROP  # 可防御cc攻击(未测试)

#向INPUT规则链中添加拒绝192.168.10.5主机访问本机80端口(Web服务)的策略规则:
iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT


#将INPUT规则链设置为只允许指定网段的主机访问本机的22端口,拒绝来自其他所有主机的流量:
iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT

#向INPUT规则链中添加拒绝所有人访问本机12345端口的策略规则
iptables -I INPUT -p tcp --dport 12345 -j REJECT
iptables -I INPUT -p udp --dport 12345 -j REJECT

#向INPUT规则链中添加拒绝所有主机访问本机1000~1024端口的策略规则:
iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT
iptables -A INPUT -p udp --dport 1000:1024 -j REJECT

#nat转换
iptables -t nat -A POSTROUTING -s 172.28.27.0/24 -o eth0 -j SNAT --to 61.187.55.36 #将所有来自172.28.27.0/24数据包的源ip转为61.187.55.36,实现内网地址转为公网地址,上网


#Ip地址映射
iptables -A POSTROUTING -i eth0 -d 61.187.55.35 -j DNAT --to 172.28.27.100
iptables -A POSTROUTING -o eth0 -s 172.28.27.100 -j SNAT --to 61.187.55.35
#因为通信是双向的,所以IPtables先将接收到的目的IP为61.187.55.35的数据包进行目的nat(dnat),然后对接收到的源IP地址为172.28.27.100 数据包
#进行源nat(snat),这样所有目的IP为61.187.55.35的数据包都将转发给172.28.27.100,而所有来自172.28.27.100的数据包都被伪装成61.187.55.35,从而实现IP地址映射



#实现对内网的www和ftp服务进行保护
iptables -f     #先清除input链的所有规则
iptables -p forward drop #设置防火墙forward链的策略为drop,防火墙的默认规则是先禁止所有数据包,然后挨个放行
iptables -a forward -p tcp -d 172.28.27.100 -dport www -i eth0 -j accept #开放服务器端口80的www服务
iptables -a forward -p tcp -d 172.28.27.100 -dport ftp -i eth0 -j accept #开放服务器的FTP服务,其余的服务以此类推,因为是双向的,所以还需要设置内部数据包流出的规则
iptables -a forward -s 172.28.27.0/24 -i eth1 -j accept             #接受来自整个内部网络的数据包并使之通过

2.11.2. iptables配置文件

iptables配置实例文件

     #iptables规则配置文件/etc/sysconfig/iptables

     # Generated by iptables-save v1.2.11 on Fri Feb  9 12:10:37 2007
     *filter
     :INPUT ACCEPT [637:58967]
     :FORWARD DROP [0:0]
     :OUTPUT ACCEPT [5091:1301533]
     # 允许的IP或IP段访问 建议多个
     -A INPUT -s 127.0.0.1 -p tcp -j ACCEPT
     -A INPUT -s 192.168.0.0/255.255.0.0 -p tcp -j ACCEPT
     # 开放对外开放端口
     -A INPUT -p tcp --dport 80 -j ACCEPT
     # 指定某端口针对IP开放
     -A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT
     # 拒绝所有协议(INPUT允许)
     -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP
     # 允许已建立的或相关连的通行
     -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
     # 拒绝ping
     -A INPUT -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable
     COMMIT
     # Completed on Fri Feb  9 12:10:37 2007