一周前,我安装了 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
除非您打算以后使用连接跟踪。
所有OUTPUT
(filter
)规则都可以被删除,因为只要该链的策略设置为,它们就不会执行任何操作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-restore
。iptables-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
,您将获得每个规则的相应计数器。