为何nftables的prerouting链会导致SSH连接失败?
我来帮你理清楚这个问题的根源哈~
首先咱们拆解下配置和问题的核心关联:
prerouting链的drop策略直接拦截了SSH流量
你的dnat_prerouting链设置了policy drop,这意味着所有进入prerouting NAT阶段的流量,如果没被链内的规则匹配到,就会直接被丢弃。
你目前在这个链里只配置了TCP 80端口的DNAT转发规则,而你的SSH流量(看input链的配置应该是用7749端口)完全匹配不到这条规则,所以还没等走到input链去执行那些放行SSH的规则,就被prerouting链的drop策略直接干掉了,自然连不上服务器。改成accept策略后能连接的原因
当你把prerouting链的policy改成accept,那些没被DNAT规则匹配的流量(比如你的SSH流量)就可以正常通过prerouting阶段,继续流转到input链。而你的input链已经配置了放行已建立/相关连接、lo接口,还有TCP 7749端口的规则,SSH流量能顺利通过这些检查,自然就能连上了。给你一个更安全的优化方案
其实不需要把prerouting链的policy改成全局accept(这样相当于让所有流量跳过DNAT检查,安全性有所降低),你只需要在dnat_prerouting链的最后添加一条accept规则,让不需要做DNAT的流量正常通过即可:chain dnat_prerouting { type nat hook prerouting priority dstnat;policy drop; tcp dport 80 dnat ip to 192.168.100.1:80 # 允许未匹配DNAT规则的流量通过prerouting阶段 accept }这样既保留了对80端口的DNAT转发,又不会丢弃其他正常流量,同时后续还有input链的过滤规则做安全保障,比直接改全局policy要稳妥得多。
备注:内容来源于stack exchange,提问作者xfuture johnson

