6.5 iptables的基础知识

6.5.1 iptables的状态state

6.2节里提到过state这个定义,这里将解释一下iptables防火墙的状态(state)。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

比如,当我们用PieTTY远程工具访问远程主机的SSH端口时,主机会和远程主机进行通信。此时,静态的防火墙会这样处理:

检查进入机器的数据包,发现数据的来源是22端口,当这些数据包被允许时进入主机本身,连接之后相互通信的数据也一样,检查每个数据,如果发现数据包来源于22端口,则允许通过。

如果使用有状态的防火墙将如何处理呢?

在连接远程主机成功之后,主机会把这个连接记录下来,当有数据从远程SSH服务器进入你的机器时,它会检查自己的连接状态表,如果发现这个数据来源于一个已经建立的连接,则允许这个数据包进入。

以上两种处理方法中,很明显静态防火墙比较生硬,而iptables防火墙则相对智能一些,这也是iptables防火墙的特点之一。

下面将解释以下几种state状态。

·NEW:如果你的主机向远程机器发出一个连接请求,这个数据包的状态就是NEW。

·ESTABLISHED:在连接建立之后(完成TCP的三次握手后),远程主机和你的主机通信数据的状态为ESTABLISHED。

·RELATED:和现有联机相关的新联机封包。像FTP这样的服务,用21端口传送命令,而用20端口(port模式)或其他端口(PASV模式)传送数据。在已有的21端口上建立好连接后发送命令,用20或其他端口传送的数据(FTP-DATA),其状态是RELATED。

·INVALID:无效的数据包,不能被识别属于哪个连接或没有任何状态,通常这种状态的数据包会被丢弃。

有了以上基础知识后,接下来就可以进行一个简单的实验了。

首先,还是来设置默认规则,命令如下所示。

iptables -P INPUT DROP

这样机器会将进入主机的所有数据都丢弃掉,建议大家写iptables脚本时首先默认禁止一切连接,然后再根据应用或需求开放相应的端口。

如果有一台主机只用于个人桌面应用,也就是此主机不提供任何服务,那么,就可以禁止其他的机器向该主机发送任何连接请求,命令如下:

iptables -A INPUT -m state --state NEW -j DROP

这个规则是将发送到该主机的所有数据包(状态是NEW的包)全部丢弃。也就是不允许其他的机器主动发起对该主机的连接,但是该主机却可以主动连接其他的机器,不过仅仅是连接而已,连接之后的数据就是ESTABLISHED状态的。这时,再加上下面这一条语句,其作用是允许所有已经建立连接,或者与之相关的数据通过:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

现在根据上面的语句编写一个简单的iptables脚本,作为个人桌面主机的防火墙,脚本如下:

#/bin/bash

iptables -F

iptables -F -t nat

iptables -X

iptables -Z

iptables -P INPUT DROP

iptables -A INPUT -m state --state NEW -j DROP

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

给此脚本x权限,命令如下:

chmod +x iptables.sh

前面几条语句是将其默认规则全部清除掉,让此脚本后面的语句生效。

其实,第二条可以被注释掉,那一条规则完全可以省去,让默认规则处理即可。

是不是很简单呢?对于个人桌面应用来说,只需要用刚才介绍的那两条语句,就能让你接入Internet网的主机足够安全。而且可以随意访问Internet,但是外部却不能主动发起对你机器的连接。

可以看到,有状态的防火墙比静态防火墙要“智能”一些,而且规则的设置也容易一些。

执行以上脚本后,查看一下iptables规则,命令如下:

iptables -nv -L

命令显示结果如下:

Chain INPUT (policy DROP 0 packets、

0 bytes)

pkts bytes target prot opt in out source destination

0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW

37 2520 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state

RELATED、

ESTABLISHED

Chain FORWARD (policy ACCEPT 0 packets、

0 bytes)

pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 1532 packets、

1224K bytes)

pkts bytes target prot opt in out source destination

另外,在执行以上脚本后,我们会发现此机器会拒绝一切的数据接入,但是原先的SSH并没有被断开?这是为什么呢,这是因为“iptables-A INPUT-m state--state ESTABLISHED,RELATED-j ACCEPT”这段代码发挥了作用,我们原先建立的连接还存在,所以主机不会将此ESTABLISHED连接断掉,state的优势在这里发挥得淋漓尽致。

阅读 ‧ 电子书库

注意

以上脚本在实验环境下尝试即可,切勿应用于生产服务器,因为默认会拒绝一切连接的。