防火墙iptables
iptables是开源的基于数据包过滤的防火墙工具。
iptables应用场景
1、主机防火墙(filter表的INPUT链)。 2、局域网共享上网(nat表的POSTROUTING链)。NAT功能。 3、端口及IP映射(nat表的PREROUTING链),硬防的NAT功能。 4、IP一对一映射。
iptables工作流程
iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。 1.防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。 2.如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。 3.如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。 4.防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。
iptables四表五链
Filter
NAT
iptables工作原理图
iptables环境安装
[root@lb01 ~]# yum -y install iptables-services [root@lb01 ~]# systemctl start iptables.service [root@lb01 ~]# [root@lb01 ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@lb01 ~]#
加载防火墙内核模块
[root@lb01 ~]# modprobe ip_tables [root@lb01 ~]# modprobe iptable_filter [root@lb01 ~]# modprobe iptable_nat [root@lb01 ~]# modprobe ip_conntrack [root@lb01 ~]# modprobe ip_conntrack_ftp [root@lb01 ~]# modprobe ip_nat_ftp [root@lb01 ~]# modprobe ipt_state [root@lb01 ~]# lsmod | egrep 'filter|nat|ipt' nf_nat_ftp 12770 0 nf_conntrack_ftp 18638 1 nf_nat_ftp iptable_nat 12875 0 nf_nat_ipv4 14115 1 iptable_nat nf_nat 26787 2 nf_nat_ftp,nf_nat_ipv4 ipt_REJECT 12541 2 nf_reject_ipv4 13373 1 ipt_REJECT nf_conntrack 133387 7 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4 iptable_filter 12810 1 ip_tables 27115 2 iptable_filter,iptable_nat libcrc32c 12644 3 xfs,nf_nat,nf_conntrack [root@lb01 ~]# [root@lb01 ~]# systemctl restart iptables.service [root@lb01 ~]#
iptables基础命令
#查看防火墙规则(默认查看Filter表) [root@lb01 ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@lb01 ~]# #清除防火墙规则 iptables -F <- 清除所有规则,不会处理默认的规则 iptables -X <- 删除用户自定义的链 iptables -Z <- 链的计数器清零(数据包计数器与数据包字节计数器) #添加防火墙规则 iptables -t <-指定表d(efault: `filter') iptables -A <-把规则添加到指定的链上,默认添加到最后一行。 iptables -I <-插入规则,默认插入到第一行(封IP)。 iptables -D <-删除链上的规则 #网络连接状态 NEW:已经或将启动新的连接 ESTABLISHED:已建立的连接 RELATED:正在启动的新连接 INVALID:非法或无法识别的 #删除某个规则 iptables -nL --line-numbers 查看规则号码 iptables -D INPUT 1 删除指定链上的指定序号
iptables配置Filter表
#禁止某个端口访问 [root@lb01 ~]# iptables -A INPUT -p tcp --dport 22 -j DROP 规则解释: -p #<==指定过滤的协议-p(tcp,udp,icmp,all) --dport #<==指定目标端口(用户请求的端口)。 -j #<==对规则的具体处理方法(ACCEPT,DROP,REJECT,SNAT/DNAT) --sport #<==指定源端口。 #禁止某个ip访问 [root@lb01 ~]# iptables -A INPUT -p tcp -s 10.0.1.6 -i eth0 -j DROP 规则解释: -s #<==指定源地址或网段(192.168.1.0/24)。 ! 取反。 -d #<==指定目的地址(nat表prerouting)。 -i #<==进入的网络接口(eth0,eth1)。 -o #<==出去的网络接口(eth0,eth1)。 #禁止源地址访问是10.0.1.6的主机访问22端口 [root@lb01 ~]# iptables -A INPUT -p tcp -s 10.0.1.6 --dport 22 -j DROP #禁止除了源地址是10.0.1.6以外的主机访问22端口 [root@lb01 ~]# iptables -A INPUT -p tcp ! -s 10.0.1.6 --dport 22 -j DROP #禁止10.0.1.6访问22和80端口 [root@lb01 ~]# iptables -I INPUT -s 10.0.1.6 -p tcp -m multiport --dport 22,80 -j DROP 规则解释: -m 参数表示增加扩展匹配功能,multiport 实现不连续多端口扩展匹配 #禁止10.0.1.6访问22到100的所有端口 [root@lb01 ~]# iptables -A INPUT -p tcp -s 10.0.1.6 --dport 22:100 -j DROP #禁止ping本机 [root@lb01 ~]# iptables -A INPUT -p icmp -j DROP #只要不是10.0.1.6就不允许ping本机 [root@lb01 ~]# iptables -A INPUT -p icmp --icmp-type 8 ! -s 10.0.1.6 -j DROP
NAT共享上网
#lb01 [root@lb01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.1.5 [root@lb01 ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf 规则解释: -t nat :NAT表 -A POSTROUTING :POSTROUTING链 -s 172.16.1.0/24 :源地址172.16.1.0/24 -j SNAT :SNAT 改写源地址 --to-source 10.0.0.61 :将源地址改写成10.0.0.61 #lb02 [root@lb02 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 GATEWAY=172.16.1.5 [root@lb02 ~]# ifdown eth1 && ifup eth1 [root@lb02 ~]# vim /etc/resolv.conf nameserver 10.0.1.254
端口映射
#访问10.0.1.5的9000端口,跳转到172.16.1.6的22端口 [root@lb01 ~]# iptables -t nat -A PREROUTING -d 10.0.1.5 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.6:22 命令拆解: 表:nat 链:PREROUTING 目标IP:10.0.1.5 目标端口:9000 协议:tcp 动作:DNAT 目标IP:172.16.1.6 目标端口:22 改写数据包的目标IP和端口 用到的是PREROUTING链
IP映射
[root@lb01 ~]# ip a add 10.0.1.59/24 dev eth0 label eth0:0 [root@lb01 ~]# iptables -t nat -A PREROUTING -d 10.0.1.59 -j DNAT --to-destination 172.16.1.6
iptables规则保存
保持命令 iptables-save iptables-save > iptables_m01 iptables-restore < iptables_m01 iptables-save > /etc/sysconfig/iptables