Я пытаюсь понять кое-что о маршрутизации в Linux. У меня есть следующие устройства (VET пары):
veth pair: [ns1-1] <10.8.0.1 peer 10.8.0.2> [ns1-2]
veth pair: [ns2-1] <10.8.0.5 peer 10.8.0.6> [ns2-2]
И я добавил IP-адреса для устройств ns * -1, например:
[ns1-1] <10.8.0.3 peer 10.8.0.4> [ns2-1]
Каждое устройство ns * -2 находится в отдельном сетевом пространстве имен. Из каждого пространства имен я пытаюсь пропинговать все 6 IP-адресов. Я делаю все в простой скрипт, который я приложил. Результат этого сценария:
# failed to ping 10.8.0.6 from ns1
# failed to ping 10.8.0.2 from ns2
Обратите внимание, что я также сделал
echo 0 > /proc/sys/net/ipv4/ip_forward
Запись 1 делает все IP-адреса проверяемыми, но я не просто ищу решение проблемы. Я хотел бы понять, как работает маршрутизация.
Почему пинг не удался в 2 случаях выше?
Когда я пингую 10.8.0.5 (ns2-1) из пространства имен ns1, почему я не вижу пакетов в tcpdump -i ns2-1
(вне пространства имен), даже если эхо- запрос успешен?
Почему я могу пропинговать 10.8.0.5 из пространства имен ns1, даже если переадресация отключена?
Могу ли я сделать доступными все задействованные IP-адреса из любого пространства имен без включенной переадресации?
Спасибо.
Вот сценарий:
#!/bin/sh
#path=(/sbin $path)
PATH=/sbin:$PATH
_ns() { ip netns exec "$@"; }
create_ns()
{
ns=$1
a1=$2 a2=$3
l1=$ns-1 l2=$ns-2
ip netns add $ns
ip link add name $l1 type veth peer name $l2
ip link set dev $l2 netns $ns
_ns $ns ip link set dev lo up
ip addr add $a1 peer $a2 dev $l1
_ns $ns ip addr add $a2 peer $a1 dev $l2
ip link set dev $l1 up
_ns $ns ip link set dev $l2 up
_ns $ns ip route add default via $a1
}
close_ns()
{
ip link del $1-1
ip netns del $1
}
test_ping()
{
if ! _ns $1 ping -W 1 -c 1 $2 >/dev/null 2>&1; then
echo "failed to ping $2 from $1"
fi
}
close_ns ns1
close_ns ns2
create_ns ns1 10.8.0.1 10.8.0.2
create_ns ns2 10.8.0.5 10.8.0.6
ip addr add 10.8.0.3 peer 10.8.0.4 dev ns1-1
ip addr add 10.8.0.4 peer 10.8.0.3 dev ns2-1
test_ping ns1 10.8.0.1
test_ping ns1 10.8.0.2
test_ping ns1 10.8.0.3
test_ping ns1 10.8.0.4
test_ping ns1 10.8.0.5
test_ping ns1 10.8.0.6
test_ping ns2 10.8.0.1
test_ping ns2 10.8.0.2
test_ping ns2 10.8.0.3
test_ping ns2 10.8.0.4
test_ping ns2 10.8.0.5
test_ping ns2 10.8.0.6
# failed to ping 10.8.0.6 from ns1
# failed to ping 10.8.0.2 from ns2