我正在配置一台服务器,并尝试制定一些我认为非常简单的 iptables 规则:
[root host ~]
- iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere loopback/8 reject-with icmp-port-unreachable
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT icmp -- anywhere anywhere icmp echo-request
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root host ~]
- iptables -P INPUT DROP
这导致我的 SSH 会话挂起。现在我根本无法通过 SSH 访问机器,但所有其他权限(HTTP 等)似乎都运行正常。
事后我又做了一些研究,但对我来说这仍然看起来是一个正确的配置。
我觉得我误解了 iptables 提供的过滤功能。是这样的吗?这张图片有什么问题?
编辑:我修改了我的规则debian iptables 文章,这样您就可以在那里看到原始的输入行。
双重编辑:我应该在这里做一些准备工作;我已经重新创建了 Debian 文章中的原始输入
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
答案1
这条规则相当可疑:
REJECT all -- anywhere loopback/8 reject-with icmp-port-unreachable
除非您确保它不适用于环回接口(lo),否则它可能会破坏各种各样的东西。
答案2
事实证明问题出在我的第二条规则上:
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
我愚蠢地没有仔细检查 VPS 上的接口,而且由于它是基于 OpenVZ 的,内部 vm 接口的地址为 127.0.0.2,但从技术上讲并不是环回,从而触发了此规则。
编辑:不,我又错了!最终发现,我的 VPS 允许插入基于状态的规则,但从未匹配它们,因此当我将策略设置为 DROP 时,已建立的连接被丢弃。