iptables 规则限制太多; Drupal Web 服务器无法访问存储库、NTP 甚至网站

iptables 规则限制太多; Drupal Web 服务器无法访问存储库、NTP 甚至网站

这是一个在 Linode 上运行 Ubuntu 12.04 LTS 的 Drupal 网站。最近有人更改了我们的 iptables 规则,并开始出现许多问题。

这些包括:

  1. 我们的 Mollom 垃圾邮件防护在 Drupal 站点上不起作用,因为服务器无法访问外部服务。 (更多详情见下文)

  2. Drupal 报告:“您的系统或网络配置不允许 Drupal 访问网页,导致功能减少。” (更多详情见下文)

  3. 服务器无法 ping 通互联网

    ping google.com
    ping:未知主机 google.com

  4. 其他网络服务失败。例如:

    $ sudo ntpdate ntp.ubuntu.com 退出,名称服务器无法使用:名称解析暂时失败 (-3) 6 月 1 日 16:42:34 ntpdate[7420]:无法使用名称服务器:名称解析暂时失败 (- 3)
    apt-get更新错误http://us.archive.ubuntu.comPrecision Release.gpg
    暂时无法解决“us.archive.ubuntu.com”Errhttp://security.ubuntu.comPrecision-security Release.gpg
    暂时无法解析“security.ubuntu.com”

  5. 服务器运行得很差。像下面这样的错误是否与由于 iptables 规则而无法访问互联网有关?

    内存不足:杀死进程 2300 (mysqld) 分数 129 或牺牲子进程 杀死进程 2300 (mysqld) Total-vm:354780kB, anon-rss:53180kB, file-rss:0kB 内存不足:杀死进程 5937 (mysqld) 分数 60或牺牲孩子杀死进程5937(mysqld)total-vm:344040kB,anon-rss:78988kB,file-rss:0kB

以下是 Drupal 错误的更详细信息。 Drupal 配置没有改变——只有 iptables 改变了:

1. HTTP 请求状态失败 您的系统或网络配置不允许 Drupal 访问网页,导致功能减少。这可能是由于您的网络服务器配置或 PHP 设置造成的,应该解决该问题,以便下载有关可用更新的信息、获取聚合器源、通过 OpenID 登录或使用其他依赖于网络的服务。如果您确定 Drupal 可以访问网页,但仍然看到此消息,您可以添加 $conf['drupal_http_request_fails'] = FALSE;到 settings.php 文件的底部。

2. Mollom API 密钥服务错误 无法验证 Mollom API 密钥。请稍后再试。此问题会阻止会员注册我们的网站或发表评论。

以下是当前(有问题的)iptables 规则。(顺便说一句,端口 2222 最初是 SSH 端口。现在有人将 SSH 改回端口 22,但显然在 iptables 中将端口 2222 保持打开,但这是另一个问题):

# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
fail2ban-apache-overflows  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
fail2ban-apache  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
DROP       all  --  69.30.238.162        0.0.0.0/0           
DROP       all  --  121.205.199.140      0.0.0.0/0           
DROP       all  --  137.117.129.250      0.0.0.0/0           
DROP       all  --  117.26.252.26        0.0.0.0/0           
DROP       all  --  112.111.165.71       0.0.0.0/0           
DROP       all  --  175.42.95.145        0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 state NEW,ESTABLISHED
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:2222 state NEW,ESTABLISHED
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443 state NEW,ESTABLISHED
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:2222

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spt:80 state ESTABLISHED
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spt:2222 state ESTABLISHED
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spt:443 state ESTABLISHED
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spt:2222

Chain fail2ban-apache (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

Chain fail2ban-apache-overflows (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0  

我的问题:由于我对fail2ban配置一无所知,我可以做哪些最小的更改来恢复基本功能(特别是对于传出服务,因为这些似乎是主要问题)?

更新:根据 Michael Kjörling 的回答,以下是更新的 iptables 规则。它是否正确?

# cat iptables.modified.rules 
# Generated by iptables-save v1.4.12 on Sat Jun  1 21:26:17 2013
*security
:INPUT ACCEPT [60016:6837978]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [60450:61970107]
COMMIT
# Completed on Sat Jun  1 21:26:17 2013
# Generated by iptables-save v1.4.12 on Sat Jun  1 21:26:17 2013
*raw
:PREROUTING ACCEPT [72450:7582406]
:OUTPUT ACCEPT [60450:61970107]
COMMIT
# Completed on Sat Jun  1 21:26:17 2013
# Generated by iptables-save v1.4.12 on Sat Jun  1 21:26:17 2013
*nat
:PREROUTING ACCEPT [7899:447793]
:INPUT ACCEPT [7787:439884]
:OUTPUT ACCEPT [5818:4357219]
:POSTROUTING ACCEPT [5818:4357219]
COMMIT
# Completed on Sat Jun  1 21:26:17 2013
# Generated by iptables-save v1.4.12 on Sat Jun  1 21:26:17 2013
*mangle
:PREROUTING ACCEPT [72450:7582406]
:INPUT ACCEPT [72450:7582406]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [60450:61970107]
:POSTROUTING ACCEPT [60450:61970107]
COMMIT
# Completed on Sat Jun  1 21:26:17 2013
# Generated by iptables-save v1.4.12 on Sat Jun  1 21:26:17 2013
*filter
:INPUT DROP [44:2387]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [78:41503]
:fail2ban-apache - [0:0]
:fail2ban-apache-overflows - [0:0]
-A INPUT -s 69.30.238.162/32 -j DROP
-A INPUT -s 121.205.199.140/32 -j DROP
-A INPUT -s 137.117.129.250/32 -j DROP
-A INPUT -s 117.26.252.26/32 -j DROP
-A INPUT -s 112.111.165.71/32 -j DROP
-A INPUT -s 175.42.95.145/32 -j DROP
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache
-A INPUT -i eth0 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m state --state RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A fail2ban-apache -j RETURN
-A fail2ban-apache-overflows -j RETURN
COMMIT
# Completed on Sat Jun  1 21:26:17 2013

答案1

OOM 杀手的出现很可能与您的问题有关,而且它绝对对您没有帮助。增加交换空间或安装更多 RAM。如果不出意外,您肯定不希望您的服务器不断终止进程;当内核 OOM 杀手开始寻找受害者时,坏的

也就是说,我确实注意到您不允许使用 ICMP 或基于 UDP(或 TCP)的 DNS。 Internet 上运行良好的主机需要接受 ICMP 数据包,如果您正在运行 DNS 服务器,则需要通过 TCP 和 UDP 打开端口 53 的通信才能使其正常工作。

一个最小的改变应该使您更符合合理的配置而不影响外部各方可用的服务可能是简单的

iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp -m state --state RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT

(未经测试,因此命令行语法可能略有偏差,但这就是要点。)

通常,出于性能原因,此类规则将位于或接近相关 iptables 链的顶部。这些将允许对服务器通过 TCP 或 UDP 以及 ICMP 消息发起的任何出站响应。请注意 ICMP 是至关重要的对于互联网上表现良好的主机;如果你想阻止例如ping,你可以使用很多更具体的规则来阻止 ICMP 回显请求,仅此而已,但是当您有众所周知的端口 80 完全开放时,这在实践中并没有给您带来太多好处,而且确实使故障排除变得更加复杂。

输出链规则也是多余的,因为它们不做链策略不做的事情。只是iptables -F OUTPUT为了删除它们;它们使配置变得复杂,并且每个传出数据包都会损失一点性能,而不会提供任何好处。他们还指定了大部分特权源端口,这几乎肯定与您想要的不匹配。

相关内容