数据包进入流程:依次检查每条规则。
数据包传送到防火墙时,会由Netfilter(iptables)做检查。检查通过则放行,否则将数据包丢弃。规则的检查如上图所示,也是有顺序的。如果数据包在进行第一条规则比对时已经符合,那么就执行相关动作,后面的规则一律不再进行检查;同理如果第一条规则不匹配就比对第二条,直到结束。如果所有的规则都不匹配则通过预先设定的数据包动作来决定数据的包放行与否。
iptables的表(table)与链(chain)
iptables有多个表,每个表的用途都不同,也都有自己的规则。即我们通常所说的iptables的3表5链。
- filter表:主要是跟进入Linux本机的数据包有关,这个是预设的表。
INPUT:主要与想要进入Linux本机的数据包有关;
OUTPUT:主要是Linux本机索要送出的数据包有关;
FORWARD:与本机关联不大,可以传递数据包到后端设备中。与NAT表关联性大些。
- nat表:主要是源目ip和端口的转换,主要与后端的设备相关。
PREROUTING:路由判断前要进行的规则(DNAT/REDIRECT);
POSTROUTING:路由判断后要进行的规则(SNAT/MASQUERADE);
OUTPUT:与发送出去的数据包有关。
- mangle表:主要与特殊数据包的路由标志相关。(实际过程中我使用的较少)
与Linux本机最有关的是filter表的INPUT和OUTPUT这两条链。
如果防火墙是后面还有其他的设备,需要对filter表的FORWARD链进行限制,还有NAT表的PREROUTING和POSTROUTING以及OUTPUT需要设置
一般系统安装后会自动建立默认的防火墙机制,比如SSH默认开放22号端口。
iptables的参数:
iptables [ -t tables] [ -L ] [ -nv ]
-t:后面接表(filter或者nat),不加-t参数默认是filter表
-L:列出当前表的所有规则
-n:列出ip,不进行ip与hostname的反查
-v:列出详细信息,包括数据包的总位数,接口等
Chain INPUT(policy ACCEPT 0 packets,0 bytes)这是预设的数据包规则,默认全部接受;FORWARD和OUTPUT链同理
虽然INPUT和OUTPUT链的预设规则是允许,但是在链中的最后一条规则其实都是拒绝的
以INPUT链的规则详细说明:
1、所有协议,只要数据的连接状态为RELATED和ESTABLISHED就接受
2、主要是ICMP的协议就接受
3、 所有协议,只要是从本地环回接口lo口流入的就接受
4、主要是目的端口是22号端口的主动连接TCP数据包就接受
5、所有的数据包信息全部拒绝
iptables-save来查看防火墙的规则信息,这个规则信息则没有之前那样规范化的显示
iptables-save -t filter或者nat
[root@shuangwaiwai ~]# iptables-save
*filter filter表
:INPUT ACCEPT [0:0] 预设INPUT链规则
:FORWARD ACCEPT [0:0] 预设FORWARD链规则
:OUTPUT ACCEPT [627:69347] 预设OUTPUT链规则
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
iptables规则清除:
iptables [ -t tables ] [ -FXZ ]
-F:清除所有已经设定的规则
-X:清除所有使用者自定义的链表
-Z:将所有链的计数与流量统计都清零
这3个清除防火墙规则的参数不会改变预定规则,但是有可能服务器就连接不上了