在 Linux 机器上,我创建了一个名为 gre1 172.17.1 -> 172.17.2 的 GRE 隧道。Linux 机器 IP 为 10.10.100.100,端点 IP 为 10.10.101.101。
我正在尝试做一个来源NAT(不是目标 NAT)将从 Linux 机器发出的流量通过隧道传输到实际到达隧道的目的地端口是 80。我尝试过以下步骤,但是都没有成功:
iptables -t nat -A OUTPUT -p tcp --dport 80 -j SNAT --to 172.17.1.1
iptables -t nat -A FORWARD -p tcp --dport 80 -j SNAT --to 172.17.1.1
我发现的大多数 GRE 隧道示例都是针对 DNAT,而不是 SNAT。有没有适合我的情况的示例?
答案1
如果我没看错的话,你希望端口 80 的流量通过你的隧道。这不是通过 SNAT 实现的,而是通过策略路由实现的。
首先我们需要设置一个新的路由表:
# echo "2 tunnel" >> /etc/iproute2/rt_tables
接下来我们需要设置路由表以通过隧道发送所有流量:
# ip route add default via 172.16.1.2 dev gre1 table tunnel
现在我们需要让一些流量使用该路由表而不是默认路由表。这可以通过标记数据包然后添加规则以对那些标记的数据包使用指定的表来实现:
# iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --mark 200
# ip rule add fwmark 200 table tunnel
如果您希望转发的流量通过隧道发送,请将 OUTPUT 替换为 FORWARD。这仅适用于使用 OUTPUT 本地生成的流量。
您可以在Linux 高级路由和流量控制 (LARTC)指导。