Iptables 规则不再适用

Iptables 规则不再适用

一周前,我安装了 Ubuntu Server 64 位 14.04。它运行良好,运行了一到几天,然后突然间,iptables 变得毫无意义(我注意到 FTP 等都关闭了)。只有端口 22、25 和 80 是开放的。iptables -S看起来不错,但由于某种原因,不再受尊重。刷新和所有端口均未打开,只有 22、25 和 80。未安装网络管理器(我也验证了这一点)。我没有其他防火墙……我不明白吗?

/etc/network/interfaces

auto lo
iface lo inet loopback

auto em1
iface em1 inet static
        address XX.15.191.XXX
        netmask 255.255.255.240
        gateway XX.15.191.XXX
        dns-nameservers XX.105.28.XX

pre-up iptables-restore < /etc/iptables.rules
post-down iptables-restore > /etc/iptables.downrules

/etc/hosts

127.0.0.1       localhost
127.0.1.1       MY-SERVER.ph.cox.net   MY-SERVER
XX.15.191.XXX   mysite.com

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

/etc/hostname

MY-SERVER

/etc/resolv.conf(不是我的设置,如果我理解正确则自动设置):

nameserver XX.105.28.XX

/etc/iptables.rules

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [19969:30829963]# <--- not sure where this came from?
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --mask 255.255.255.255 --rsource
-A INPUT -m recent --update --seconds 90 --hitcount 4 --rttl --name SSH --mask 255.255.255.255 --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
#-A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A INPUT -p tcp -d 0/0 -s 0/0 --dport 5900 -j ACCEPT
#-A INPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A INPUT -p udp -m udp --dport 5900 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A INPUT -p icmp -m limit --limit 10/sec -j ACCEPT
-A FORWARD -p icmp -m limit --limit 10/sec -j ACCEPT
-A INPUT -j DROP
-A OUTPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
#-A OUTPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT

这是启动后唯一值得注意的现象dmesg,但由于我在 IP4 上,所以似乎没有关系,而且它可以工作 1 到 3 天。

IPv6: ADDRCONF(NETDEV_UP): em1: link is not ready

dmesg | grep eth0

[    3.787227] e1000e 0000:00:19.0 eth0: registered PHC clock
[    3.787228] e1000e 0000:00:19.0 eth0: (PCI Express:2.5GT/s:Width x1) c8:60:00:24:ea:cc
[    3.787229] e1000e 0000:00:19.0 eth0: Intel(R) PRO/1000 Network Connection
[    3.787281] e1000e 0000:00:19.0 eth0: MAC: 10, PHY: 11, PBA No: FFFFFF-0FF
[    5.219089] systemd-udevd[157]: renamed network interface eth0 to em1

sudo lsof -i -s tcp:listen (按要求输出)

sshd     960        root    3u  IPv4    564      0t0  TCP *:ssh (LISTEN)
sshd     960        root    4u  IPv6    566      0t0  TCP *:ssh (LISTEN)
mysqld  1011       mysql   12u  IPv4    602      0t0  TCP localhost:mysql (LISTEN)
exim4   2001 Debian-exim    3u  IPv4  11966      0t0  TCP localhost:smtp (LISTEN)
exim4   2001 Debian-exim    4u  IPv6  11967      0t0  TCP localhost:smtp (LISTEN)
exim4   2001 Debian-exim    5u  IPv4  11968      0t0  TCP mysite.com:smtp (LISTEN)
searchd 2025        root    7u  IPv4  14510      0t0  TCP *:9312 (LISTEN)
proftpd 2041     proftpd    2u  IPv6  11974      0t0  TCP *:ftp (LISTEN)
apache2 2103        root    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 3882    www-data    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 4230    www-data    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 etc, etc...

sudo lsof -i -s tcp:listen ( ftp 工作正常 1 周后,端口突然被阻止)

sshd     960        root    3u  IPv4    564      0t0  TCP *:ssh (LISTEN)
sshd     960        root    4u  IPv6    566      0t0  TCP *:ssh (LISTEN)
mysqld  1011       mysql   12u  IPv4    602      0t0  TCP localhost:mysql (LISTEN)
exim4   2001 Debian-exim    3u  IPv4  11966      0t0  TCP localhost:smtp (LISTEN)
exim4   2001 Debian-exim    4u  IPv6  11967      0t0  TCP localhost:smtp (LISTEN)
exim4   2001 Debian-exim    5u  IPv4  11968      0t0  TCP mysite.com:smtp (LISTEN)
searchd 2025        root    7u  IPv4  14510      0t0  TCP *:9312 (LISTEN)
apache2 2103        root    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 4151    www-data    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 4710    www-data    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 etc, etc...

sudo nmap -O mysite.com ( ftp 工作正常 1 周后,端口突然被阻止)

20/tcp   closed ftp-data
21/tcp   closed ftp
22/tcp   open   ssh
25/tcp   open   smtp
53/tcp   closed domain
80/tcp   open   http
143/tcp  closed imap
443/tcp  closed https
993/tcp  closed imaps
3306/tcp closed mysql
4444/tcp closed krb524
5900/tcp closed vnc

sudo iptables-save (按要求输出)

# Generated by iptables-save v1.4.21 on Tue May 27 20:39:05 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17351423:29122270850]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --mask 255.255.255.255 --rsource
-A INPUT -m recent --update --seconds 90 --hitcount 4 --rttl --name SSH --mask 255.255.255.255 --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A INPUT -p udp -m udp --dport 5900 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A INPUT -p icmp -m limit --limit 10/sec -j ACCEPT
-A INPUT -j DROP
-A FORWARD -p icmp -m limit --limit 10/sec -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT
# Completed on Tue May 27 20:39:05 2014

