守望的麦子

iptables 的一些经典配置实例

2018-5-9    大连    /linux/2018/05/09/iptables.html linux linux, iptables,

本文最近更新于 2018 年 5 月 16 日,大连

iptables 是默认情况下大多数 Linux 发行版中的软件防火墙,本文分享一些 iptables 的经典配置实例。

写在前面

初次设置

在初次设定 iptables 规则时,我们一般会先清除旧规则。用以下命令清除旧规则:

1 iptables --flush

「可选」严格的 chain 策略——对于 filter table,默认的 chain 策略为 ACCEPT,我们可以通过以下命令修改 chain 的策略:

1 iptables -P INPUT DROP #注意:如果是远程 SSH 登陆的话,运行这个命令回车后就应该掉了!解决方法见下方。
2 iptables -P FORWARD DROP
3 iptables -P OUTPUT DROP

以上命令配置将接收、转发和发出包均丢弃,施行比较严格的包管理。由于接收和发包均被设置为丢弃,当进一步配置其他规则的时候,需要注意针对 INPUT 和 OUTPUT 分别配置。当然,如果信任本节点向外发包,第三条规则可不必配置。

上面提到的 SSH 连接断掉的解决方法可以先把 INPUTOUTPUT 的规则打开:

1 iptables -P INPUT ACCEPT
2 iptables -P OUTPUT ACCEPT

然后参照下面的规则配置“允许所有传入的 SSH 连接”,然后再 DROP 规则:

1 iptables -P INPUT DROP
2 iptables -P OUTPUT DROP

配置实例

允许所有传入的 SSH 连接:

1 sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

要允许所有传出的 SSH 连接,例如通过服务器启动 SSH 连接到另一台服务器,可以运行下面的命令:

1 sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

loopback 接口,也被称为 lo,用于服务器连接到自身。例如,运行 ping localhostping 127.0.0.1,服务器将使用环回 ping 通本身。如果将应用程序服务器配置为使用 localhost 地址连接到数据库服务器,那么也将使用 loopback 接口。因此,需要确保防火墙允许这些连接:

1 sudo iptables -A INPUT -i lo -j ACCEPT
2 sudo iptables -A OUTPUT -o lo -j ACCEPT

网络通信通常需要是双向——传入和传出均正常工作。这是典型的创建“允许建立和相关的传入”通信防火墙规则:

1 sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

通常还要允许所有已建立的传出连接。这是典型的合法传入连接响应传出流量:

1 sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

一些网络流量的数据包被标记为无效,有时,记录此类型的数据包可能有用,但通常可以删除它们:

1 sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

要阻止从一个特定的 IP 地址发起的网络连接,例如 15.15.15.51,使用以下命令:

1 sudo iptables -A INPUT -s 15.15.15.51 -j DROP

在这个例子中,-s 15.15.15.51 指定 15.15.15.51 为一个源 IP 地址。源 IP 地址可以在任何防火墙规则中指定,包括允许规则。

如果要拒绝,而不是 DROP,也就是以“连接被拒绝”这样的错误回应,可以使用下面的命令进行设定:

1 sudo iptables -A INPUT -s 15.15.15.51 -j REJECT

Web 服务器(如 Apache 和 Nginx)通常分别监听端口 80(HTTP) 和 443(HTTPS)连接的请求。如果将传入流量的默认策略设置为 dropdeny,则需要创建允许规则以响应这些请求。

要允许所有传入的 HTTP(端口 80)连接,运行以下命令:

1 sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

要允许所有传入的 HTTPS(端口 443)连接,运行以下命令:

1 sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果想同时允许 HTTP 和 HTTPS 流量,可以使用多端口模块来创建一个规则,允许两个端口。运行以下命令:

1 sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 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 子网,运行以下命令:

1 sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

要允许特定的网络接口连接,例如 MySQL 连接 eth1,使用以下命令:

1 sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

邮件服务器(例如 Sendmail 和 Postfix)根据用于邮件传递的协议在各端口侦听。如果正在运行邮件服务器,需要检查正在使用的协议,并允许相应类型的流量。

如果服务器不应外发邮件,则需要阻止此类流量。例如阻止使用端口 25 的传出 SMTP 邮件,运行以下命令:

1 sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

要允许服务器响应 SMTP 连接(端口 25),运行以下命令:

1 sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

要允许服务器响应 IMAP 连接(端口 143),运行以下命令:

1 sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT

要允许服务器响应 IMAPS 连接,端口 993,运行以下命令:

1 sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT

要允许服务器响应 POP3 连接,端口 110,运行以下命令:

1 sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT

要允许服务器响应 POP3S 连接,端口 995,请运行以下命令:

1 sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2 sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果还做了其他的服务器,需要开启哪个端口,照着写就可以了。

配置好 iptables 规则后,别忘了保存/备份,并做些配置令 iptables 开机即生效。例如 Ubuntu 上面可以这样做:

1 touch /etc/sysconfig/iptables
2 iptables-save > /etc/sysconfig/iptables
3 cat /etc/sysconfig/iptables
4 echo 'iptables-restore /etc/sysconfig/iptables' >> /etc/rc.local
5 chmod +x /etc/rc.local
6 cat /etc/rc.local

最后把 iptables 重起一下使其生效:

1 service iptables restart
关于作者
麦子,80 后,现从事通信行业。安卓玩家一个人的书房朗读者。
MRJENGLISH
jsntn
jasonwtien
jasonwtien
更多…… /about.html

最近更新: