Могу ли я маскировать трафик, проходящий через пару veth без моста?

Вопрос или проблема

Извините за кросс-пост на superuser, но я думаю, что это уместно здесь…

Я создал пару veth, одна сторона которой находится в сетевом пространстве имен. Я назначил адрес 10.1.2.50/24 для стороны пары, которая находится в пространстве имен, и 10.1.2.1/24 для стороны, которая находится в корневом пространстве имен. Я настроил правило iptables, чтобы маскировать трафик из подсети, связанной с парой veth, с помощью:

sudo iptables -t nat -A POSTROUTING -s 10.1.2.0/24 ! -o my-veth -j MASQUERADE

Это звучит разумно? Могу ли я маскировать трафик, поступающий через пару veth, не создавая мост?

Снаружи пространства имен я могу пинговать 10.1.2.50, а изнутри пространства имен я могу пинговать как 10.1.2.1, так и публичный IP хоста. Но изнутри пространства имен я не могу пинговать публичные IP Интернета (это зависает навсегда в ожидании ответа). Как мне это отладить?

Моя настройка выглядит следующим образом. Я создал пару так:

ip link add my-veth type veth peer name my-ceth

Я поместил один конец пары в пространство имен:

ip link set my-ceth netns my-ns

Я назначил IP-адреса внутри и снаружи пространства имен:

ip addr add 10.1.2.1/24 dev my-veth
nsenter --net=/run/netns/my-ns ip addr add 10.1.2.50/24 dev my-ceth

Я активировал устройства внутри и снаружи пространства имен:

ip link set my-veth up
nsenter --net=/run/netns/my-ns ip link set my-ceth up

Я установил маршрут по умолчанию внутри пространства имен:

nsenter --net=/run/netns/my-ns ip route add default via 10.1.2.1

Я создал правило iptables вне пространства имен для NAT-трафика из пространства имен:

iptables -t nat -A POSTROUTING -s 10.1.2.0/24 ! -o my-veth -j MASQUERADE

Мой ip addr выглядит так:

133: my-veth@if132: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether f6:b9:cb:fe:44:4a brd ff:ff:ff:ff:ff:ff link-netns my-ns
    inet 10.1.2.1/24 scope global my-veth
       valid_lft forever preferred_lft forever
    inet6 fe80::f4b9:cbff:fefe:444a/64 scope link 
       valid_lft forever preferred_lft forever

А внутри пространства имен:

132: my-ceth@if133: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether e2:c6:18:68:c8:14 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.1.2.50/24 scope global my-ceth
       valid_lft forever preferred_lft forever

Мой ip route выглядит так:

default via 192.168.88.1 dev wlo1 proto dhcp metric 600 
10.1.2.0/24 dev my-veth proto kernel scope link src 10.1.2.1 

А внутри пространства имен:

default via 10.1.2.1 dev my-ceth 
10.1.2.0/24 dev my-ceth proto kernel scope link src 10.1.2.50 

И мой iptables -t nat --list-rules вне пространства имен выглядит так:

-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 10.1.2.0/24 ! -o my-veth -j MASQUERADE
-A DOCKER -i docker0 -j RETURN

Тем не менее, я не могу пинговать публичные IP изнутри пространства имен:

$ sudo ip netns exec my-ns ping 93.184.215.14
PING 93.184.215.14 (93.184.215.14) 56(84) bytes of data.

Любая помощь будет очень ценна!

Ответ или решение

Да, вы можете маскировать трафик, проходящий через пару veth (виртуальных Ethernet-устройств) без необходимости создания моста (bridge). Однако для успешного NAT (перевод сетевых адресов) нужно правильно настроить маршруты и iptables. Рассмотрим ваши настройки и попробуем выявить возможные проблемы.

  1. Конфигурация и маршрутизация:
    Судя по вашему описанию, вы правильно запускали в виртуальном пространстве имён (namespace) и назначали IP-адреса, но нужно убедиться, что трафик действительно выходит в интернет. Вам необходимо проверить, правильно ли настроен внешний интерфейс и доступен ли он для трафика из пространства имён.

  2. Проблемы с маршрутизацией:
    Ваше правило iptables для маскировки выглядит корректным:

    sudo iptables -t nat -A POSTROUTING -s 10.1.2.0/24 ! -o my-veth -j MASQUERADE

    Однако для NAT трафика, идущего из пространства имён, вам необходимо убедиться, что в этом пространстве имён установлен правильный маршрутизатор. Вы указали, что устанавливаете шлюз по умолчанию через:

    nsenter --net=/run/netns/my-ns ip route add default via 10.1.2.1

    Проверьте, доступен ли интернет с маршрутизатора (10.1.2.1). Вы можете попробовать запинговать внешний адрес (например, 8.8.8.8) с 10.1.2.1, чтобы убедиться, что он может выходить в интернет.

  3. Проверка iptables:
    Убедитесь, что у вас нет блокирующих правил iptables, которые могут затруднять маршрутизацию трафика. Проверьте таблицы фильтров (filter) и NAT на наличие правил, которые могут запрещать исходящий трафик из вашего пространства имён.

  4. Тестирование и отладка:

    • Проверьте, решается ли проблема, отключив временно маскировку (MASQUERADE) и проверив, есть ли вообще соединение без NAT.
    • Используйте команды, такие как tcpdump на интерфейсах my-veth и my-ceth, чтобы увидеть, проходит ли трафик через них. Это может помочь вам понять, идет ли трафик в интернет и возвращается ли он обратно.
    • Убедитесь, что у вас настроены все необходимые маршруты, а также проверьте, что у вашего хоста, на котором настроены пары veth, есть доступ к интернету.
  5. Проверка конфигурации сети:
    Убедитесь, что у вас нет дополнительных настроек в локальной сети или файерволе, которые могут блокировать ICMP трафик или соединения из вашего namespace.

Если после всех проверок проблема не решена, вы можете предоставить дополнительную информацию, такую как состояние маршрутов или дополнительные выводы iptables, которые могут помочь в диагностике вашей ситуации.

Оцените материал
Добавить комментарий

Капча загружается...