- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建一个名为 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/
我是一名优秀的程序员,十分优秀!