나는 사용되지 않은 클래스 크기 C(여기서는 192.168.10으로 변경됨)에서 ip netns의 사용 예를 보여주는 작은 스크립트를 작성했습니다.
#!/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 핑 - 모든 호스트에서 잘 작동합니다.
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 응답에는 제한이 있다고 생각합니다. 하지만 – 그게 어디에 있을까요?