我的场景是这样的:我希望能够在具有自己的网络接口的单独命名空间中执行程序。但我也希望它能够通过我的物理网络接口访问互联网。到目前为止,这是我的代码:
ip netns add private_ns
ip link add link eth1 name eth1.100 type vlan id 100
ip link set eth1.100 netns private_ns
ip netns exec private_ns ip addr add 10.1.1.1/24 dev eth1.100
ip netns exec private_ns ip link set eth1.100 up
然后我尝试:
ip netns exec private_ns ping 8.8.8.8
我得到connect: Network is unreachable
答案1
每个网络命名空间都是网络堆栈的单独逻辑副本。因此,您需要将网络命名空间视为一台单独的机器。
要通过当前机器将新机器连接到互联网,您需要
- 在每台计算机中选择一个未使用的网卡(或安装一个新网卡)。
- 用网线将它们连接在一起。
- 在以太网桥接、普通 IP 路由或 NAT 之间进行选择。
- 4a.对于以太网桥接,将现有计算机中的新网卡添加到适当的网桥,并为辅助计算机中的网卡提供网桥所在子网中的 IP。
- 4b.对于传统 IP 路由,请为新链路选择一个 IP 块。分配该块中的接口 IP,确保在现有计算机上启用 IP 转发,确保网络的其余部分了解新子网,并确保 iptables 规则(如果有)允许流量流动。
- 4c.对于 NAT,为新链接选择一个 IP 块。分配该块中的接口 IP,确保在现有计算机上启用 IP 转发,确保您的 IPtables 规则允许流量流动,并为从新子网到外部主机的流量设置 SNAT 或 MASQURADE 规则。
- 在新计算机上设置适当的默认网关。
使用网络命名空间时也是如此。
- 在主网络命名空间中创建一个 veth 对。
- 将 veth 对的一端移至辅助网络命名空间。
- 在以太网桥接、普通 IP 路由或 NAT 之间进行选择。
- 4a. 对于以太网桥接,将主网络命名空间中的新 veth 添加到适当的桥接器,并为新网络命名空间中的 veth 提供桥接器所在子网中的 IP。
- 4b.对于传统 IP 路由,请为新链路选择一个 IP 块。分配该块中的接口 IP,确保在现有计算机上启用 IP 转发,确保网络的其余部分了解新子网,并确保 iptables 规则(如果有)允许流量流动。
- 4c.对于 NAT,为新链接选择一个 IP 块。分配该块中的接口 IP,确保在现有计算机上启用 IP 转发,确保您的 IPtables 规则允许流量流动,并为从新子网到外部主机的流量设置 SNAT 或 MASQURADE 规则。
- 在辅助网络命名空间中设置适当的默认网关。
(对丑陋的格式感到抱歉,如果您比我更有 Markdown 技能,请随时修复它)