我正在玩是unshare
为了更好地理解容器。作为普通用户,是否可以创建一个程序可以侦听端口的名称空间,123
并在“主”名称空间上将端口1234
重定向到它?
我想应该是这样,因为 Podman 是无根容器引擎并且可以做到。寻找man veth
没有帮助。
我正在玩是unshare
为了更好地理解容器。作为普通用户,是否可以创建一个程序可以侦听端口的名称空间,123
并在“主”名称空间上将端口1234
重定向到它?
我想应该是这样,因为 Podman 是无根容器引擎并且可以做到。寻找man veth
没有帮助。
我需要进行这样的设置(使用 Linux):
weth_ns
),其网络接口连接到互联网(weth0
)eth0
curl
,通过某种接口,透明地使用该命名空间内的网络连接到互联网。所以,像这样。
我似乎无法让它工作。到目前为止我做了什么:
ip netns add weth_ns
ip link set weth0 netns weth_ns
ip netns exec weth_ns ip link set dev weth0 up
ip netns exec weth_ns ip a # to see list to make sure it's there
ip netns exec weth_ns dhclient weth0
ip netns exec weth_ns curl website.com # works as expected
这将设置命名空间并将接口放在那里。这使得 curl 在命名空间内工作。现在我想以某种方式使用来自主机的隔离命名空间连接。
我试图做的是建立一个网桥,并在命名空间内设置 iptables。所以我运行的是:
ip link add veth0_left type veth peer veth0_right
ip link add bridge0 type bridge
ip link set bridge0 up
ip addr add 10.9.0.0/24 dev bridge0 # 10.9.0.0 is address I came up with
ip link set veth0_left master bridge0 up
ip link set dev veth0_right netns weth_ns
ip netns exec weth_ns ip link set dev veth0_right up
ip netns exec mobile_ns ip addr add 10.9.0.1/24 dev veth0_right
这增加了一个桥;我现在可以成功地从命名空间 ping 到命名空间。所以桥本身可以工作。
ping 10.9.0.1 # works
ip netns exec mobile_ns ping 10.9.0.0 # works
现在我需要设置 iptables 以使用命名空间内的连接。我怀疑这是我犯了某种错误的地方。这是我从各种在线资源中收集到的:
ip netns exec mobile_ns bash
# all following inside the namespace bash:
iptables -t nat -A POSTROUTING -s 10.9.0.0/255.255.255.0 -o weth0 -j MASQUERADE
iptables -A FORWARD -i weth0 -o veth0_right -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -o weth0 -i veth0_right -m state --state ESTABLISHED,RELATED -j ACCEPT
(所有涉及的网络都 /proc/sys/net/ipv4/conf/<network>/forwarding
设置为 1。来自命名空间的内部和外部。)
而且......它不起作用。我的网络现在应该是这样的;但我无法通过 curl 连接。使用任一veth0_left
或bridge0
网络接口。
我一定在某处做错了什么。
编辑:
指定什么是“不起作用”。
curl --interface bridge0 8.8.8.8
curl: (7) Failed to connect to 8.8.8.8 port 80: No route to host
curl --interface veth0_left 8.8.8.8
curl: (7) Failed to connect to 8.8.8.8 port 80: No route to host
当我尝试查看命名空间内的 tcpdump 时,我看到了who-has
ARP 请求,但仅在网桥接口上。它似乎永远不会“进入” weth0 界面。
我在 Ubuntu 20.04 机器上有许多可用的接口。除其他外 enx0c5b8f279a64
,usb0
后者被用作默认值。我想确保在终端中启动的特定进程将仅使用其中一个接口(enx0c5b8f279a64
即使另一个接口是默认接口)。如果该进程启动并且所选 enx0c5b8f279a64
接口关闭,则它甚至不应该尝试使用任何其他接口作为后备(就好像从该进程的角度来看其他接口甚至不存在一样)。
我认为这ip netns
是要走的路,但我无法实施任何可行的解决方案。我已经尝试过https://superuser.com/a/750412但是Destination Host Unreachable
如果我尝试 ping我会得到8.8.8.8
:(
输出的相关部分ip a s
:
9: enx0c5b8f279a64: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 12:12:12:12:12:12 brd ff:ff:ff:ff:ff:ff
inet 192.168.7.100/24 brd 192.168.7.255 scope global dynamic noprefixroute enx0c5b8f279a64
valid_lft 84611sec preferred_lft 84611sec
inet6 2323::2323:2323:2323:2323/64 scope link noprefixroute
valid_lft forever preferred_lft forever
10: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
link/ether 34:34:34:34:34:34 brd ff:ff:ff:ff:ff:ff
inet 192.168.42.**47**/24 brd 192.168.42.255 scope global dynamic noprefixroute usb0
valid_lft 1858sec preferred_lft 1858sec
inet6 4545:454:545:4545:454:5454:5454:5454/64 scope global temporary deprecated dynamic
valid_lft 2461sec preferred_lft 0sec
inet6 5656:565:656:5656:5656:5656:5656:5656/64 scope global deprecated dynamic mngtmpaddr noprefixroute
valid_lft 2461sec preferred_lft 0sec
inet6 6767::6767:6767:6767:6767/64 scope link noprefixroute
valid_lft forever preferred_lft forever
和路由表:
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.7.1 0.0.0.0 UG 100 0 0 enx0c5b8f279a64
0.0.0.0 192.168.42.129 0.0.0.0 UG 101 0 0 usb0
192.168.7.0 0.0.0.0 255.255.255.0 U 100 0 0 enx0c5b8f279a64
192.168.42.0 0.0.0.0 255.255.255.0 U 101 0 0 usb0
到目前为止,我尝试过的所有解决方案都以类似的方式开始:
# create namespace
sudo ip netns add nspace0
# create link
sudo ip link add veth0 type veth peer name veth1
# move link
sudo ip link set veth1 netns nspace0
# DO SOME MAGIC
# (none of the solutions that I have tried to adapt here worked for me so far).
...
# run process in namespace (here I use curl as an example)
sudo ip netns exec nspace0 curl ifconfig.me/ip
但问题是MAGIC
部分。我已经看到了许多使用网桥和其他 IP 转发解决方案的方法。不幸的是,到目前为止,这些都没有对我有用,而且我并不精通网络,无法诊断和修复。
问题陈述
使用以下配置,在默认/主网络命名空间和名为ns1
.
该配置还创建了第二个 veth 对: veth2 在 netns 中ns1
, veth3 在 netns 中ns2
,这加入ns1
了ns2
创建链:default netns-veth0 <-> veth1-ns1-veth2 <-> veth3-ns2
。
sudo ip link add veth0 type veth peer name veth1
sudo ip -6 addr add CCFF::0/127 peer CCFF::1/127 dev veth0
sudo ip link set up dev veth0
sudo ip netns add ns1
sudo ip link set veth1 netns ns1
sudo ip -n ns1 -6 addr add CCFF::1/127 peer CCFF::0/127 dev veth1
sudo ip -n ns1 link set up dev veth1
sudo ip -n ns1 -6 route add default via CCFF::0
sudo ip link add veth2 type veth peer name veth3
sudo ip link set veth2 netns ns1
sudo ip -n ns1 -6 addr add CCFF::2/127 peer CCFF::3/127 dev veth2
sudo ip -n ns1 link set up dev veth2
sudo ip -n ns1 -6 route add CCFF::/64 via CCFF::3
sudo ip netns add ns2
sudo ip link set veth3 netns ns2
sudo ip -n ns2 -6 addr add CCFF::3/127 peer CCFF::2/127 dev veth3
sudo ip -n ns2 link set up dev veth3
sudo ip -n ns2 -6 route add default via CCFF::2
sudo ip -6 r add CCFF::/64 via CCFF::1
从默认的 netns 我可以 ping 同一个 netns 中的 veth0。从默认的 netns 我可以 ping veth1 和 veth2,它们都在ns1
. 从默认的 netns 中,我无法识别ns2
.
如果我按如下方式扩展更改,通过添加 veth4 inns2
和 veth5 inns3
我有同样的问题。我可以从任何接口 ping 到 中ns1
的任何接口ns2
,但无法到达 中的任何接口ns3
。
sudo ip link add veth4 type veth peer name veth5
sudo ip link set veth4 netns ns2
sudo ip netns exec ns2 ip -6 addr add CCFF::4/127 peer CCFF::5/127 dev veth4
sudo ip netns exec ns2 ip link set up dev veth4
sudo ip netns exec ns2 ip -6 route add CCFF::/64 via CCFF::5
sudo ip netns add ns3
sudo ip link set veth5 netns ns3
sudo ip netns exec ns3 ip -6 addr add CCFF::5/127 peer CCFF::4/127 dev veth5
sudo ip netns exec ns3 ip link set up dev veth5
sudo ip netns exec ns3 ip -6 route add default via CCFF::4
看来我只能在直接“相邻”/“连接”的网络中 ping 一个接口到我正在 ping 的那个。我无法通过一系列网络名称空间 ping 通。路由全部有效;默认 netns 可以 ping 任何接口,ns1
但不能进一步,interfaces inns1
可以 ping 默认 netns 中的任何接口,ns2
但不能 ping 任何接口ns3
,并且ns3
可以 ping 任何东西,ns2
但不能 pingns1
默认 netns 之外的任何接口。
这是网络命名空间的限制吗?
故障排除
IPv6 转发已启用,ip6tables 只是设置为“全部允许”,我不确定还要检查什么。
$ip -6 r
ccff::1 dev veth0 proto kernel metric 256 pref medium
ccff::/127 dev veth0 proto kernel metric 256 pref medium
ccff::/64 via ccff::1 dev veth0 metric 1024 pref medium
fe80::/64 dev veth0 proto kernel metric 256 pref medium
$sudo ip -n ns1 -6 r
ccff:: dev veth1 proto kernel metric 256 pref medium
ccff::/127 dev veth1 proto kernel metric 256 pref medium
ccff::3 dev veth2 proto kernel metric 256 pref medium
ccff::2/127 dev veth2 proto kernel metric 256 pref medium
ccff::/64 via ccff::3 dev veth2 metric 1024 pref medium
fe80::/64 dev veth1 proto kernel metric 256 pref medium
fe80::/64 dev veth2 proto kernel metric 256 pref medium
default via ccff:: dev veth1 metric 1024 pref medium
$sudo ip -n ns2 -6 r
ccff::2 dev veth3 proto kernel metric 256 pref medium
ccff::2/127 dev veth3 proto kernel metric 256 pref medium
ccff::5 dev veth4 proto kernel metric 256 pref medium
ccff::4/127 dev veth4 proto kernel metric 256 pref medium
ccff::/64 via ccff::5 dev veth4 metric 1024 pref medium
fe80::/64 dev veth3 proto kernel metric 256 pref medium
fe80::/64 dev veth4 proto kernel metric 256 pref medium
default via ccff::2 dev veth3 metric 1024 pref medium
$sudo ip -n ns3 -6 r
ccff::4/127 dev veth5 proto kernel metric 256 linkdown pref medium
default via ccff::4 dev veth5 metric 1024 linkdown pref medium
$cat /proc/sys/net/ipv6/conf/all/forwarding
1
$cat /proc/sys/net/ipv6/conf/default/forwarding
1
$sudo ip6tables-save
# Generated by ip6tables-save v1.8.4 on Wed Nov 17 22:02:48 2021
*filter
:INPUT ACCEPT [76565:173401906]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [50440:6536664]
COMMIT
# Completed on Wed Nov 17 22:02:48 2021
$lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
$uname -a
Linux l13-ubuntu 5.11.0-40-generic #44~20.04.2-Ubuntu SMP Tue Oct 26 18:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
使用早于 5.1 的内核时,如果用户创建网络命名空间,它会从默认的 sysctl 值开始。即使根命名空间使用 sysctl 更改了这些值,新的网络命名空间仍将使用默认值。例如,proc/sys/net/ipv6/conf/all/forwarding
始终为 0,因为这是默认值。
如果我理解正确,这些是内核设置的默认值,我想知道是否可以通过 GRUB_CMDLINE_LINUX 或任何其他方式更改这些值。请注意,我不想访问网络命名空间并通过 sysctl(或 echo /proc/sys/net....)更改参数,我想更改默认值
默认情况下,当我创建网络命名空间时,我得到:
/proc/sys/net/ipv6/conf/all/forwarding=0
即使它在我的根网络命名空间或 /etc/sysctl.conf 中是 1。我想知道网络名称空间在哪里获得默认配置以及如何更改它。我希望将其设置为 1,以便新的网络命名空间默认获取该配置。
在嵌入式/物联网用例中,我有一个运行 Linux 的管理主机,它需要能够与多个网络通信,每个网络都使用一组通用的静态 IP 地址。
这主要工作正常,包括 UDP 多播流量,给定:
eth1
为 ,eth2
等)ns1
为 ,ns2
等)peer1
,等,从根命名空间端调用它们 , 等)peer2
veth1
veth2
192.168.0.x
)映射到一组非冲突的静态 IP 子网(调用它们192.168.1.x
,192.168.2.x
等等)smcrouted
实例,用于转发多播组注册192.168.(x+100).1
)要尝试可视化流量:
[|root namespace|::veth1] <-> [peer1::(namespace ns1)::eth1] <-> embedded network
[| |::veth2] <-> [peer2::(namespace ns2)::eth2] <-> embedded network
... etc ...
ns1
静态 IP 子网的示例 NETMAP 规则:
sudo -n ip netns exec ns1 iptables -t nat -A PREROUTING -d 192.168.1.0/24 -i peer1 -j NETMAP --to 192.168.0.0/24
sudo -n ip netns exec ns1 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o peer1 -j NETMAP --to 192.168.1.0/24
ns1
smcrouted
支持的多播组的示例配置规则:
mgroup from eth1 group 239.255.60.60
mgroup from peer1 group 239.255.60.60
mroute from eth1 group 239.255.60.60 to peer1
mroute from peer1 source 192.168.101.1 group 239.255.60.60 to eth1
这个问题的实际主题是NETMAP
源IP调整中有一个奇怪的故障,我无法解释,只能解决。
我的预期行为:
192.168.0.x
源地址192.168.1.x
源地址不过,这不是发生的事情。相反,两个命名空间中的订阅者要么看到 NETMAP 之前的 192.168.0.x 源地址,要么他们看到 192.168.1.x 之后的 NETMAP 地址。
配置中规则的source
过滤器用于防止多播路由循环,否则该循环会在服务器切换到第二组行为时启动。mroute from peer1
smcroute
到目前为止,我还无法确定导致两种状态之间转换的原因,只能在源地址信息看起来错误时通过基于活动网络命名空间或源网络接口进行调整来解决应用层的问题。
提出问题的目的是帮助确定以下哪一项适用:
(注意:这是一个非常深奥、非常具体的问题,所以我想知道网络工程是否更合适,但是https://networkengineering.stackexchange.com/questions/64744/linux-local-multicast-egress-follows -forward-chain-when-smcroute-is-active明确表示这是用于使用商业路由器等,而不是用于 Linux 网络名称空间配置。我不太清楚 Server Fault 与 Unix & Linux 堆栈交换之间的界限但是,在配置 Linux 服务器时)
我的 VPS 提供商为我的 vps 分配了 4 个 IPv4。但是,这分配给单个 NIC,并且 VLAN 不起作用(可能是我的配置问题)。如果我尝试使用 VLAN,我无法使用 VLAN 接口获取外部网络。
我想在每个 IP 地址上运行相同的 Java 应用程序。该应用程序服务于图像缓存服务器并将自己的 IP 地址通知给主服务器以发送 HTTP 请求,主服务器从 HTTP 请求 IP 中获取 IP。
因此,我需要强制使用指定 IP 来为每个 Java 进程连接外部网络。
当我使用以下配置尝试 netns 时,app0_ns 可以正常工作,但其他人不能。他们可以 ping 到 10.200.0.0/16,但无法访问外部网络。
这里是我尝试制作 netns 的命令。
我的 vps 使用 Ubuntu 18.04,我可以更改操作系统版本。
ip netns add app0_ns
ip netns add app1_ns
ip netns add app2_ns
ip netns add app3_ns
ip link add v_app0a type veth peer name v_app0b
ip link add v_app1a type veth peer name v_app1b
ip link add v_app2a type veth peer name v_app2b
ip link add v_app3a type veth peer name v_app3b
ip link set v_app0b netns app0_ns
ip link set v_app1b netns app1_ns
ip link set v_app2b netns app2_ns
ip link set v_app3b netns app3_ns
ip addr add 10.200.0.1/24 dev v_app0a
ip link set v_app0a up
ip addr add 10.200.1.1/24 dev v_app1a
ip link set v_app1a up
ip addr add 10.200.2.1/24 dev v_app2a
ip link set v_app2a up
ip addr add 10.200.3.1/24 dev v_app3a
ip link set v_app3a up
ip netns exec app0_ns ip addr add 10.200.0.2/24 dev v_app0b
ip netns exec app0_ns ip link set v_app0b up
ip netns exec app0_ns ip link set lo up
ip netns exec app0_ns ip route add default via 10.200.0.1
ip netns exec app1_ns ip addr add 10.200.1.2/24 dev v_app1b
ip netns exec app1_ns ip link set v_app1b up
ip netns exec app1_ns ip link set lo up
ip netns exec app1_ns ip route add default via 10.200.1.1
ip netns exec app2_ns ip addr add 10.200.2.2/24 dev v_app2b
ip netns exec app2_ns ip link set v_app2b up
ip netns exec app2_ns ip link set lo up
ip netns exec app2_ns ip route add default via 10.200.2.1
ip netns exec app3_ns ip addr add 10.200.3.2/24 dev v_app3b
ip netns exec app3_ns ip link set v_app3b up
ip netns exec app3_ns ip link set lo up
ip netns exec app3_ns ip route add default via 10.200.3.1
iptables -t nat -A POSTROUTING -s 10.200.0.1/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.200.1.1/24 -o eth0:1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.200.2.1/24 -o eth0:2 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.200.3.1/24 -o eth0:3 -j MASQUERADE
iptables -A FORWARD -i eth0 -o v_app0a -j ACCEPT
iptables -A FORWARD -o eth0 -i v_app0a -j ACCEPT
iptables -A FORWARD -i eth0:1 -o v_app1a -j ACCEPT
iptables -A FORWARD -o eth0:1 -i v_app1a -j ACCEPT
iptables -A FORWARD -i eth0:2 -o v_app2a -j ACCEPT
iptables -A FORWARD -o eth0:2 -i v_app2a -j ACCEPT
iptables -A FORWARD -i eth0:3 -o v_app3a -j ACCEPT
iptables -A FORWARD -o eth0:3 -i v_app3a -j ACCEPT
这里我的/etc/network/interfaces
.
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address [Removed]
gateway [Removed]
netmask 255.255.255.0
dns-nameservers 8.8.8.8 8.8.4.4
up ip addr add [Removed]/48 dev eth0
up ip -6 route add [Removed] dev eth0
up ip -6 route add default via [Removed]
auto eth0:1
iface eth0:1 inet static
address [Removed]
gateway [Removed]
netmask 255.255.255.0
dns-nameservers 8.8.8.8 8.8.4.4
auto eth0.2
iface eth0.2 inet static
address [Removed]
gateway [Removed]
netmask 255.255.255.0
dns-nameservers 8.8.8.8 8.8.4.4
vlan-raw-device eth0
auto eth0:3
iface eth0:3 inet static
address [Removed]
gateway [Removed]
netmask 255.255.255.0
dns-nameservers 8.8.8.8 8.8.4.4
这里我尝试了VLAN配置。
auto eth0.3
iface eth0.3 inet static
address [Removed]
gateway [Removed]
netmask 255.255.255.0
dns-nameservers 8.8.8.8 8.8.4.4
vlan-raw-device eth0
在调查容器中的一些 TCP 网络问题时,我试图用来ss
窥探容器网络 TCP 堆栈。
我们在 AWS 中运行 Amazon Linux:
# uname -a
Linux 4.14.173-137.229.amzn2.x86_64 #1 SMP Wed Apr 1 18:06:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
ss
有以下 cli 开关:
-N NSNAME, --net=NSNAME
Switch to the specified network namespace name.
lsns
给我以下输出:
# lsns | grep net
4026531993 net 225 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 21
4026532284 net 2 26244 root /pause
这是pause
为每个Kubernetes
pod 创建的容器——它是创建网络命名空间的容器。
尝试通过运行以下命令查看 pod 网络命名空间ss
:
# ss -tp -N 4026532284
Cannot open network namespace "4026532284": No such file or directory
有趣的是 ip netns list
不返回任何网络命名空间:
# ip netns list
#
有什么方法可以从根网络命名空间(即 netns 1)查看 K8s pod 网络命名空间?
# ss --version
ss utility, iproute2-ss180129
# lsns --version
lsns from util-linux 2.30.2
# rpm -qi iproute
Name : iproute
Version : 4.15.0
Release : 1.amzn2.0.4
Architecture: x86_64
Install Date: Sat 07 Mar 2020 03:42:24 AM UTC
Group : Applications/System
Size : 1321292
License : GPLv2+ and Public Domain
Signature : RSA/SHA256, Fri 21 Feb 2020 09:00:29 PM UTC, Key ID 11cf1f95c87f5b1a
Source RPM : iproute-4.15.0-1.amzn2.0.4.src.rpm
Build Date : Fri 21 Feb 2020 07:56:50 PM UTC
Build Host : build.amazon.com
Relocations : (not relocatable)
Packager : Amazon Linux
Vendor : Amazon Linux
URL : http://kernel.org/pub/linux/utils/net/iproute2/
Summary : Advanced IP routing and network device configuration tools
更新:2020 年 12 月 1 日星期二 11:35:39 UTC
经过一番挣扎,我终于下定了决心strace
。
事实证明这ss
是一个很棒的工具,但是当它与容器一起使用时,它还有一点不足之处,但我觉得涉及的“罪魁祸首”不止一个。
ss
无需查找创建网络名称空间的进程的实际 PID,而是直接检查/var/run/netns
:
openat(AT_FDCWD, "/var/run/netns/4026532284", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "Cannot open network namespace \"4"..., 70Cannot open network namespace "4026532284": No such file or directory
) = 70
现在,我怀疑这是由于包是如何iproute
创建network namespaces
的,即考虑到包ss
是随iproute
包一起提供的,关于网络命名空间的假设ip
是:“嘿,所有网络 ns 都应该在/var/run/netns
目录中找到,因为,为什么不,这也会使生活iproute
开发容易,或者其他什么。
事实证明,这是在ss
/iproute
方面做出的错误假设,或者在现代容器工具和互操作性上缺乏“协议” iproute
,但这在某种程度上解释了来自
ip netns list
因此,创建网络命名空间的方式(ip
因此它们可以被.ss
iproute
我一直在尝试按照多个指南为 2 个可以在 alpine linux 上相互通信的命名空间设置 veth-pair。到目前为止,我在命名空间之间进行了通信,但两个命名空间都不能连接/ping 到任何外部 ip/url。
这是我完全使用的指南配置:
ip netns add namespace1
ip netns add namespace2
ip netns exec namespace1 ip address show
ip link add veth1 type veth peer name br-veth1
ip link add veth2 type veth peer name br-veth2
ip link set veth1 netns namespace1
ip link set veth2 netns namespace2
ip netns exec namespace1 ip address show
ip netns exec namespace1 ip addr add 192.168.1.11/24 dev veth1
ip netns exec namespace1 ip address show
ip netns exec namespace2 ip addr add 192.168.1.12/24 dev veth2
# Create the bridge device naming it `br1`
# and set it up:
ip link add name br1 type bridge
ip link set br1 up
ip link | grep br1
# Set the bridge veths from the default
# namespace up.
ip link set br-veth1 up
ip link set br-veth2 up
ip netns exec namespace1 ip link set veth1 up
ip netns exec namespace2 ip link set veth2 up
# Add the br-veth* interfaces to the bridge
# by setting the bridge device as their master.
ip link set br-veth1 master br1
ip link set br-veth2 master br1
bridge link show br1
ip addr add 192.168.1.10/24 brd + dev br1
ip -all netns exec ip route add default via 192.168.1.10
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
我还验证了 /etc/sysctl.conf 包含
net.ipv4.ip_forward = 1
我也运行了这个命令以防万一
sysctl -w net.ipv4.ip_forward=1
我的 resolv.conf 包含:
nameserver 8.8.8.8
当我跑步时
ip netns exec namespace1 ip route
我得到结果:
192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.11
如果我运行一个常规的 ip 路由列表,我会得到:
192.168.56.0 eth0 proto kernel scope link src 192.168.56.217
192.168.1.0/24 dev br1 proto kernel scope link src 192.168.1.10
我不知道为什么上面的设置不起作用,因为大多数指南似乎建议主机和命名空间应该能够在执行 MASQUERADE 并设置命名空间的默认路由之后进行通信,但是网络不是我的核心研究领域,所以任何建议都会非常有用。如果缺少任何信息,请随时发表评论,如果我错过了什么,我会尽力提供。