我想将所有来自互联网的数据包转发到 tun0。快速方案:
internet <-> eth0 (10.68.195.23) <-> tun0 (10.68.195.78) <-> 本地程序。
目前我正在使用 ROUTE 目标来实现这一点。>
iptables -A PREROUTING -t mangle -p tcp -s 10.68.195.78 -j ROUTE --oif eth0
iptables -A PREROUTING -t mangle -p tcp -d 10.68.195.78 -j ROUTE --oif tun0
然后我了解到 ROUTE 目标支持已从内核 2.6.32(iptables 1.4.8)中删除
经过一些快速搜索后发现,使用标记也可以实现这一点,但不确定如何做。
iptables -t mangle -A PREROUTING -i eth0 xxx -j MARK --set-mark 1
ip 规则添加 fwmark 1 表 (nb?)
顺便说一句,我正在运行带有安全更新的 Debian squeeze。
约翰尼艾伦
答案1
在两个接口上使用相同的网络地址会带来麻烦。我会重新编号 tun0 网络,然后设置 NAT 来处理后果。将 tun0 设置在 192.168.0.1(本地)和 192.168.0.2(远程)之间:
iptables -t nat -I PREROUTING -d 10.68.195.78 -j DNAT --to-dest 192.168.0.2
这仍然要求 10.68.195.78 的数据包到达此主机,因此此网络上的所有主机(或至少是那些需要联系另一端的盒子的主机)都需要
ip r a 10.68.195.78 via 10.68.195.23
或者,您可以使用代理 ARP,但这通常很混乱。
此外,另一端的盒子需要有其默认路由指向隧道,以便返回的数据包以相同的方式传输;您还可以在 POSTROUTING 中添加 SNAT 规则,以使所有连接都显示为来自另一个隧道端点的另一个盒子:
iptables -t nat -I POSTROUTING -d 10.68.195.78 -j SNAT --to-source 192.168.0.1