Files
Utils/Proxmox/lxc_nat_troubleshooting.md
T
2025-06-19 10:41:49 +03:00

4.9 KiB

На сервер Hezner я добавил доп. IP и после этого у меня LXC контейнеры перестали выходить в интернет.

️Проблема: LXC контейнеры не имеют доступа в интернет через NAT на Proxmox

добавил поддержку внешних IP, через добавление доп интерфейса в /etc/network/interfaces

auto vmbr0
iface vmbr0 inet static
    address 167.235.103.244
    netmask 255.255.255.192
    gateway 167.235.103.193
    bridge_ports enp195s0
    bridge_stp off
    bridge_fd 0

📍Контекст

На хост-сервере Proxmox используется bridge-сеть vmbr100 для подключения LXC-контейнеров с приватными IP (например, 192.168.100.x). Основной интерфейс enp195s0 имеет публичный IP (например, 167.235.103.244).

На хосте настроено правило NAT, позволяющее контейнерам выходить в интернет через iptables:

iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o enp195s0 -j MASQUERADE

Проблема

После:

  • добавления дополнительного публичного IP;
  • изменения bridge-интерфейса (vmbr0);
  • перезапуска сервера;

контейнеры теряют доступ в интернет. Пинги (например, ping 8.8.8.8) не работают, DNS-запросы не уходят.

Диагностика

  • tcpdump на vmbr100 показывает, что пакеты уходят из контейнера;
  • tcpdump на enp195s0 — показывает, что они не маршрутизируются наружу;
  • iptables -t nat -L POSTROUTING -n -v показывает, что MASQUERADE-правило не работает (пакеты = 0);
  • ip route get 8.8.8.8 возвращает маршрут via vmbr0 — это не работает корректно.

Решение

1. Удалить старое MASQUERADE-правило:

iptables -t nat -D POSTROUTING -s 192.168.100.0/24 -o enp195s0 -j MASQUERADE

2. Добавить SNAT-правило c явным IP:

iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o enp195s0 -j SNAT --to-source 167.235.103.244

3. Убедиться, что FORWARD-разрешения включены:

iptables -I FORWARD -s 192.168.100.0/24 -o enp195s0 -j ACCEPT
iptables -I FORWARD -d 192.168.100.0/24 -i enp195s0 -j ACCEPT

4. Проверить, что включена маршрутизация:

sysctl -w net.ipv4.ip_forward=1

Постоянно включить:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

💾 Сохранение правил

После успешной настройки сохранить правила:

iptables-save > /etc/iptables/rules.v4

🔁 Автоматическое восстановление правил

Способ 1: iptables-persistent (рекомендуется)

apt install iptables-persistent

Файлы:

  • /etc/iptables/rules.v4
  • /etc/iptables/rules.v6

Восстанавливаются автоматически при загрузке.

Способ 2: systemd unit (если используется pve-firewall)

Создать systemd-сервис /etc/systemd/system/iptables-restore-custom.service:

tee /etc/systemd/system/iptables-restore-custom.service > /dev/null << EOF
[Unit]
Description=Restore iptables rules after Proxmox Firewall
After=pve-firewall.service
Wants=network-online.target
ConditionPathExists=/etc/iptables/rules.v4

[Service]
Type=oneshot
ExecStart=/bin/sh -c '/sbin/iptables-restore < /etc/iptables/rules.v4'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reexec
systemctl enable --now iptables-restore-custom.service

Активировать:

systemctl daemon-reexec
systemctl enable --now iptables-restore-custom.service

🔐 Дополнительно

  • Убедитесь, что контейнеры имеют в конфиге параметр gw=192.168.100.1;
  • Проверьте, что bridge vmbr100 существует и имеет адрес 192.168.100.1;
  • Проверка сети в контейнере:
ping 192.168.100.1
ip route
ping 8.8.8.8

Результат

Контейнеры получают доступ в интернет через NAT, трафик корректно маршрутизируется, а правила восстанавливаются автоматически при перезапуске Proxmox.