iptables是在Linux 环境下一款优秀的软件防火墙,通过配置iptables的数据流向过滤规则,可以有效的关闭、限制服务器上的各端口数据的发送和接收,提高系统的安全性。iptables有三个内置的数据流链(chains),分别是流入链(INPUT)、流出链(OUTPUT)和转发链(FORWORD),我们就是通过对这三个数据流链增加各种规则来限制数据流动。本文主要介绍INPUT和OUTPUT。
iptables是在Linux 环境下一款优秀的软件防火墙,通过配置iptables的数据流向过滤规则,可以有效的关闭、限制服务器上的各端口数据的发送和接收,提高系统的安全性。iptables有三个内置的数据流链(chains),分别是流入链(INPUT)、流出链(OUTPUT)和转发链(FORWORD),我们就是通过对这三个数据流链增加各种规则来限制数据流动。本文主要介绍INPUT和OUTPUT。
大多数Linux系统默认都会安装iptables。如果你的系统里面还没有安装它,可以使用yum命令来安装它。
1 | yum install iptables |
在介绍如何配置iptables之前,先简单介绍一下iptables的命令,后面将会用到它们。
01 | iptables -A chain # 添加规则到一个链 |
02 | iptables -D chain # 删除链中的对应规则 |
03 | iptables -D chain rulenum # 删除指定的行的规则,1是第一行,依次类推 |
04 | iptables -I chain [rulenum] # 向指定行插入规则,默认为第一行 |
05 | iptables -R chain rulenum # 替换指定行号的规则,1是第一行 |
06 | iptables -L [chain] # 显示某个链中的规则,不指定链则显示所有链中的规则 |
07 | iptables -F [chain] # 清空/删除链中的规则,不指定链则删除所有链中的规则 |
08 | iptables -Z [chain] # 重设链、所有链的流量计数器的数值 |
09 | iptables -N chain # 创建一个用户自定义的链 |
10 | iptables -X [chain] # 删除一个用户自定义的链 |
11 | iptables -P chain target # 更改某个链的目标 |
12 | iptables -E old-chain new-chain # 修改一个链的名称 |
在配置之前先查看一下系统中是不是已经有配置过的规则,如果你的机器没有配置过,显示和下面的类似。
1 | iptables -L |
如果已经有了规则,但是你确定需要重新指定可以使用下面的命令清除已有规则。
1 | iptables -F |
接下来按照从严的原则来配置,目的就是为了提高系统的安全性。需要阻止一切不需要的数据流动。
在阻止一切流入包之前,先要允许SSH包流入,不然会把自己挡在防火墙的外面,无法连接服务器。
1 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT; #添加规则,允许TCP协议的22端口(SSH)进入 |
注意这里如果你修改过SSH的默认端口,那么应该使用修改过之后的端口号,如果你不是使用SSH登录的而是使用Telnet登录,应该用telnet的端口(默认23)。
确认你上面的操作正确,不会把自己挡在防火墙外后,接下来禁止其他端口的流入包
1 | iptables -A INPUT -j DROP # 禁止所有流入包 |
让我们抓Google的主页试试看,你的服务器停留在了解析google.com的ip地址上,因为机器已经收不到域名服务器发送过来的解析结果了。
然后你可以删除上面的规则
1 | iptables -D INPUT 2 # 删除第二条INPUT规则,或者 |
2 | iptables -D INPUT -j DROP # 直接将 -A 改成 -D,删除该条规则 |
删除之后,你就可以顺利抓取Google的主页了。
当然我们为了系统的安全我们是需要这条规则的,不过不能把它放在前面,我们需要把它放到其他规则的后面,接下来先添加其他软件需要开放的端口。
01 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT; #添加规则,允许TCP协议的22端口(SSH)进入 |
02 | iptables -A INPUT -p tcp --dport 53 -j ACCEPT # DNS服务 |
03 | iptables -A INPUT -p udp --dport 53 -j ACCEPT |
04 | iptables -A OUTPUT -p tcp --sport 53 -j ACCEPT |
05 | iptables -A OUTPUT -p udp --sport 53 -j ACCEPT |
06 | iptables -A INPUT -p tcp --dport 80 -j ACCEPT # Http服务 |
07 | iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT |
08 | iptables -A INPUT -p tcp --dport 443 -j ACCEPT # Https服务 |
09 | iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT |
10 | iptables -A INPUT -p tcp -m multiport --destination-port 20,21 -j ACCEPT # 开放FTP服务 |
11 | iptables -A OUTPUT -p tcp -m multiport --source-port 20,21 -j ACCEPT |
12 | iptables -A INPUT -p tcp -m multiport --destination-port 47,1723 -j ACCEPT # 开放vpn服务 |
13 | iptables -A INPUT -p gre -j ACCEPT |
14 | iptables -A OUTPUT -p tcp -m multiport --source-port 47,1723 -j ACCEPT |
15 | iptables -A OUTPUT -p gre -j ACCEPT |
16 | iptables -A INPUT -p tcp -m multiport --destination-port 25,110,143 -j ACCEPT #开放mail服务 |
17 | iptables -A OUTPUT -p tcp -m multiport --source-port 25,110,143 -j ACCEPT |
18 | iptables -A INPUT -j DROP # 最后禁止所有其他不需要的流入包 |
把修改过的规则保存起来,重启iptables。
1 | service iptables save #保存规则 |
2 | service iptables restart #重启 |