Я пытаюсь проложить маршрут между сетью, подключенной к устройству внутри netns, и сетью за пределами netns, просто используя iptables FORWARD и ip route так же (ish) как между интерфейсами в пределах одной сети, но без особого прогресса. Возможно, я неправильно понимаю что-то фундаментальное, но я попал в тупик, и никакие поиски в Интернете пока не дают ничего полезного.
У меня bond0 подключен к моему коммутатору, причем bond0.1 находится в netns по умолчанию на 196.168.100.1/24, а bond0.555 находится внутри netns sip на 192.168.136.1/24. Связь процессов внутри netns с соответствующими устройствами работает нормально. (в данном случае я использую звездочку внутри netns, поскольку для этого конкретного решения требуются другие маршруты по умолчанию и т. д., эта часть не изменится.)
192.168.100.1 - маршрут по умолчанию для всех устройств на vlan1
192.168.136.1 - это маршрут по умолчанию для всех устройств на vlan555
Теперь я хочу иметь возможность связываться от vlan1 к vlan555 извне сервера и netns. Что я пробовал:
ip link add veth0 type veth peer name veth0 netns sip
ip link set veth0 up
ip netns exec sip ip link set veth0 up
ip addr add 172.25.36.1/24 dev veth0
ip netns exec sip ip addr add 172.25.36.2/24 dev veth0
ip route add 192.168.136.0/24 via 172.25.36.1
ip netns exec sip ip route add 192.168.100.0/24 via 172.25.36.2
iptables -A FORWARD -s 192.168.136.0/24 -d 192.168.100.0/24 -j ACCEPT
iptables -A FORWARD -d 192.168.136.0/24 -s 192.168.100.0/24 -j ACCEPT
ip netns exec sip iptables -A FORWARD -s 192.168.100.0/24 -d 192.168.136.0/24 -j ACCEPT
ip netns exec sip iptables -A FORWARD -d 192.168.100.0/24 -s 192.168.136.0/24 -j ACCEPT
ip netns exec sip sysctl -w net.ipv4.ip_forward=1
После этого из netns по умолчанию я могу пинговать 192.168.136.1, а из sip netns я могу пинговать 192.168.100.1, но я не могу подключиться к каким-либо устройствам через netns на соответствующие сети, и я не могу подключиться к 192.168.136.1 с устройства на vlan1 или к 192.168.100.1 с устройства на vlan555.
Я действительно пытался создать мост внутри netns между bond0.555 и veth0, но это не казалось чтобы иметь значение. Я бы действительно предпочел не использовать мост в netns по умолчанию, но и этого не пробовал.
Опять же, не уверен, упускаю ли я что-то очевидное или неправильно понимаю что-то фундаментальное, но любая помощь будет очень принята.
Итак, в итоге было 2 проблемы (одна из которых была исправлена в вопросе, но я все еще упоминаю ее, потому что она часто возникает с использованием ip netns exec
).
проблема перенаправления оболочки с ip netns exec
При нормальной работе на хосте (без ip netns exec sip
) этот вид команды:
ip netns exec sip echo 1> / proc / sys / net / ipv4 / ip_forward
по-прежнему будет воздействовать на хост, потому что перенаправление оболочки выполняется первым. Он будет запускать echo
в сетевом пространстве имен sip и перенаправлять свой вывод в настройки хоста. Это та же проблема, что и при использовании sudo
, и должны использоваться те же методы: либо используйте tee
, либо используйте эквивалентную команду, не требующую перенаправления вообще. Вот две эквивалентные команды:
эхо 1 | ip netns exec sip tee / proc / sys / net / ipv4 / ip_forward> / dev / null
ip netns exec sip sysctl -q -w net.ipv4.ip_forward = 1
Возможно, здесь нет никакой разницы, потому что когда создается новое сетевое пространство имен ( ip netns
s sip ), оно наследует настройки из того места, где оно было создано. Поскольку хост уже маршрутизировал, значит, уже был sip . Но другие подобные конфигурации, предназначенные для sip , могли бы вместо этого нарушить работу хоста.
неправильный выбор шлюза
ip addr add 172.25.36.1/24 dev veth0
ip route добавить 192.168.136.0/24 через 172.25.36.1
ip netns exec sip ip addr добавить 172.25.36.2/24 dev veth0
ip netns exec sip ip route добавить 192.168.100.0/24 через 172.25.36.2
Команды не будут жаловаться. Использование собственного IP-адреса в качестве шлюза - это альтернативный способ запретить использовать какой-либо шлюз (который, вероятно, работает даже в разных ОС). Эффект такой же, как если бы ссылка была прямой к соответствующему интерфейсу, поэтому здесь две команды маршрута в основном ведут себя так же, как если бы они не использовали через
, а использовали dev veth0
как :
ip route добавить 192.168.136.0/24 dev veth0
ip netns exec sip ip route добавить 192.168.100.0/24 dev veth0
, что ни к чему не поможет.
Исправление заключается в использовании IP-адреса одноранговой системы (хоста или sip ) в качестве шлюза вместо предыдущих команд маршрутизации. Эти команды, которые инструктируют каждую систему достичь "другой стороны" с помощью другой системы:
ip route add 192.168.136.0/24 через 172.25.36.2
ip netns exec sip ip route добавить 192.168.100.0/24 через 172.25.36.1