iptables 将数据包从内部 ip 转发到外部 ip

iptables 将数据包从内部 ip 转发到外部 ip

我有一台 Linux 机器(用作路由器),有 3 个私有接口(eth1、eth2、eth3)和 1 个公共接口(eth0)。当数据包从接口 eth3 进入时,它应该通过 eth0 出去,而当回复返回到 eth0 时,它应该被重定向到 eth3。

通过在 iptables 中使用这些规则。

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth3 -m state  --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth3 -o eth0 -j ACCEPT

谁能指出我哪里犯了错误?

答案1

一般来说,路由决策不是基于接口规范(所有进入 eth3 的数据包都应通过 eth0 路由出去),而是基于要路由的 IP 数据包的目标地址。如果数据包携带的地址可通过 eth0 路由,则将通过 eth0 路由(可能还可通过 eth0 指定的网关路由)。

如果您的 eth0 后面的网络无法路由到其目标数据包要去的地方,则您只需要 MASQUERADE 或 SNAT 规则。在这种情况下,带有 MASQUERADE 目标的 POSTROUTING 规则会将传出的 IP 数据包的源地址重写为 eth0 的地址(这显然需要可路由或位于另一个 NAT 路由器后面)。MASQUERADE 目标基本上是一个状态规则,返回的回复数据包将根据维护的端口:地址映射表重写其目标地址。

您无需在此流量的 FORWARD 链中明确声明 ACCEPT 规则除了当您的默认 FORWARD 策略设置为 DROP 或您在转发链中使用 DROP/REJECT 规则时,这些规则会过滤此类流量。在后一种情况下,使用iptables -A不会有所帮助,因为它会插入新规则DROP/REJECT 规则已存在于链中。由于规则是按顺序评估的,并且具有最终数据包目的地目标(如 ACCEPT、DROP 或 REJECT)的第一个匹配规则最终决定数据包的命运,因此您的 ACCEPT 规则永远不会被命中。

您的调试选项:

  • 用来iptables -L FORWARD -v -n查看你的 ACCEPT 规则是否被命中(即数据包/字节计数器是否在递增) - 如果没有,则数据没有按照你认为的那样被路由
  • 在丢弃/拒绝数据包之前添加一条iptables -A FORWARD -j LOG规则,以便任何被拒绝的数据包都会被记录源/目标、输入/输出接口、协议和标志信息
  • tcpdump -v -n -i eth0 host <yourtestinghost>在通过 eth0 可达的网络上引入流量(如运行 ping)时运行<yourtestinghost>- 查看数据包是否传出,以及源地址是否按照 NAT/POSTROUTING 规则中的定义进行重写
  • 查看路由表,ip route查看是否存在到所需目标网络的有效路由via <yourISProuter> dev eth0,以及它是否被通过不同路由器/接口的更具体的路由所取代

相关内容