gpt4 book ai didi

linux - 如何在 Linux 下为新创建的网络 namespace 设置单独的内核参数?

转载 作者:太空狗 更新时间:2023-10-29 12:30:01 24 4
gpt4 key购买 nike

我正在创建一个名为 OAM 的新网络命名空间,以及用于在新命名空间和默认命名空间之间进行通信的 veth 接口(interface):

$ 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 内核参数(或其他未被复制的参数)从默认值克隆到新创建的网络 namespace 并具有单独的值?

提前感谢您的回答。

最佳答案

不同的命名空间和容器等在单个实例内核中运行,因此像 ip_default_ttl 这样的参数是全局的。

然而,您可以为路由显式设置 hoplimit:

# ip route change 192.168.50.0/24 dev xenbr0 hoplimit 32

关于linux - 如何在 Linux 下为新创建的网络 namespace 设置单独的内核参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30344816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com