Вопрос или проблема
Извините за кросс-пост на 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. Рассмотрим ваши настройки и попробуем выявить возможные проблемы.
-
Конфигурация и маршрутизация:
Судя по вашему описанию, вы правильно запускали в виртуальном пространстве имён (namespace) и назначали IP-адреса, но нужно убедиться, что трафик действительно выходит в интернет. Вам необходимо проверить, правильно ли настроен внешний интерфейс и доступен ли он для трафика из пространства имён. -
Проблемы с маршрутизацией:
Ваше правило 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, чтобы убедиться, что он может выходить в интернет.
-
Проверка iptables:
Убедитесь, что у вас нет блокирующих правил iptables, которые могут затруднять маршрутизацию трафика. Проверьте таблицы фильтров (filter) и NAT на наличие правил, которые могут запрещать исходящий трафик из вашего пространства имён. -
Тестирование и отладка:
- Проверьте, решается ли проблема, отключив временно маскировку (MASQUERADE) и проверив, есть ли вообще соединение без NAT.
- Используйте команды, такие как
tcpdump
на интерфейсахmy-veth
иmy-ceth
, чтобы увидеть, проходит ли трафик через них. Это может помочь вам понять, идет ли трафик в интернет и возвращается ли он обратно. - Убедитесь, что у вас настроены все необходимые маршруты, а также проверьте, что у вашего хоста, на котором настроены пары veth, есть доступ к интернету.
-
Проверка конфигурации сети:
Убедитесь, что у вас нет дополнительных настроек в локальной сети или файерволе, которые могут блокировать ICMP трафик или соединения из вашего namespace.
Если после всех проверок проблема не решена, вы можете предоставить дополнительную информацию, такую как состояние маршрутов или дополнительные выводы iptables
, которые могут помочь в диагностике вашей ситуации.