Маршрутизация между физическими сетями через netns без NAT

Я пытаюсь проложить маршрут между сетью, подключенной к устройству внутри 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
задан 28 April 2019 в 22:46
1 ответ

Итак, в итоге было 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
     
1
ответ дан 3 December 2019 в 12:29

Теги

Похожие вопросы