你如何设置iptables的出口规则(在Ubuntu上)?

如何在Ubuntu上使用iptables设置出口规则?

注意:我从之前的一个条目中移除了这个错误,我错误地创build了一个社区Wiki条目。

我试图find有关出口规则和iptables的信息,但信息不完整或不准确。 经过几次挖掘并断开了我的ssh会话,我想了一下,并认为我会在ServerFault上分享它。

出口规则是任何安全策略的关键,并且需要满足许多安全标准(如PCI DSS)。

注意:这里的命令假设一个基于Debian的发行版(例如,Ubuntu服务器)。 iptables命令应该是相同的分布,但检查你自己的发行版的参考指南如何保存和加载iptables的步骤不同。 如果有人想弄明白这一点,并添加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条目添加内容。 请记住,在应用规则时,iptables将评估这些地址的IP。 所以,如果Ubuntu更改这些地址,则需要重新创build这些规则或重新启动计算机(规则在启动时应用)。

让我们来看看这些规则:

本地接口规则

 sudo iptables -A OUTPUT -o lo -p all -j ACCEPT 

这是添加一个条目,说我们应该接受任何想要出站在本地(127.0.0.1)接口的stream量。 有些应用程序使用这个接口来交换信息,我们不想破坏这些信息。

秘密酱油规则(已build立/相关会话)

 sudo iptables -A OUTPUT -m state --state RELATED, ESTABLISHED -j ACCEPT 

这是经常被遗忘的规则,导致会议断开和混乱。 这说的是允许与已build立的会话相关联的出站stream量或与已build立的会话相关的出站stream量。 例如,如果您的服务器上有SSH,则可以打开端口22,但是服务器如何将数据发送回客户端(甚至可能会为后续通信build议备用的更高端口)? 这是这个规则允许的。

允许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允许stream量进入Ubuntu的更新服务器端口80。 这些可能根据您所在的地区不同而有所不同,而且可能会有更多的不同,因此您必须在执行此操作后执行apt-get update ,以确保其适用于您。 重要提示:正如我之前提到的,不要先启用这个规则,不要先在/etc/hosts映射适当IP的条目。 另外,如果Ubuntu更改这些IP,则需要更新主机条目,并重新启动或重新创build这些规则,因为当规则应用时,iptables将评估地址。

“杀手”规则

 sudo iptables -A OUTPUT -j REJECT 

这是杀死所有其他stream量的规则。 这绝对应该是你链条中的最后一条规则,否则其他规则将不起作用。

不要忘记做:

 sudo sh -c “iptables-save >/etc/iptables.rules” 

如果你想保持规则,然后添加:

 pre-up iptables-restore < /etc/iptables.rules 

/etc/network/interfaces下的接口(eth0或其他)下。

其他出口规则

允许“ping”工作(从服务器):

 sudo iptables -A OUTPUT -p icmp --icmp echo-request -j ACCEPT sudo iptables -A OUTPUT -p icmp --icmp echo-reply -j ACCEPT 

允许DNS(从服务器)工作:

 sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT 

(随意添加)