Install proxmox on Hetzner
Войдите в консоль корневого сервера Hetzner и перейдите в раздел Rescue Mode, чтобы загрузить сервер в режиме восстановления. Заходим на терминал и там предложат установить ОС командой installimage
Запускаем, выбираем Other (!!NO SUPPORT!!) - Proxmox7
installimage
Разметка диска, настраиваем RAID0 (так я делал в prox8)
DRIVE1 /dev/nvme0n1
DRIVE2 /dev/nvme1n1
SWRAID 1
SWRAIDLEVEL 0 # Use 1 for Raid 1
HOSTNAME prox8 # Set correct hostname
PART /boot/efi esp 256M
PART /boot ext4 1024M
PART lvm vg0 all
LV vg0 root / ext4 20G
LV vg0 swap swap swap 24G
LV vg0 data /var/lib/vz xfs all
# List images with ls /root/.oldroot/nfs/install/../images
IMAGE /root/.oldroot/nfs/install/../images/Debian-1107-bullseye-amd64-base.tar.gz
Конфигурация массива без LVM, что позволяет, в дальнейшем, тонок настроить конфигурацию файловой системы
SWRAID 1
SWRAIDLEVEL 0
PART swap swap 24G
PART /boot ext3 1024M
PART / ext4 20G
PART /var/lib/vz xfs all
Настройка сети с NAT и мрашрутизацией для виртуалных машин. Взято тут https://adminwin.ru/nastroyka-nat-dlya-virtualynh-mashin-proxmox/
nano /etc/network/interfaces
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
iface lo inet6 loopback
auto enp7s0
iface enp7s0 inet static
address 65.109.116.119/26
gateway 65.109.116.65
up route add -net 65.109.116.64 netmask 255.255.255.192 gw 65.109.116.65 dev enp7s0
# route 65.109.116.64/26 via 65.109.116.65
iface enp7s0 inet6 static
address 2a01:4f9:3051:1005::2/64
gateway fe80::1
iface eth0 inet manual
#auto vmbr100
#iface vmbr100 inet static
# address 192.168.100.0/24
# bridge-ports none
# bridge-stp off
# bridge-fd 0
auto vmbr100
iface vmbr100 inet static
address 192.168.100.1
netmask 255.255.255.0
bridge-ports none
bridge-stp off
bridge-fd 0
#NAT
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '192.168.100.0/24' -o enp7s0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.100.0/24' -o enp7s0 -j MASQUERADE
post-up iptables -t raw -C PREROUTING -i fwbr+ -j CT --zone 1 2>/dev/null || iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1 2>/dev/null || true
OVH
iface lo inet loopback
iface eno1 inet manual
iface enp3s0f1 inet manual
auto vmbr0
iface vmbr0 inet static
address 167.114.172.204/24
gateway 167.114.172.254
bridge-ports eno1
bridge-stp off
bridge-fd 0
hwaddress AC:1F:6B:05:B7:84
iface vmbr0 inet6 static
address 2607:5300:60:73cc::/64
gateway 2607:5300:60:73ff:ff:ff:ff:ff
auto vmbr100
iface vmbr100 inet static
address 192.168.100.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '192.168.100.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.100.0/24' -o vmbr0 -j MASQUERADE
#NAT
post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1
Попался проблемный сервер, где LXC контейнер не мог получить интернет, решение ниже
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
iface lo inet6 loopback
auto enp195s0
iface enp195s0 inet static
address 162.55.133.173/26
gateway 162.55.133.129
up route add -net 162.55.133.128 netmask 255.255.255.192 gw 162.55.133.129 dev enp195s0
# route 162.55.133.128/26 via 162.55.133.129
iface enp195s0 inet6 static
address 2a01:4f8:271:5f92::2/64
gateway fe80::1
iface eth0 inet manual
iface eth1 inet manual
auto vmbr100
iface vmbr100 inet static
address 192.168.100.1
netmask 255.255.255.0
bridge-ports none
bridge-stp off
bridge-fd 0
#NAT
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '192.168.100.0/24' -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.100.0/24' -j MASQUERADE
post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1 || true
Проверил prox14 / тестовый LXC 111. Ничего не менял.
Что видно
CT 111:
net0: firewall=1, ip=192.168.100.24/24, gw=192.168.100.1
Внутри контейнера:
ping 192.168.100.1: OK
ping 1.1.1.1: FAIL
DNS: FAIL
curl наружу: timeout
Хост prox14 в интернет ходит нормально. LXC без firewall=1 тоже ходит наружу. Значит проблема именно в связке firewall=1 + NAT.
Причина
На prox14 есть MASQUERADE:
-A POSTROUTING -s 192.168.100.0/24 -o enp7s0 -j MASQUERADE
Но отсутствует runtime raw-правило conntrack zone для fwbr+:
iptables-save -t raw
# raw table пустая, правила fwbr+ нет
При этом в /etc/network/interfaces оно прописано:
post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
Но в активных правилах его нет. Поэтому для LXC с firewall=1, которые проходят через fwbr/fwln/fwpr, NAT работает неправильно.
Это подтверждается conntrack:
src=192.168.100.24 dst=185.12.64.2 ... [UNREPLIED]
reply dst=192.168.100.24
mark=111
То есть пакет от CT 111 не получает нормальный SNAT на публичный IP 23.88.7.159; ответ ожидается обратно на приватный 192.168.100.24, что с интернета невозможно.
Для LXC без firewall conntrack другой:
src=192.168.100.29 dst=1.1.1.1 ...
reply dst=23.88.7.159
[ASSURED]
mark=0
Там NAT работает.
Как решить
Нужно восстановить raw conntrack-zone правило для firewall bridge:
iptables -t raw -C PREROUTING -i fwbr+ -j CT --zone 1 || \
iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
После этого новые соединения из LXC с firewall=1 должны начать NAT’иться корректно. Старые UNREPLIED conntrack-записи можно либо подождать, либо аккуратно удалить для
конкретного CT.
Постоянно лучше сделать idempotent-вариантом, а не голым -I, чтобы не плодить дубли после reload:
post-up iptables -t raw -C PREROUTING -i fwbr+ -j CT --zone 1 || iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1 || true
Коротко: проблема не в правилах самого CT 111; outbound из него firewall разрешает. Проблема в отсутствующем активном raw/conntrack-zone правиле для fwbr+ после
переустановки prox14.