一般情况下,我们打算允许 sshd ,ftpd, httpd 这些连接,可能会使用下面的防火墙规则:
[Plain Text] 纯文本查看 复制代码 iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
一般情况下这样设置没什么问题。但是有点不够完美。众所周知,TCP 协议连接需要经过三次握手 这个过程,而第一次握手则是由客户端发出连接请求信号,其做法是在 TCP 包中将 TCP-Flag 中的 syn 标志置位,如下图所示:
![]()
如果,有一个不太守规矩的用户并不按章出牌,而是在发起连接时,直接送出一个带有 fin 的标志(完成连接)的数据包,即还没开始连接就要终止了。那么服务器会该如何响应?谁也不知道,可能一点事都没有,也可能会发生崩溃(事实上很少出现这种情况)。然而为了防止这样的行为,我们可以将上面的规则改为:
[Plain Text] 纯文本查看 复制代码 iptables -A INPUT -p tcp --syn --dport 21 -m state --state NEW -j ACCEPT
上面规则的意思是:我们使用 state 模块来确定,当一个连接是新发起的 (客户端发来第一个连接数据包 (-m state --state NEW)),防火墙要检查该包里是否含有 syn 标志,如果含有,那么认为该连接是个正常的连接,否则就是个非法连接,需要将其摒弃。
又如,如果想屏蔽一切的 TCP 进,而允许 TCP 出,那么可以:
[Plain Text] 纯文本查看 复制代码 iptables -A INPUT -p tcp --syn -j DROP
这样,你可以访问外面的所有可以访问的 TCP 网络服务,而别人则不能通过 TCP 协议来刺探你。 |