如何在 Ubuntu 上使用 iptables 设置出口规则?
答案1
我试图在那里找到有关出口规则和 iptables 的信息,但这些信息要么不完整,要么不准确。经过一番搜索并多次断开 ssh 会话后,我终于找到了答案,并想在 ServerFault 上分享它。
出口规则是任何安全策略的关键,并且是满足许多安全标准(例如 PCI DSS)所必需的。
注意:此处的命令假设基于 Debian 的发行版(例如 Ubuntu 服务器)。iptables 命令在各个发行版之间应该相同,但请查看您自己的发行版的参考指南以了解如何保存和加载 iptables,因为这些步骤会有所不同。如果有人想将其 wiki 化并添加 RH 或其他发行版差异,那就去做吧。
在以下示例中,我们将为仅需要获取软件包更新的服务器设置相当常见的规则。请记住,这些命令区分大小写,并且您输入它们的顺序就是它们被评估的顺序(即,如果您通过 SSH 连接,请不要先执行 -A OUTPUT -j REJECT)。
示例规则集
sudo iptables -A OUTPUT -o lo -p all -j ACCEPT
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -d security.ubuntu.com -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -d us.archive.ubuntu.com -j ACCEPT
sudo iptables -A OUTPUT -j REJECT
重要提示:除非您已输入 security.ubuntu.com 或 us.archive.ubuntu.com 规则,否则请勿添加/etc/hosts
它们(但请参阅有关打开 DNS 查询的“其他出口规则”)。请记住,iptables 将在应用规则时评估这些地址的 IP。因此,如果 ubuntu 更改了这些地址,您需要重新创建这些规则或重新启动计算机(规则在启动时应用)。
让我们看一下每条规则:
本地接口规则
sudo iptables -A OUTPUT -o lo -p all -j ACCEPT
这是在添加一个条目,表示我们应该接受任何想要在本地 (127.0.0.1) 接口上出站的流量。一些应用程序使用此接口来交换信息,我们不想破坏它们。
秘诀规则(已建立/相关会议)
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
这是经常被遗忘的规则,导致会话断开和混乱。这意味着允许与已建立的会话或与已建立的会话相关的出站流量。例如,如果您的服务器上有 SSH,您可以打开端口 22 入站,但服务器将如何将数据发送回客户端(这甚至可能建议使用备用更高端口进行后续通信)?这就是此规则允许的。
允许 Ubuntu apt-get 更新
sudo iptables -A OUTPUT -p tcp --dport 80 -d security.ubuntu.com -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -d us.archive.ubuntu.com -j ACCEPT
这些规则只是告诉 iptables 允许流量进入 ubuntu 更新服务器的端口 80。这些规则可能因您所在的地区而异,并且可能还有更多规则,因此您必须apt-get update
在执行此操作后执行以确保它适合您。重要提示:如前所述,请勿在未先将相应 IP 的映射条目放入 中的情况下启用此规则/etc/hosts
。此外,如果 Ubuntu 更改了这些 IP,您将需要更新主机条目并重新启动或重新创建这些规则,因为 iptables 在应用规则时会评估地址。
“杀手”规则
sudo iptables -A OUTPUT -j REJECT
这是一条可以阻止所有其他流量的规则。这绝对应该是您链中的最后一条规则,否则其他规则将不起作用。
别忘了做以下事情:
sudo sh -c “iptables-save >/etc/iptables.rules”
如果您想保留规则,然后添加:
pre-up iptables-restore < /etc/iptables.rules
在 的接口 (eth0 或其他) 下/etc/network/interfaces
。
其他出口规则
要允许“ping”工作(从服务器):
sudo iptables -A OUTPUT -p icmp --icmp echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp echo-reply -j ACCEPT
允许 DNS 工作(从服务器)。请注意,添加这些意味着您不必/etc/hosts
在上面的示例中使用,但可以说不太安全。
sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
要允许 NTP 时间同步客户端:
sudo iptables -A OUTPUT -p udp -m owner --uid-owner systemd-timesync -j ACCEPT
(欢迎添加)