我最近在家用服务器上安装了 Oracle Linux 6,但一直无法允许端口通过防火墙 (iptables)。我尝试使用以下命令添加端口
iptables -I INPUT -p tcp --dport 80 -s 192.168.0.0/24 -j ACCEPT
我当前的规则配置是:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.0.0/24 anywhere tcp dpt:ldap
ACCEPT tcp -- 192.168.0.0/24 anywhere tcp dpt:x11
ACCEPT tcp -- 192.168.0.0/24 anywhere tcp dpt:vnc-server
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
ACCEPT tcp -- anywhere anywhere tcp dpt:http
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
但是我无法从网络上的任何设备(所有设备都以 192.168.0.* 开头)访问这些端口(ssh 除外,它显然是自动配置的)。如果我刷新表(iptables -F),所有连接都可以正常工作。我已保存并重新加载表。有什么想法可以解释为什么它不起作用吗?
答案1
iptables
按顺序按照每条规则处理数据包。您正在附加规则以接受 HTTP 流量后拒绝所有流量的规则:
Chain INPUT (policy ACCEPT)
target prot opt source destination
...
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
ACCEPT tcp -- anywhere anywhere tcp dpt:http
如果数据包与前面的任何规则都不匹配,它就会到达这里。如果这是到 SSH 的新 TCP 连接,它就会匹配第一条规则。如果不是(例如,如果这是 HTTP 数据包),它会继续执行下一条规则,该规则会拒绝任何到目前为止尚未匹配的流量。因此,最后一个规则永远不会被匹配,因为任何新的 HTTP 流量都已被前一个规则拒绝。
我不确定 Oracle Linux 建议您如何配置防火墙规则(例如,Ubuntu 鼓励使用ufw
)。一个简单的方法是在REJECT
(iptables -I INPUT $INDEX
,其中$INDEX
是规则的索引REJECT
)之前插入 HTTP 规则。另一个更符合“精神”的方法iptables
是删除显式REJECT
规则并将默认策略更改为REJECT
。这会导致对任何未与规则匹配的数据包隐式拒绝,因此您只需将ACCEPT
s 附加到末尾,而不必担心将它们放在显式 之前REJECT
。