背景信息:我有一台装有 VMware Workstation Pro 17 的 Windows 10(即将升级为 11)工作笔记本电脑。这台笔记本电脑通过以太网连接到我的家庭网络,并通过 Cisco AnyConnect VPN 连接到我的工作网络。我有一台基于 Debian 的虚拟机,我通过 VMware 工作站向其添加了两个网络接口(一个是 NAT,另一个是桥接)。eth0
是 NAT,它成功连接并允许我访问工作网络和互联网上的设备(其 IP 在主机上 VMware 网络适配器的范围内);eth1
是桥接的,它成功连接并在我的家庭网络空间中有一个 IP,我可以访问互联网(并且不会被工作防火墙等阻止)。
目标:我希望将我的虚拟机配置为默认使用eth1
(工作阻止访问我的个人网站,我有笔记等)。但是,仍然有很多情况下我需要运行可以访问工作站点和资源的工具,因此我希望有一个选项可以从使用的环境运行工具eth0
。与手动更新或添加手动路由相比/etc/hosts/
,网络命名空间的概念似乎非常适合我的场景,因此我尝试为任何与工作相关的流量创建一个网络命名空间。
我尝试过的方法:我尝试了几种不同的设置命名空间的指南(https://josephmuia.ca/2018-05-16-net-namespaces-veth-nat/);这个特别有用。但是,我认为我可能遗漏了一些东西,因为我遇到了两个问题:
- 当我使用
veth
连接网络命名空间时,我能够成功让单独的网络命名空间访问互联网和我的工作网络,但默认/根命名空间仍然默认为eth0
。因此,我尝试删除的默认路由eth0
(这会破坏新命名空间中的网络访问),并尝试将默认路由上的度量更改为更低eth1
(以便它具有优先级),但这也破坏了网络命名空间中的访问。 - 我尝试
eth0
直接进入网络命名空间而不是使用virtual-eth
对,但似乎无法使网络堆栈工作,添加路由,iptables 在命名空间中看起来很好,但 DHCP 不会分配 IP,如果我手动分配它仍然不起作用。
以下是有关运行的命令的更多详细信息。用于配置命名空间:
ip netns add ns
ip netns exec ns ip link set lo up
ip link add veth-default type veth peer name veth-ns
ip link set veth-ns netns ns
ip addr add 10.0.3.1/24 dev veth-default
ip netns exec ns ip addr add 10.0.3.2/24 dev veth-ns
ip link set veth-default up
ip netns exec ns ip link set veth-ns up
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -o eth0 -i veth-default -j ACCEPT
iptables -A FORWARD -i eth0 -o veth-default -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.3.2/24 -o eth0 -j MASQUERADE
ip netns exec ns ip route add default via 10.0.3.1
上面的方法一开始效果很好,但是如上所述,更改默认命名空间中的路由会破坏它,运行时我会列出两条默认路由ip route
default via 192.168.109.2 dev eth0 proto dhcp src 192.168.109.128 metric 100
default via 192.168.1.1 dev eth1 proto dhcp src 192.168.1.36 metric 101
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.36 metric 101
192.168.109.0/24 dev eth0 proto kernel scope link src 192.168.109.128 metric 100
当我删除第一条路由并将其以度量 102 重新添加时,它破坏了命名空间(并且它最终以度量 100 重新添加,并且有 3 条默认路由)。
当我配置没有的命名空间时veth
,我使用的是:
ip netns add ns
ip link set dev eth0 netns ns
ip netns exec ns ip link set dev lo up
ip netns exec ns ip link set dev eth0 up
然后在命名空间内部
route add default gw 192.168.109.2 (tried .1 and .2 here)
also removed that route and tried adding it with ip route
ip route add default via 192.168.109.2 dev eth0
之前没有使用过命名空间,而且我的网络知识水平较高(之前没有像这样在 Linux 上设置路由),所以如果有人愿意尝试帮助我实现目标,我将不胜感激。或者,如果有比命名空间更简单的代理/代理链来实现这一点的方法,也许这是最好的选择,但我觉得我已经很接近了!