iptables 的一些经典配置实例
本文最近更新于 2018 年 05 月 16 日 ,大连
iptables 是默认情况下大多数 Linux 发行版中的软件防火墙,本文分享一些 iptables 的经典配置实例。
写在前面
规则的顺序很重要。iptables 命令使用
-A
选项将新规则附加到规则链末,-I
选项允许我们指定新规则的位置。当使用防火墙时,注意不要阻断 SSH 端口(默认情况下为
22
)。否则,您可能需要通过控制台(例如 console 链接)连接节点,然后更改防火墙规则以允许 SSH 访问。如果开机启动保存的防火墙规则允许 SSH 访问,另一种方法是重新启动服务器。查看当前的 iptables 规则集:
sudo iptables -S
/sudo iptables -L
或者sudo iptables -L -n -v
查看更详细的规则
初次设置
在初次设定 iptables 规则时,我们一般会先清除旧规则。用以下命令清除旧规则:
iptables --flush
「可选」严格的 chain 策略——对于 filter table,默认的 chain 策略为 ACCEPT,我们可以通过以下命令修改 chain 的策略:
iptables -P INPUT DROP #注意:如果是远程 SSH 登陆的话,运行这个命令回车后就应该掉了!解决方法见下方。
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
以上命令配置将接收、转发和发出包均丢弃,施行比较严格的包管理。由于接收和发包均被设置为丢弃,当进一步配置其他规则的时候,需要注意针对 INPUT 和 OUTPUT 分别配置。当然,如果信任本节点向外发包,第三条规则可不必配置。
上面提到的 SSH 连接断掉的解决方法可以先把 INPUT
和 OUTPUT
的规则打开:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
然后参照下面的规则配置“允许所有传入的 SSH 连接”,然后再 DROP 规则:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
配置实例
允许所有传入的 SSH 连接:
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
要允许所有传出的 SSH 连接,例如通过服务器启动 SSH 连接到另一台服务器,可以运行下面的命令:
sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
loopback 接口,也被称为 lo,用于服务器连接到自身。例如,运行 ping localhost
或 ping 127.0.0.1
,服务器将使用环回 ping 通本身。如果将应用程序服务器配置为使用 localhost 地址连接到数据库服务器,那么也将使用 loopback 接口。因此,需要确保防火墙允许这些连接:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
网络通信通常需要是双向——传入和传出均正常工作。这是典型的创建“允许建立和相关的传入”通信防火墙规则:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
通常还要允许所有已建立的传出连接。这是典型的合法传入连接响应传出流量:
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
一些网络流量的数据包被标记为无效,有时,记录此类型的数据包可能有用,但通常可以删除它们:
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
要阻止从一个特定的 IP 地址发起的网络连接,例如 15.15.15.51
,使用以下命令:
sudo iptables -A INPUT -s 15.15.15.51 -j DROP
在这个例子中,-s 15.15.15.51
指定 15.15.15.51
为一个源 IP 地址。源 IP 地址可以在任何防火墙规则中指定,包括允许规则。
如果要拒绝,而不是 DROP,也就是以“连接被拒绝”这样的错误回应,可以使用下面的命令进行设定:
sudo iptables -A INPUT -s 15.15.15.51 -j REJECT
Web 服务器(如 Apache 和 Nginx)通常分别监听端口 80(HTTP) 和 443(HTTPS)连接的请求。如果将传入流量的默认策略设置为 drop
或 deny
,则需要创建允许规则以响应这些请求。
要允许所有传入的 HTTP(端口 80)连接,运行以下命令:
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
要允许所有传入的 HTTPS(端口 443)连接,运行以下命令:
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
如果想同时允许 HTTP 和 HTTPS 流量,可以使用多端口模块来创建一个规则,允许两个端口。运行以下命令:
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
MySQL 默认侦听端口 3306 的连接。如果服务器上正在使用 MySQL 数据库服务器,则需要确保允许该流量:
要允许来自特定 IP 地址或子网的传入 MySQL 连接,例如 15.15.15.0/24
子网,运行以下命令:
sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
要允许特定的网络接口连接,例如 MySQL 连接 eth1,使用以下命令:
sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
邮件服务器(例如 Sendmail 和 Postfix)根据用于邮件传递的协议在各端口侦听。如果正在运行邮件服务器,需要检查正在使用的协议,并允许相应类型的流量。
如果服务器不应外发邮件,则需要阻止此类流量。例如阻止使用端口 25 的传出 SMTP 邮件,运行以下命令:
sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT
要允许服务器响应 SMTP 连接(端口 25),运行以下命令:
sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT
要允许服务器响应 IMAP 连接(端口 143),运行以下命令:
sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT
要允许服务器响应 IMAPS 连接,端口 993,运行以下命令:
sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT
要允许服务器响应 POP3 连接,端口 110,运行以下命令:
sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT
要允许服务器响应 POP3S 连接,端口 995,请运行以下命令:
sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT
如果还做了其他的服务器,需要开启哪个端口,照着写就可以了。
配置好 iptables 规则后,别忘了保存/备份,并做些配置令 iptables 开机即生效。例如 Ubuntu 上面可以这样做:
touch /etc/sysconfig/iptables
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
echo 'iptables-restore /etc/sysconfig/iptables' >> /etc/rc.local
chmod +x /etc/rc.local
cat /etc/rc.local
最后把 iptables 重起一下使其生效:
service iptables restart
最近更新: