我们加规则,加到每个链中,每个链中的规则有很多,有一部分规则是相似的,比如,有一部分都是端口的过滤,有一部分都是报文的修改,根据这些规则的类型,把相似的规则放在一起,这些放在一起的规则的集合称为表。
那不同的规则的集合就放在了不同的表中,总共有4种表,也就是4种规则:
filter表:负责过滤功能;
nat表:network address translation,网络地址转换功能;
mangle表:拆解、修改、并重新封装报文;
raw表:关闭nat表上启用的连接追踪机制;
因为每个链中都有不同规则,所以表存在于每一个链中,但不是每个链都有这4种表,
PREROUTING 的规则可以存在于:raw表,mangle表,nat表。
INPUT 的规则可以存在于:mangle表,filter表,nat表(centos7中有nat表,centos6中没有)。
FORWARD 的规则可以存在于:mangle表,filter表。
OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING 的规则可以存在于:mangle表,nat表。
表的处理优先级如下:
raw --> mangle --> nat --> filter
所以我们一开始iptables的基本工作流程图可以更详细些
其实还可以再详细些,我们单独拿一个链出来,比如PREROUTING链,大概是如下情况,这些规则组和在了一起便成了一条链。
所以,我们上面加的禁止访问本机80端口的规则是存放在filter表中的,我们来查看下filter表中的规则,可以看到我们添加的规则,netfilter默认把80端口绑定为http。 [root@c951c0a9d34d /]# iptables -L -t filter Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere anywhere tcp dpt:http Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination iptables常用命令举例
查看规则
按表查看: iptables -L -t table 按照链查看: iptables -nL设置链的默认规则
#INPUT链默认拒绝所有数据包 iptables -P INPUT DROP #OUTPUT默认允许所有数据包出去 iptables -P INPUT ACCEPT清空表中的规则
#清空nat表中PREROUTING链的规则 iptables -t nat -F PREROUTING #清空filter表中所有链的规则 iptables -t filter -F #清空使用者自定义的表规则 iptables -X删除某一条规则
#可以通过编号来删除 #--line-number在规则前面显示了编号 [root@c951c0a9d34d /]# iptables -nL --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination [root@c951c0a9d34d /]# [root@c951c0a9d34d /]# iptables -D INPUT 1 #也可以直接删除规则 #下面命令中,-D后面的全是匹配条件,凡是某条规则中全部匹配这些的就删除 [root@c951c0a9d34d /]# iptables -D INPUT -p tcp --dport 80 -j DROP禁ping
#禁止别人ping自己,但是自己可以ping别人 #type 8: 表示ping包请求流量 #type 0: 表示ping包响应流量 iptables -A INPUT -p icmp --icmp-type 0 -j DROP iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP #禁止别人ping自己,也禁止自己ping别人 iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP #也可以改参数实现禁ping echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all转发
#开启转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward #对于外部访问自己80端口的流量全部转到172.17.0.4的80端口, #xxx.xxx.xxx.xx代表本机的IP iptables -t nat -I PREROUTING -d xxx.xxx.xxx.xx -p tcp --dport 80 -j DNAT --to-destination 172.17.0.4:80 #对于从本机出去的流量,源ip全部转换为172.17.0.4 iptables -t nat -A POSTROUTING -p tcp -j SNAT --to-source 172.17.0.4