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.