我有一个 iptable 规则文件,在 INPUT 链上我有
-A INPUT -i em1 -p tcp -m tcp --dport 54000 -j ACCEPT
-A INPUT -i em1 -p tcp -m tcp --dport 30000 -j ACCEPT
-A INPUT -i em1 -p udp -m udp --dport 54000 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES
-A INPUT -p icmp -j ACCEPT
然后我iptables-restore < rule_file
在端口 30000 上启动了一个 UDP 服务器,这不是允许的 UDP 端口54000
,但 UDP 服务器仍然在 30000 上接收传入的 UDP 数据包,这有什么问题?
顺便说一句iptables -L -n
,我得到:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:54000
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:30000
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:54000
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ES
TABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
INPUT_direct all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0
我使用另一台机器的 nmap 来探测这台机器
nmap -port 30000
或者
nmap -port 54000
结果显示这两个端口被关闭了!
答案1
Chain INPUT (policy ACCEPT)
你的规则永远不匹配,因为你接受了一切
检查匹配的数据包:
iptables -nvL
编辑 etagenklo:iptables 从上到下检查链中的所有规则。如果没有规则与您的数据包匹配,iptables 将执行链中定义的策略(在您的例子中,这是 ACCEPT)
要更改您的政策:iptables -P CHAIN RULE
iptables -P INPUT DROP
答案2
请记住,当您使用 nmap/telnet 探测端口并收到“关闭”或“连接被拒绝”或类似错误时,这意味着您可能没有允许该端口,或者您允许该端口但没有服务在其上监听。
我个人会这样写规则:
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT //if you want allow "familiar" packets
-A INPUT -p icmp -j ACCEPT
-A INPUT -i em1 -p tcp -m tcp --dport 54000 -j ACCEPT //the interface is optional if your pc has only one network card
-A INPUT -i em1 -p tcp -m tcp --dport 30000 -j ACCEPT
-A INPUT -i em1 -p udp -m udp --dport 54000 -j ACCEPT
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES
答案3
将链的策略更改为 DROP:
iptables -P INPUT DROP
当然,你必须确保你需要的一切都有一个接受规则。
解释:
iptables 将检查链内的所有规则,看它们是否与您的数据包匹配。如果没有匹配的规则,则执行链中的策略。
所以这应该是防火墙的标准配置:您希望它接受规则中指定的所有内容并丢弃其他所有内容。