1
ЛОГ КОМАНД:
sudo ip netns add pvt-net1
sudo ip -n pvt-net1 link set lo up # -n aka -netns
# добавить пару veth: "to-pvt-net1" в корневом namespace и "from-pvt-net1" в namespace "pvt-net1":
sudo ip link add to-pvt-net1 type veth peer name from-pvt-net1 netns pvt-net1
# Назначить IP и стартануть интерфейс "to-pvt-net1":
sudo ip address add 10.99.99.4/31 dev to-pvt-net1
sudo ip link set to-pvt-net1 up
# Назначить IP и стартануть интерфейс "from-pvt-net1" в namespace "pvt-net1":
sudo ip -n pvt-net1 address add 10.99.99.5/31 dev from-pvt-net1
sudo ip -n pvt-net1 link set from-pvt-net1 up
На этом этапе прямое соединение между "to-pvt-net1" и "from-pvt-net1" в корневом и в namespace "pvt-net1" поднято и операбельно.
# Пинг из корневого namespace интерфейса "from-pvt-net1" находящегося в namespace "pvt-net1" теперь возможен простым пингом:
ping -nc1 10.99.99.5
# выполнить пинг корневого интерфейса "to-pvt-net1" изнутри namespace "pvt-net1":
sudo ip netns exec pvt-net1 ping -nc1 10.99.99.4
# Однако запущенные из namespace "pvt-net1" программы всё ещё не могут обращаться к прочим ресурсам, кроме 10.99.99.4.
# Необходимо добавить default роутинг в namespace, используя 10.99.99.4 как gateway.
sudo ip -n pvt-net1 route add default via 10.99.99.4
# Избежать использования wireguard при маршрутизации любых пакетов в корневом namespace,
# которые происходят из pvt-net1 namespace:
sudo ip rule add from 10.99.99.5 table main priority 99
Настройка фаервола:
Все пакеты, отправленные из "pvt-net1" namespace в корневое, при выходе из интерфейса "to-pvt-net1" будут иметь исходный IP 10.99.99.5. Для корневого пространства имён эти пакеты будут восприниматься как пришедшие с внешнего хоста. Чтобы корневое пространство имён не отклоняло их, необходимо выполнить ещё два действия:
1) Включить пересылку пакетов в корневом пространстве имен
2) Ослабить брандмауэр в корневом пространстве имен, чтобы принимать соединения, перенаправленные из пользовательского.
Проверить разрешена ли пересылка пакетов:
sysctl net.ipv4.conf.all.forwarding
Если 0, то включить указав 1 пересылку пакетов IPv4 в корневом namespace:
sudo sysctl -w net.ipv4.conf.all.forwarding=1
NOTE:
Simple stateful firewall ( https://wiki.archlinux.org/title/Simple_stateful_firewall )
# Посмотреть установленные правила:
sudo iptables-save
# или так:
iptables -nvL --line-numbers
# Чтобы сохранить новые правила межсетевого экрана для NAT-шлюза, выполните:
iptables-save -f /etc/iptables/iptables.rules
ВОПРОС: почему если ничего не меняя сохранить правила, то значения в [] меняются?
:INPUT ACCEPT [0:0] -> [88181:8369073]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0] -> [107722:74920513]
Добавить правила - разрешить траффик из/в интерфейс "to-pvt-net1":
sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -s 10.99.99.5 -j ACCEPT
РАЗРЕШИТЬ ИСХОДЯЩИЕ СОЕДИНЕНИЯ:
# Настроить маскировку (aka SNAT) в корневом namespace для соединений инициированных из других namespace.
# Настроить DNS в созданных namespace
sudo iptables -t nat -A POSTROUTING -s 10.99.99.5 -j MASQUERADE
Запустить программу firefox в namespace "pvt-net1" от имени $USER, а не от рута:
sudo ip netns exec pvt-net1 sudo -u $USER firefox
sudo ip netns exec pvt-net1 sudo -u $USER tixati
РАЗРЕШИТЬ ВХОДЯЩИЕ СОЕДИНЕНИЯ:
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.99.99.5
sudo iptables -A FORWARD -d 10.99.99.5 -p tcp --dport 8080 -j ACCEPT
For immediate assistance, please email our customer support: [email protected]