用户空间应用程序 iptables 允许配置 Linux 内核防火墙提供的表,以及它存储的链和规则。当前用于 iptables 的内核模块仅适用于 IPv4 流量,为 IPv6 连接配置防火墙规则而不是使用 ip6tables,它响应与 iptables 相同的命令结构。
列出当前规则
Debian 服务器默认不实施任何限制,但为了将来参考,检查当前的 iptable 规则,使用以下命令。
sudo iptables -L
这将打印出三个链的列表,输入、转发和输出,如下面的空规则表示例输出。
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
链名表示每个列表中的规则将应用于哪些流量,输入用于连接到您的云服务器的任何连接,输出是任何离开的流量,转发用于任何通过。每个链也有其策略设置,如果流量不匹配任何特定规则,则确定如何处理流量,默认情况下它设置为accept。
添加规则
防火墙通常可以通过以下两种方式之一进行配置,或者将默认规则设置为接受,然后使用特定规则阻止任何不需要的流量,或者使用规则定义允许的流量并阻止其他所有流量。后者通常是推荐的方法,因为它允许先发制人地阻止流量,而不必被动地拒绝不应尝试访问您的云服务器的连接。
要开始使用 iptables,您应该首先为您需要的服务添加允许入站流量的规则。iptables 可以跟踪连接的状态,使用下面的命令来允许建立的连接。
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
您可以检查是否使用与以前相同的sudo iptables -L添加了规则。
接下来,允许流量到特定端口以启用 SSH 连接,如下所示。
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
命令中的ssh转换为协议默认使用的端口号 22。相同的命令结构也可用于允许到其他端口的流量。要启用对 HTTP Web 服务器的访问,请使用以下命令。
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
添加所需的所有允许规则后,将输入策略更改为删除。
警告:将默认规则更改为 drop 将只允许特别接受的连接。在更改默认规则之前,请确保您至少启用了如上所示的 SSH。
sudo iptables -P INPUT DROP
通过输入链名称并选择 DROP 或 ACCEPT,也可以为其他链定义相同的策略规则。
保存和恢复规则
现在,如果您要重新启动云服务器,所有这些 iptables 配置都将被清除。为防止这种情况,请将规则保存到文件中。
sudo iptables-save > /etc/iptables/rules.v4
然后,您可以通过读取您保存的文件来简单地恢复保存的规则。
# 覆盖当前规则
sudo iptables-restore < /etc/iptables/rules.v4
# 添加新规则保持当前规则
sudo iptables-restore -n < /etc/iptables/rules.v4
您可以通过为 iptables 安装一个额外的包来在重新启动时自动执行恢复过程,该包会接管已保存规则的加载。为此,请使用以下命令。
sudo aptitude install iptables-persistent
安装后,初始设置将要求保存 IPv4 和 IPv6 的当前规则,只需选择Yes并按 Enter 即可。
如果您对 iptables 规则进行进一步更改,请记住使用与上述相同的命令再次保存它们。iptables-persistent 在/etc/iptables下查找文件rules.v4和rules.v6。
这些只是您可以与 iptables 一起使用的几个简单命令,它还有更多功能。继续阅读以检查可用于对 iptable 规则进行更高级控制的其他一些选项。
高级规则设置
根据基本的防火墙行为,规则是按照它们在每个链上列出的顺序读取的,这意味着您需要以正确的顺序放置规则。添加新规则会将它们添加到列表的末尾。您可以使用iptables -I -command将新规则添加到列表的特定位置,其中是您希望插入规则的订单号。要知道要输入哪个索引号,请使用以下命令。
sudo iptables -L --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 任何地方 ctstate RELATED,ESTABLISHED
2 ACCEPT tcp -- 任何地方 , dpt:ssh
3 ACCEPT tcp -- 任何地方 tcp dpt:http
每条规则行开头的数字表示在链中的位置。要在特定现有规则上方插入新规则,只需使用该现有规则的索引号。例如,要将新规则插入到链的顶部,请使用以下索引号为 1 的命令。
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
如果您希望从某个链中删除现有规则,请使用带有参数的删除命令-D。选择删除规则的最简单方法是使用上述索引号。例如,要删除输入链上的第二条规则,请使用此命令。
sudo iptables -D INPUT 2
也可以使用-F参数刷新特定链的所有规则甚至整个 iptables 。如果您怀疑 iptables 正在干扰您尝试的网络流量,或者您只是希望从干净的表重新开始配置,这将非常有用。
警告:确保在刷新任何链之前将默认规则设置为 ACCEPT。
sudo iptables -P INPUT ACCEPT
之后,您可以继续清除其他规则。请记住在刷新表之前将规则保存到文件中,以防您以后想恢复配置。
# 清除输入链
sudo iptables -F INPUT
# 刷新整个 iptables
sudo iptables -F
刷新iptable后,您的服务器可能容易受到攻击。确保使用替代方法保护您的系统,同时禁用 iptables,即使是暂时的。