我写了一个小脚本,展示了 ip netns 在未使用的类大小 C 上的示例用法(此处更改为 192.168.10)
#!/bin/sh
network=192.168.10
for id in `seq 0 127`; do
ip netns del test-$id;
done;
bring(){
set -x
idprev=$1
id=$2
ipprev=$(( $idprev * 2 ))
ip=$(( $idprev * 2 + 1 ))
ip netns add test-$id
ip netns exec test-$id ip link set dev lo up
ip netns exec test-$id sysctl -w net.ipv4.conf.default.forwarding=1
ip netns exec test-$id sysctl -w net.ipv4.conf.default.hop_limit=255
ip link add test-$1-$2 type veth peer name test-$2-$1
[ $idprev -eq 0 ] && ip link set test-$1-$2 up
[ $idprev -eq 0 ] && ip a a ${network}.$ipprev/31 dev test-$1-$2
[ $idprev -eq 0 ] && ip r a ${network}.0/24 via ${network}.$ip
[ $idprev -gt 0 ] && ip link set test-$1-$2 netns test-$idprev up
[ $idprev -gt 0 ] && ip netns exec test-$idprev ip a a ${network}.$ipprev/31 dev test-$1-$2
[ $idprev -gt 0 ] && ip netns exec test-$idprev ip r a ${network}.0/24 via $network.$ip
ip link set test-$2-$1 netns test-$id up
ip netns exec test-$id ip a a ${network}.$ip/31 dev test-$2-$1
ip netns exec test-$id ip r a default via ${network}.$ipprev
}
for id in `seq 0 127`; do
bring $id $(( $id + 1 ))
done;
我运行它,它创建了命名空间 - 所以我尝试测试它。在小“范围”上 - 它工作得很好:
undefine@uml:~$ mtr -n -r -c1 192.168.10.10
Start: Sat Apr 4 00:16:25 2015
HOST: uml Loss% Snt Last Avg Best Wrst StDev
1.|-- 192.168.50.253 0.0% 1 1.1 1.1 1.1 1.1 0.0
2.|-- 192.168.51.9 0.0% 1 3.1 3.1 3.1 3.1 0.0
3.|-- 192.168.52.32 0.0% 1 3.5 3.5 3.5 3.5 0.0
4.|-- 192.168.10.1 0.0% 1 4.2 4.2 4.2 4.2 0.0
5.|-- 192.168.10.3 0.0% 1 2.8 2.8 2.8 2.8 0.0
6.|-- 192.168.10.5 0.0% 1 3.6 3.6 3.6 3.6 0.0
7.|-- 192.168.10.7 0.0% 1 10.9 10.9 10.9 10.9 0.0
8.|-- 192.168.10.10 0.0% 1 3.1 3.1 3.1 3.1 0.0
但是 - 当我尝试实现稍后的跃点时 - 我没有收到 icmp 响应。它看起来像是某种 icmp 限制:
undefine@uml:~$ mtr -n -r -c10 192.168.10.100
Start: Sat Apr 4 00:19:09 2015
HOST: uml Loss% Snt Last Avg Best Wrst StDev
1.|-- 192.168.50.253 0.0% 10 2.2 1.3 0.8 2.2 0.0
2.|-- 192.168.51.9 0.0% 10 3.0 3.4 2.7 4.0 0.0
3.|-- 192.168.52.32 0.0% 10 4.9 3.9 2.7 7.7 1.4
4.|-- 192.168.10.1 90.0% 10 2.7 2.7 2.7 2.7 0.0
5.|-- 192.168.10.3 90.0% 10 2.9 2.9 2.9 2.9 0.0
6.|-- 192.168.10.5 90.0% 10 3.3 3.3 3.3 3.3 0.0
7.|-- 192.168.10.7 90.0% 10 3.6 3.6 3.6 3.6 0.0
8.|-- 192.168.10.9 90.0% 10 4.3 4.3 4.3 4.3 0.0
9.|-- 192.168.10.11 80.0% 10 5.6 4.7 3.7 5.6 1.0
10.|-- 192.168.10.13 50.0% 10 7.0 5.8 2.5 12.0 3.8
11.|-- 192.168.10.15 80.0% 10 2.8 3.3 2.8 3.7 0.0
12.|-- 192.168.10.17 90.0% 10 3.1 3.1 3.1 3.1 0.0
13.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
14.|-- 192.168.10.21 90.0% 10 3.5 3.5 3.5 3.5 0.0
15.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
正常的 icmp ping - 对所有主机都可以正常工作:
undefine@uml:~/filmy$ ping 192.168.10.100
PING 192.168.10.100 (192.168.10.100) 56(84) bytes of data.
64 bytes from 192.168.10.100: icmp_seq=1 ttl=12 time=3.68 ms
64 bytes from 192.168.10.100: icmp_seq=2 ttl=12 time=5.73 ms
64 bytes from 192.168.10.100: icmp_seq=3 ttl=12 time=2.85 ms
^C
--- 192.168.10.100 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 2.851/4.090/5.733/1.211 ms
防火墙是空的,conntrack 已关闭,在 dmesg 上没有任何内容。在每个名称空间上,我看到 icmp 回显数据包流量的 ttl 减少。我尝试将 net.ipv4.icmp_ratelimit 设置为各种值 - 从 0、1 到大数字。但这没有帮助。我认为来自 linux 的 icmp 回复还有一个限制。但是——它可以在哪里呢?