我有一个运行 Debian 7 的小型 VPS 实例(用于网络托管),几周来我的防火墙和连接跟踪一直出现问题。几个月来我都没有遇到任何问题,但如果我没有进行任何系统修改,iptables 的连接跟踪工具就会停止工作(我怀疑我的提供商进行了内核更新,但他们找不到任何解决方案来解决我的问题)。
现在,我的 iptables 配置中的状态相关规则不再匹配。我不能再使用 ESTABLISHED、RELATED 或 NEW 状态。创建这些规则时没有错误,但似乎没有数据包与它们匹配。这是我的 iptables 配置文件:
*filter
# Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT
# Log all ESTABLISHED,RELATED
-A INPUT -m state --state ESTABLISHED,RELATED -m limit --limit 20/min -j LOG --log-prefix "iptables: EST,REL: " --log-level 1
-A OUTPUT -m state --state ESTABLISHED,RELATED -m limit --limit 20/min -j LOG --log-prefix "iptables: EST,REL: " --log-level 1
# Log all UDP
#-A INPUT -p udp -m limit --limit 60/min -j LOG --log-prefix "iptables: UDP IN : " --log-level 1
-A OUTPUT -p udp -m limit --limit 60/min -j LOG --log-prefix "iptables: UDP OUT: " --log-level 1
# Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# Allow SSH connections
-A INPUT -p tcp --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -j ACCEPT
# Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables: DENIED : " --log-level 4
# Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP
COMMIT
我添加了可以取消注释的日志记录规则,以捕获已建立的连接,但它们无效,并且所有传入数据包都被我的配置文件的最后几行丢弃。以下是当我尝试进行简单的 ping 时日志文件中发生的情况的示例,需要进行 DNS 解析:
Jun 13 09:19:37 vpsname kernel: [4624558.917291] iptables: UDP OUT: IN= OUT=venet0 SRC=**.**.**.** DST=208.67.222.222 LEN=73 TOS=0x00 PREC=0x00 TTL=64 ID=57693 DF PROTO=UDP SPT=37992 DPT=53 LEN=53
Jun 13 09:19:37 vpsname kernel: [4624558.918373] iptables: DENIED : IN=venet0 OUT= MAC= SRC=208.67.222.222 DST=**.**.**.** LEN=110 TOS=0x00 PREC=0x00 TTL=56 ID=0 DF PROTO=UDP SPT=53 DPT=37992 LEN=90
Jun 13 09:19:42 vpsname kernel: [4624563.927318] iptables: UDP OUT: IN= OUT=venet0 SRC=**.**.**.** DST=208.67.220.220 LEN=73 TOS=0x00 PREC=0x00 TTL=64 ID=62698 DF PROTO=UDP SPT=49607 DPT=53 LEN=53
Jun 13 09:19:42 vpsname kernel: [4624563.928263] iptables: DENIED : IN=venet0 OUT= MAC= SRC=208.67.220.220 DST=**.**.**.** LEN=110 TOS=0x00 PREC=0x00 TTL=56 ID=0 DF PROTO=UDP SPT=53 DPT=49607 LEN=90
Jun 13 09:19:47 vpsname kernel: [4624568.936369] iptables: UDP OUT: IN= OUT=venet0 SRC=**.**.**.** DST=208.67.222.222 LEN=73 TOS=0x00 PREC=0x00 TTL=64 ID=57694 DF PROTO=UDP SPT=37992 DPT=53 LEN=53
Jun 13 09:19:47 vpsname kernel: [4624568.937441] iptables: DENIED : IN=venet0 OUT= MAC= SRC=208.67.222.222 DST=**.**.**.** LEN=110 TOS=0x00 PREC=0x00 TTL=56 ID=0 DF PROTO=UDP SPT=53 DPT=37992 LEN=90
Jun 13 09:19:52 vpsname kernel: [4624573.946415] iptables: UDP OUT: IN= OUT=venet0 SRC=**.**.**.** DST=208.67.220.220 LEN=73 TOS=0x00 PREC=0x00 TTL=64 ID=62699 DF PROTO=UDP SPT=49607 DPT=53 LEN=53
Jun 13 09:19:52 vpsname kernel: [4624573.947343] iptables: DENIED : IN=venet0 OUT= MAC= SRC=208.67.220.220 DST=**.**.**.** LEN=110 TOS=0x00 PREC=0x00 TTL=56 ID=0 DF PROTO=UDP SPT=53 DPT=49607 LEN=90
最后,我安装了 conntrack 命令,当我执行它时,我看到每个数据包都被标记为无效。
sudo conntrack -S
entries 0
searched 0
found 0
new 0
invalid 51181
ignore 0
delete 0
delete_list 0
insert 0
insert_failed 0
drop 0
early_drop 0
icmp_error 17
expect_new 0
expect_create 0
expect_delete 0
我真的不知道该怎么办,我的 VPS 提供商也不知道。你们有人知道如何解决这个问题吗?目前,如果我想在我的 VPS 上从互联网上下载任何东西,我必须在防火墙中打开端口。这不是一个安全的解决方案。
在此先感谢您的帮助。
答案1
您是否有权访问物理 OpenVZ 节点?如果是,则应使用以下命令启用连接跟踪:vzctl set XXX --netfilter stateful --save
并重新启动容器:vzctl restart XXXX
其中 XXX 是您的容器 ID。
如果您无权访问物理服务器,您可以将此命令发送给您的管理员或托管服务提供商,因为如果没有物理节点端的配置,您将无法使用 statefull iptables。
答案2
我们刚刚在自己管理的旧 Proxmox 主机上遇到了非常类似的问题:它 conntrack
突然停止为新容器工作,而为我们刚刚关闭的容器工作。主机本身很长时间没有重新启动。
最终,根本问题似乎是模块iptables_nat
必须被容器允许(我们在 中启用了它/etc/vz/vz.conf
)才能conntrack
工作。去想想吧。