Мне нужно сделать такую настройку (с Linux):
- Я хочу иметь сетевое пространство имен (скажем,
weth_ns) с сетевым интерфейсом, подключенным к Интернету (weth0)
- я хочу иметь разные сетевой интерфейс в качестве маршрута по умолчанию в пространстве имен хоста (
eth0)
- Я хочу как-то иметь возможность использовать такие вещи, как
завиток, с некоторый тип интерфейса, чтобы прозрачно использовать сеть внутри это пространство имен для подключения к Интернету.
Ну вот так.

Кажется, я не могу заставить его работать. Что я сделал до сих пор:
ip netns добавить weth_ns
набор IP-ссылок weth0 netns weth_ns
ip netns exec weth_ns ip link set dev weth0 up
ip netns exec weth_ns ip a # чтобы увидеть список, чтобы убедиться, что он там есть
IP netns exec weth_ns dhclient weth0
ip netns exec weth_ns curl website.com # работает как положено
Это устанавливает пространство имен и помещает туда интерфейс. Это заставляет curl работать внутри пространства имен. Теперь я хочу как-то использовать изолированное соединение пространства имен с хоста.
Что я пытался сделать, так это настроить мост и настроить iptables внутри пространства имен. Итак, что я запускаю:
ip link добавить veth0_left тип veth peer veth0_right
IP-ссылка добавить мост типа bridge0
ip link set bridge0 вверх
ip addr add 10.9.0.0/24 dev bridge0 # 10.9.0.0 — это адрес, который я придумал
ip link set veth0_left master bridge0 up
ip link set dev veth0_right netns weth_ns
ip netns exec weth_ns ip link set dev veth0_right up
ip netns exec mobile_ns ip addr add 10.9.0.1/24 dev veth0_right
Это добавляет мост; Теперь я могу успешно выполнить ping из пространства имен в пространство имен. Так что сам мост работает.
пинг 10.9.0.1 # работает
ip netns exec mobile_ns ping 10.9.0.0 # работает
И теперь мне нужно настроить iptables для использования соединения внутри пространства имен. Я подозреваю, что здесь я делаю какую-то ошибку. Вот что я собрал из разных интернет-источников:
ip netns exec mobile_ns bash
# все следующее внутри пространства имен bash:
iptables -t nat -A POSTROUTING -s 10.9.0.0/255.255.255.0 -o weth0 -j MASQUERADE
iptables -A FORWARD -i weth0 -o veth0_right -m состояние --state УСТАНОВЛЕНО,СВЯЗАННО -j ПРИНЯТЬ
iptables -A FORWARD -o weth0 -i veth0_right -m состояние --state УСТАНОВЛЕНО,СВЯЗАННО -j ПРИНЯТЬ
(все вовлеченные сети имеют /proc/sys/net/ipv4/conf/<сеть>/форвардинг установлено значение 1. Как внутри, так и снаружи пространства имен.)
И... не работает. Моя сеть теперь должна выглядеть так; но я не могу подключиться через curl. Либо с veth0_left или же мост0 сетевой интерфейс.

Должно быть, я где-то делаю что-то не так.
редактировать:
Уточнить, что значит "не работает".
curl --interface bridge0 8.8.8.8
curl: (7) Не удалось подключиться к порту 8.8.8.8 80: нет маршрута к хосту
curl --интерфейс veth0_left 8.8.8.8
curl: (7) Не удалось подключиться к порту 8.8.8.8 80: нет маршрута к хосту
Когда я пытаюсь увидеть tcpdump внутри пространства имен, я вижу кто имеет Запросы ARP, но только на интерфейсе моста. Кажется, он никогда не «заходит» в интерфейс weth0.