Linux 如何为在本机上创建的 nat 网络设置不同于系统的默认路由的默认路由?

191 天前
 wniming

这里说的 nat 网络是指类似于 docker 服务创建的 docker0 接口,lxc-net 服务创建的 lxcbr0 接口,virtnetworkd 服务创建的 virbr0 接口,这些本质都是用来给虚拟机或容器用的网桥,默认情况下虚拟机或容器会使用系统的默认路由来连接互联网,但是我的系统的默认路由是走主路由的,主路由没有科学上网功能,我想让虚拟机或容器走带有科学上网功能的旁路由,有什么办法实现吗?

比如我的本机的 ip 是 192.168.1.2 ,主路由的 ip 是 192.168.1.1 ,科学上网旁路由的 ip 是 192.168.1.253 ,我可以用下面几条命令创建一个 nat 网络:

BRIDGE=nat-br
NETWORK=192.168.53.0
NETMASK=255.255.255.0
GATEWAY=192.168.53.1
DHCPRANGE=192.168.53.2,192.168.53.254

echo 1 > /proc/sys/net/ipv4/ip_forward

if [ ! -e /sys/class/net/$BRIDGE/bridge ] ; then
	ip link add name $BRIDGE type bridge
	ip addr add $GATEWAY/$NETMASK dev $BRIDGE
	ip link set $BRIDGE up
	
	iptables -t nat -I POSTROUTING -s $NETWORK/$NETMASK -j MASQUERADE
	iptables -t nat -A PREROUTING -p udp -i $BRIDGE --dport 53 -j DNAT --to-destination 192.168.1.253:53
	dnsmasq --interface=$BRIDGE --strict-order --except-interface=lo --listen-address=$GATEWAY --bind-interfaces --dhcp-range=$DHCPRANGE --dhcp-no-override
fi

如果系统的默认路由现在是 192.168.1.253 ,那么使用 nat-br 这个网桥的虚拟机或容器是能直接访问谷歌的,但我不想把系统的默认路由设置成 192.168.1.253 ,想保持为 192.168.1.1 ,同时又能达到让虚拟机或容器科学上网的效果

1650 次点击
所在节点    Linux
6 条回复
jinliming2
191 天前
prerouting 链,匹配 TCP/UDP 的源地址是容器的网段,转发到旁路由
wniming
191 天前
@jinliming2 感谢回复,我尝试加了下面这两条命令但是不起作用:
iptables -t nat -A PREROUTING -p tcp -s 192.168.53.0/24 -j DNAT --to-destination 192.168.1.253
iptables -t nat -A PREROUTING -p udp -s 192.168.53.0/24 -j DNAT --to-destination 192.168.1.253
jinliming2
191 天前
建议 TRACE 一下规则,看看匹配的对不对
druggo
191 天前
新建一个路由表,然后设置规则使用它就好了:
ip route add default via 192.168.1.253 dev eth0 table 110
ip rule add from 192.168.53.0/24 table 110
wniming
191 天前
@druggo 大佬牛逼,你的方法管用
wniming
191 天前
@druggo 刚刚发现这种方法会导致主机无法 ssh 到虚拟机,需要把 from 192.168.53.0/24 改成 iif nat-br 才可以

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1113675

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX