这里说的 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 ,同时又能达到让虚拟机或容器科学上网的效果
1
jinliming2 11 小时 48 分钟前
prerouting 链,匹配 TCP/UDP 的源地址是容器的网段,转发到旁路由
|
2
wniming OP @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 |
3
jinliming2 11 小时 28 分钟前
建议 TRACE 一下规则,看看匹配的对不对
|
![]() |
4
druggo 10 小时 56 分钟前 ![]() 新建一个路由表,然后设置规则使用它就好了:
ip route add default via 192.168.1.253 dev eth0 table 110 ip rule add from 192.168.53.0/24 table 110 |