如何为 Linux 下新创建的网络命名空间提供单独的内核参数?
How to have a separate kernel parameter for a newly created network namespace under Linux?
我正在创建一个名为 OAM 的新网络命名空间,以及 veth 接口以在新命名空间和默认命名空间之间进行通信:
$ sudo ip netns add OAM
$ sudo ip link add veth0 type veth peer name veth1
$ sudo ip link set veth1 netns OAM
$ ip netns exec OAM ip link set dev veth1 up
$ ip link set dev veth0 up
$ sudo ip netns exec OAM ip addr add dev veth1 192.168.0.1/24
$ sudo ip addr add dev veth0 192.168.0.2/24
现在我从默认命名空间中检查 ip_default_ttl 参数的值:
$ cat /proc/sys/net/ipv4/ip_default_ttl
64
设置为64。接下来我在新创建的OAM命名空间中检查相同的参数:
$ sudo ip netns exec OAM cat /proc/sys/net/ipv4/ip_default_ttl
cat: /proc/sys/net/ipv4/ip_default_ttl: No such file or directory
因此,新网络命名空间中没有此参数的副本。
如果我尝试使用 ping 测试两个命名空间中 TTL 的值,我可以看到它是 ttl=64 :
默认命名空间:
$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=0.072 ms
64 bytes from 192.168.0.1: icmp_req=2 ttl=64 time=0.060 ms
64 bytes from 192.168.0.1: icmp_req=3 ttl=64 time=0.053 ms
^C
--- 192.168.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3997ms
rtt min/avg/max/mdev = 0.036/0.051/0.072/0.016 ms
新创建的 OAM 命名空间:
$ sudo ip netns exec OAM ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_req=1 ttl=64 time=0.042 ms
64 bytes from 192.168.0.2: icmp_req=2 ttl=64 time=0.030 ms
64 bytes from 192.168.0.2: icmp_req=3 ttl=64 time=0.053 ms
^C
--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.030/0.041/0.053/0.012 ms
所以看起来即使 ip_default_ttl 参数在新的 OAM 命名空间中不存在,但使用的值是相同的 (ttl=64)。
我确认通过以 root 身份登录到另一个终端并将 ip_default_ttl 值从 64 更改为 32,如下所示:
$ echo 32 > /proc/sys/net/ipv4/ip_default_ttl
现在,如果我重新测试 ping 以检查 TTL,我会在默认和 OAM 命名空间中得到相同的 ttl=32 值:
$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=32 time=0.029 ms
64 bytes from 192.168.0.1: icmp_req=2 ttl=32 time=0.038 ms
64 bytes from 192.168.0.1: icmp_req=3 ttl=32 time=0.053 ms
^C
--- 192.168.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.029/0.040/0.053/0.009 ms
$ sudo ip netns exec OAM ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_req=1 ttl=32 time=0.023 ms
64 bytes from 192.168.0.2: icmp_req=2 ttl=32 time=0.031 ms
64 bytes from 192.168.0.2: icmp_req=3 ttl=32 time=0.082 ms
^C
--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.023/0.045/0.082/0.026 ms
因此,似乎默认命名空间中定义的内核参数 ip_default_ttl 在所有网络命名空间中全局使用。
最后,我的问题是,如果我想不同的TTL值取决于不同的命名空间怎么办?有没有办法实现那个?有没有办法以某种方式将 ip_default_ttl 内核参数(或其他未被复制的参数)从默认值克隆到新创建的网络名称空间并具有单独的值?
提前感谢您的回答。
不同的命名空间和容器等在单个实例内核中运行,因此 ip_default_ttl
等参数是全局的。
但是您可以明确设置 hoplimit
路线:
# ip route change 192.168.50.0/24 dev xenbr0 hoplimit 32
我正在创建一个名为 OAM 的新网络命名空间,以及 veth 接口以在新命名空间和默认命名空间之间进行通信:
$ sudo ip netns add OAM
$ sudo ip link add veth0 type veth peer name veth1
$ sudo ip link set veth1 netns OAM
$ ip netns exec OAM ip link set dev veth1 up
$ ip link set dev veth0 up
$ sudo ip netns exec OAM ip addr add dev veth1 192.168.0.1/24
$ sudo ip addr add dev veth0 192.168.0.2/24
现在我从默认命名空间中检查 ip_default_ttl 参数的值:
$ cat /proc/sys/net/ipv4/ip_default_ttl
64
设置为64。接下来我在新创建的OAM命名空间中检查相同的参数:
$ sudo ip netns exec OAM cat /proc/sys/net/ipv4/ip_default_ttl
cat: /proc/sys/net/ipv4/ip_default_ttl: No such file or directory
因此,新网络命名空间中没有此参数的副本。
如果我尝试使用 ping 测试两个命名空间中 TTL 的值,我可以看到它是 ttl=64 :
默认命名空间:
$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=0.072 ms
64 bytes from 192.168.0.1: icmp_req=2 ttl=64 time=0.060 ms
64 bytes from 192.168.0.1: icmp_req=3 ttl=64 time=0.053 ms
^C
--- 192.168.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3997ms
rtt min/avg/max/mdev = 0.036/0.051/0.072/0.016 ms
新创建的 OAM 命名空间:
$ sudo ip netns exec OAM ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_req=1 ttl=64 time=0.042 ms
64 bytes from 192.168.0.2: icmp_req=2 ttl=64 time=0.030 ms
64 bytes from 192.168.0.2: icmp_req=3 ttl=64 time=0.053 ms
^C
--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.030/0.041/0.053/0.012 ms
所以看起来即使 ip_default_ttl 参数在新的 OAM 命名空间中不存在,但使用的值是相同的 (ttl=64)。 我确认通过以 root 身份登录到另一个终端并将 ip_default_ttl 值从 64 更改为 32,如下所示:
$ echo 32 > /proc/sys/net/ipv4/ip_default_ttl
现在,如果我重新测试 ping 以检查 TTL,我会在默认和 OAM 命名空间中得到相同的 ttl=32 值:
$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=32 time=0.029 ms
64 bytes from 192.168.0.1: icmp_req=2 ttl=32 time=0.038 ms
64 bytes from 192.168.0.1: icmp_req=3 ttl=32 time=0.053 ms
^C
--- 192.168.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.029/0.040/0.053/0.009 ms
$ sudo ip netns exec OAM ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_req=1 ttl=32 time=0.023 ms
64 bytes from 192.168.0.2: icmp_req=2 ttl=32 time=0.031 ms
64 bytes from 192.168.0.2: icmp_req=3 ttl=32 time=0.082 ms
^C
--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.023/0.045/0.082/0.026 ms
因此,似乎默认命名空间中定义的内核参数 ip_default_ttl 在所有网络命名空间中全局使用。
最后,我的问题是,如果我想不同的TTL值取决于不同的命名空间怎么办?有没有办法实现那个?有没有办法以某种方式将 ip_default_ttl 内核参数(或其他未被复制的参数)从默认值克隆到新创建的网络名称空间并具有单独的值?
提前感谢您的回答。
不同的命名空间和容器等在单个实例内核中运行,因此 ip_default_ttl
等参数是全局的。
但是您可以明确设置 hoplimit
路线:
# ip route change 192.168.50.0/24 dev xenbr0 hoplimit 32