Linux名前空間を使用した次のネットワークトポロジがあります。
.--------.veth0 .--------.veth2 .--------.
| ns_snd |------------| ns_mid |------------| ns_rcv |
'--------' veth1'--------' veth3'--------'
veth0:10.0.0.1/30
veth1:10.0.0.2/30
veth2:10.0.0.5/30
veth3:10.0.0.6/30
veth0はns_sndに属しています。
veth [1,2]はns_midに属し、
veth3はns_rcvに属しています
コマンドは次のとおりです。
S1="veth0"
S2M1="veth1"
M2R1="veth2"
R1="veth3"
NS_SND="ns_snd"
NS_RCV="ns_rcv"
NS_MID="ns_mid"
#Remove existing namespace
Sudo ip netns del $NS_SND
Sudo ip netns del $NS_RCV
Sudo ip netns del $NS_MID
#Remove existing veth pairs
Sudo ip link del $S1
Sudo ip link del $R1
Sudo ip link del $S2M1
Sudo ip link del $M2R1
#Create veth pairs
Sudo ip link add $S1 type veth peer name $S2M1
Sudo ip link add $M2R1 type veth peer name $R1
#Bring up
Sudo ip link set dev $S1 up
Sudo ip link set dev $S2M1 up
Sudo ip link set dev $M2R1 up
Sudo ip link set dev $R1 up
#Create the specific namespaces
Sudo ip netns add $NS_SND
Sudo ip netns add $NS_RCV
Sudo ip netns add $NS_MID
#Move the interfaces to the namespace
Sudo ip link set $S1 netns $NS_SND
Sudo ip link set $S2M1 netns $NS_MID
Sudo ip link set $M2R1 netns $NS_MID
Sudo ip link set $R1 netns $NS_RCV
#Configure the loopback interface in namespace
Sudo ip netns exec $NS_SND ip address add 127.0.0.1/8 dev lo
Sudo ip netns exec $NS_SND ip link set dev lo up
Sudo ip netns exec $NS_RCV ip address add 127.0.0.1/8 dev lo
Sudo ip netns exec $NS_RCV ip link set dev lo up
Sudo ip netns exec $NS_MID ip address add 127.0.0.1/8 dev lo
Sudo ip netns exec $NS_MID ip link set dev lo up
#add bridge
#Sudo ip netns exec $NS_MID brctl addbr br549
#Sudo ip netns exec $NS_MID brctl addif br549 $S2M1
#Sudo ip netns exec $NS_MID brctl addif br549 $M2R1
#Sudo ip netns exec $NS_RCV ip route add 10.0.0.0/30 via 10.0.0.5
#Bring up interface in namespace
Sudo ip netns exec $NS_SND ip link set dev $S1 up
Sudo ip netns exec $NS_SND ip address add 10.0.0.1/30 dev $S1
Sudo ip netns exec $NS_MID ip link set dev $S2M1 up
Sudo ip netns exec $NS_MID ip address add 10.0.0.2/30 dev $S2M1
Sudo ip netns exec $NS_MID ip link set dev $M2R1 up
Sudo ip netns exec $NS_MID ip address add 10.0.0.5/30 dev $M2R1
Sudo ip netns exec $NS_RCV ip link set dev $R1 up
Sudo ip netns exec $NS_RCV ip address add 10.0.0.6/30 dev $R1
#Add ip routes
Sudo ip netns exec $NS_SND ip route add 10.0.0.4/30 via 10.0.0.2
Sudo ip netns exec $NS_RCV ip route add 10.0.0.0/30 via 10.0.0.5
#Sudo ip netns exec $NS_SND "./scripts/setup_ns_snd.sh"
#Sudo ip netns exec $NS_RCV "./scripts/setup_ns_rcv.sh"
Ns_snd内では、10.0.0.5にpingできますが、10.0.0.6はpingできません。追加する必要があるもの、または追加するのを忘れたものは何ですか?
問題は、名前空間ns_snd
からns_mid
を経由してns_rcv
にパケットをルーティングしようとしていることです。カーネルは、ネームスペースを個別のホストであるかのように扱います。つまり、ルーターとして機能するようにカーネルを構成する必要があります。
これはかなり簡単です。
Sudo ip netns exec $NS_MID sysctl -w net.ipv4.ip_forward=1