ifconfig(按要求输出)

em1       Link encap:Ethernet  HWaddr c8:60:00:24:ea:cc  
          inet addr:XX.15.191.XXX  Bcast:XX.15.191.XXX  Mask:255.255.255.240
          inet6 addr: fe80::ca60:ff:fe24:eacc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19212799 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24791186 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:6488896548 (6.4 GB)  TX bytes:29719279878 (29.7 GB)
          Interrupt:20 Memory:f7d00000-f7d20000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:4415657 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4415657 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:573695629 (573.6 MB)  TX bytes:573695629 (573.6 MB)

答案1

好吧,我想我们不可能一下子就搞清楚。所以我会边做边修改我的答案。到目前为止的数据表明没有理由iptables不工作。查看我要求您提供的输出中(可能)相关的行lsof,您应该只看到您提到的端口:

仅开放 22、25 和 80 等特定端口

开放,其他端口关闭。但是,您应该看到开放的 21、22、80 和 9312。其他端口上没有服务正在监听(输出的精简版本sudo lsof -i -s tcp:listen):

sshd     960        root    3u  IPv4    564      0t0  TCP *:ssh (LISTEN)
sshd     960        root    4u  IPv6    566      0t0  TCP *:ssh (LISTEN)
exim4   2001 Debian-exim    5u  IPv4  11968      0t0  TCP mysite.com:smtp (LISTEN)
searchd 2025        root    7u  IPv4  14510      0t0  TCP *:9312 (LISTEN)
proftpd 2041     proftpd    2u  IPv6  11974      0t0  TCP *:ftp (LISTEN)
apache2 2103        root    4u  IPv6  11992      0t0  TCP *:http (LISTEN)
apache2 ????    www-data    4u  IPv6  11992      0t0  TCP *:http (LISTEN)

好的,已经确定了(即它们处于打开状态,但没有任何东西在监听)。我们应该研究一下您如何尝试确定端口是否打开。正常方法是nmap从外部世界运行。Nmap 还能够根据情况区分打开、过滤和关闭。

我想到的一件事是,如果你使用 tcpwrappers,/etc/hosts.deny并且/etc/hosts.allow也会发挥作用而不会iptables干扰。


可以简化

此外,您的规则可以简化。

代替:

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

经过:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

除非您打算以后使用连接跟踪。

所有OUTPUTfilter)规则都可以被删除,因为只要该链的策略设置为,它们就不会执行任何操作ACCEPT

你可能想要添加UDP 上的 DNS 规则,因为 UDP 是默认规则。它看起来如下:

-A INPUT -p udp -m udp --dport 53 -j ACCEPT

现在,所有端口名称都可以通过使用来自的名称来转换为更易读的形式,/etc/services从而

-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT # <-- added this one
-A INPUT -p udp -m udp --dport 5900 -j ACCEPT

可以浓缩为更易读的两行代码:

-A INPUT -p tcp -m multiport --dports ftp-data,ftp,ssh,smtp,domain,www,imap2,https,imaps,mysql,4444,5900,9312
-A INPUT -p udp -m multiport --dports domain,5900

借助multiport模块

所有适合格式的规则iptables-restore变为:

*filter
:INPUT ACCEPT
:FORWARD ACCEPT
:OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
-A INPUT -m recent --update --seconds 90 --hitcount 4 --rttl --name SSH -j DROP
-A INPUT -p tcp -m multiport --dports ftp-data,ftp,ssh,smtp,domain,www,imap2,https,imaps,mysql,4444,5900,9312
-A INPUT -p udp -m multiport --dports domain,5900
-A INPUT -p icmp -m limit --limit 10/sec -j ACCEPT
-A INPUT -j DROP
-A FORWARD -p icmp -m limit --limit 10/sec -j ACCEPT
COMMIT

顺便说一句,将这些规则导入到 的调用中将iptables-restore --test显示任何语法错误。这通常对于您将规则输入为适合iptables-restore或 的格式的所有情况都非常有用iptables-apply

奖励:变体

您可以使用ipset(8)( apt-get install ipset) 也用于维护端口列表。这还可用于其他用途,例如,如果您有一组针对这些区域的 (CIDR) 网络规范,则可以锁定整个地理区域。请参阅

当然,您也可以将 IP 集作为源或目标地址以及地址/端口组合进行匹配。有关更多信息,请参阅手册 ( man ipset) 并查看 中的set模块和SET目标(比上一个模块低很多)描述man iptables-extensions

最后但并非最不重要的一点:如果您有 IPv6 连接,您可能需要在给出协议特定规则的行之前分别添加前缀-6-4。这样,您可以使用单个文件来存储和的规则ip6tables-restoreiptables-restore两者之间共享的规则应该不是携带前缀。

例如,撰写本文时的精简规则可以用于 IPv4 和 IPv6。通常只有地址、网络掩码等内容才需要您在 IPv4 和 IPv6 之间拆分规则。另外:IP 集只能是 IPv4(默认)或 IPv6(ipset create foo family inet6),这意味着由于名称不同,此类集也需要拆分规则。


您还含蓄地问道:

:OUTPUT ACCEPT [19969:30829963]# <--- not sure where this came from?

括号之间的数字是链的计数器。使用iptables-restore(或其 IPv6 对应项)时,这些是可选的。冒号前是数据包数,冒号后是字节数。如果使用iptables-save开关运行-c,您将获得每个规则的相应计数器。

相关内容