一些 NAT 的 iptables 配置示例没有提供有关转发 ICMP 数据包的信息,一些手册建议
-A FORWARD -i in -o out -p icmp -m icmp --icmp-type 8 -j ACCEPT
ufw 配置(即使它不用作路由器)在 filter.FORWARD 子链中有以下内容
ACCEPT icmp -- anywhere anywhere icmp destination-unreachable
ACCEPT icmp -- anywhere anywhere icmp source-quench
ACCEPT icmp -- anywhere anywhere icmp time-exceeded
ACCEPT icmp -- anywhere anywhere icmp parameter-problem
ACCEPT icmp -- anywhere anywhere icmp echo-request
那么什么是正确的?那么其他协议(如 igmp 等)又如何呢?
答案1
不要弄乱这些东西:NAT 用于地址转换,默认iptables
表filter
用于过滤数据包。
如果问题是:我需要哪个过滤器才能使 NAT 工作?答案是:没有。表之间没有这样的联系。当然,您需要添加规则才能使数据包流通您的系统,否则 NAT 组件将处于准备就绪但空闲状态(无过滤器 = 无数据包)。
因此,即使您禁止 ICMP 和其他协议,NAT 仍会工作。当然,一些 ICMP 消息对于使事情正常进行很有用(例如,路径 MTU 发现使用 ICMP,如果您阻止所有 ICMP 消息,连接将非常断开)。不过,这与 NAT 无关:即使您不使用 NAT 并且弄乱了表,也会遇到同样的问题filter
。
您可以在这里找到一些有关 ICMP 阻止的信息:http://shouldiblockicmp.com
简而言之,您可能希望允许:
- 回显请求/回复
- 需要碎片化
- 超出时间
在 IPv6 中您还需要允许 NDP 和 SLAAC。