У меня есть сервер Proxmox на online.net. На нём запущено несколько ВМ с Linux-серверами. Решил попробовать настроить файрвол — конкретно, чтобы блокировать или разрешать определённые IP-адреса для всех ВМ сразу, а не настраивать это по отдельности. В датацентре есть 3 группы безопасности:
- remotemanagement — разрешает доступ по ping, ssh, https и т.д.
- vm-generalports — даёт доступ ко всем ВМ по http/https/ssh/mail и прочему
- clusterblocklist — блокирует некоторые IP через IPSet blacklist
Идея такая: сам сервер proxmox использует remotemanagement + clusterblocklist, а отдельные ВМ — vm-generalports + clusterblocklist.
Политика по умолчанию для исходящего трафика стоит на ALLOW на уровне датацентра и ВМ, но почему-то нет такой опции на уровне самого Proxmox-сервера?
Что бы я ни делал, при включённом файрволе могу заходить на сервисы ВМ — https, ping, почту и пр. Но сами ВМ не могут пинговать или делать dig. Уже несколько дней схожу с ума!
Обратил внимание: несмотря на установленную политику output ALLOW, в cluster.fw показывается только "policy_in: DROP", а "policy_out: ALLOW" нет. Может, у кого есть идеи?
Похоже на баг, но может разработчики сейчас больше сосредоточены на nftables? Было бы здорово иметь встроенную блокировку по geoip в Proxmox, чтобы не настраивать это на каждой ВМ. Это бы сильно снизило нагрузку.
Proxmox v8.2.2, запатчен, с лицензией. Режим Standalone.
cat /etc/network/interfaces:
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
iface eno1 inet manual
# Внешний IP
iface eno2 inet manual
# Внутренний IP
auto vmbr0
iface vmbr0 inet static
address x.x.x.x/24
gateway x.x.x.x
bridge-ports eno1
bridge-stp off
bridge-fd 0
auto vmbr1
iface vmbr1 inet manual
bridge-ports none
bridge-stp off
bridge-fd 0
# Для фиктивных SME портов
auto vmbr3
iface vmbr3 inet static
address 10.90.44.13/26
bridge-ports eno2
bridge-stp off
bridge-fd 0
# Внутренний IP
cat cluster.fw:
[OPTIONS]
enable: 0
policy_in: DROP
[IPSET clusterblacklist] # ClusterBlacklist
103.145.253.0/24
183.129.178.0/24
[RULES]
GROUP clusterblocklist
GROUP vm-generalports
GROUP remotemanagement
[group clusterblocklist] # uses DC/ClusterBlacklist
IN DROP -source +dc/clusterblacklist -log info
[group remotemanagement] # Remote Management
IN ACCEPT -p tcp -dport 3128 -log nolog # Порт 3128
IN ACCEPT -p tcp -dport 8006 -log nolog # Prox HTTPS
IN ACCEPT -p tcp -dport 2222 -log nolog # SSH
IN Ping(ACCEPT) -source 1.2.3.4 -log nolog # Удалённый Ping
IN Ping(ACCEPT) -source 5.6.7.8 -log nolog # Удалённый Ping
[group vm-generalports] # http https imap smtp ssh и т.д.
OUT DNS(ACCEPT) -log info # Отчаянные попытки
OUT Ping(ACCEPT) -log info # Отчаянные попытки
IN ACCEPT -p tcp -dport 2229 -log nolog # SSH 2229
IN Ping(ACCEPT) -log nolog
IN OpenVPN(ACCEPT) -log nolog
IN Mail(ACCEPT) -log nolog
IN HKP(ACCEPT) -log nolog
IN IPsecah(ACCEPT) -log nolog
IN IPsecnat(ACCEPT) -log nolog
IN IPsec(ACCEPT) -log nolog
IN IMAPS(ACCEPT) -log nolog
IN ACCEPT -p tcp -dport 993 -log nolog # IMAPS вручную
IN SMTPS(ACCEPT) -log nolog
IN SMTP(ACCEPT) -log nolog
IN HTTPS(ACCEPT) -log nolog
IN DNS(ACCEPT) -log nolog
IN HTTP(ACCEPT) -log nolog
|IN DROP -source 0.0.0.0/0 -log nolog # Отключено для теста
cat 101.fw:
[OPTIONS]
enable: 1
log_level_in: nolog
ipfilter: 1
log_level_out: info
[RULES]
GROUP vm-generalports -i net0
- remotemanagement — разрешает доступ по ping, ssh, https и т.д.
- vm-generalports — даёт доступ ко всем ВМ по http/https/ssh/mail и прочему
- clusterblocklist — блокирует некоторые IP через IPSet blacklist
Идея такая: сам сервер proxmox использует remotemanagement + clusterblocklist, а отдельные ВМ — vm-generalports + clusterblocklist.
Политика по умолчанию для исходящего трафика стоит на ALLOW на уровне датацентра и ВМ, но почему-то нет такой опции на уровне самого Proxmox-сервера?
Что бы я ни делал, при включённом файрволе могу заходить на сервисы ВМ — https, ping, почту и пр. Но сами ВМ не могут пинговать или делать dig. Уже несколько дней схожу с ума!
Обратил внимание: несмотря на установленную политику output ALLOW, в cluster.fw показывается только "policy_in: DROP", а "policy_out: ALLOW" нет. Может, у кого есть идеи?
Похоже на баг, но может разработчики сейчас больше сосредоточены на nftables? Было бы здорово иметь встроенную блокировку по geoip в Proxmox, чтобы не настраивать это на каждой ВМ. Это бы сильно снизило нагрузку.
Proxmox v8.2.2, запатчен, с лицензией. Режим Standalone.
cat /etc/network/interfaces:
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
iface eno1 inet manual
# Внешний IP
iface eno2 inet manual
# Внутренний IP
auto vmbr0
iface vmbr0 inet static
address x.x.x.x/24
gateway x.x.x.x
bridge-ports eno1
bridge-stp off
bridge-fd 0
auto vmbr1
iface vmbr1 inet manual
bridge-ports none
bridge-stp off
bridge-fd 0
# Для фиктивных SME портов
auto vmbr3
iface vmbr3 inet static
address 10.90.44.13/26
bridge-ports eno2
bridge-stp off
bridge-fd 0
# Внутренний IP
cat cluster.fw:
[OPTIONS]
enable: 0
policy_in: DROP
[IPSET clusterblacklist] # ClusterBlacklist
103.145.253.0/24
183.129.178.0/24
[RULES]
GROUP clusterblocklist
GROUP vm-generalports
GROUP remotemanagement
[group clusterblocklist] # uses DC/ClusterBlacklist
IN DROP -source +dc/clusterblacklist -log info
[group remotemanagement] # Remote Management
IN ACCEPT -p tcp -dport 3128 -log nolog # Порт 3128
IN ACCEPT -p tcp -dport 8006 -log nolog # Prox HTTPS
IN ACCEPT -p tcp -dport 2222 -log nolog # SSH
IN Ping(ACCEPT) -source 1.2.3.4 -log nolog # Удалённый Ping
IN Ping(ACCEPT) -source 5.6.7.8 -log nolog # Удалённый Ping
[group vm-generalports] # http https imap smtp ssh и т.д.
OUT DNS(ACCEPT) -log info # Отчаянные попытки
OUT Ping(ACCEPT) -log info # Отчаянные попытки
IN ACCEPT -p tcp -dport 2229 -log nolog # SSH 2229
IN Ping(ACCEPT) -log nolog
IN OpenVPN(ACCEPT) -log nolog
IN Mail(ACCEPT) -log nolog
IN HKP(ACCEPT) -log nolog
IN IPsecah(ACCEPT) -log nolog
IN IPsecnat(ACCEPT) -log nolog
IN IPsec(ACCEPT) -log nolog
IN IMAPS(ACCEPT) -log nolog
IN ACCEPT -p tcp -dport 993 -log nolog # IMAPS вручную
IN SMTPS(ACCEPT) -log nolog
IN SMTP(ACCEPT) -log nolog
IN HTTPS(ACCEPT) -log nolog
IN DNS(ACCEPT) -log nolog
IN HTTP(ACCEPT) -log nolog
|IN DROP -source 0.0.0.0/0 -log nolog # Отключено для теста
cat 101.fw:
[OPTIONS]
enable: 1
log_level_in: nolog
ipfilter: 1
log_level_out: info
[RULES]
GROUP vm-generalports -i net0

Теперь я вижу, что для виртуальной машины можно: создать IP Set "Test", добавить правило: Set Source или Destination > IP Set "Test", указать направление, действие и так далее. Но я думал, что это значит: Datacenter App IPSet 'clusterblocklist', добавить в Security group датацентра, затем для ВМ вставить Security Group 'clusterblocklist' IPSet и включить (потому что... это IPSet!). Полагаю, IPSet на уровне виртуальной машины используют только если у этой ВМ есть свой IPSet? Все еще сбивает с толку то, что на уровне ВМ можно либо: добавить Source/Destination IPSet 'clusterblocklist', либо вставить Security Group 'clusterblocklist'. Наверное, пользователю не стоит разрешать устанавливать IP Filter, если в IPSet нет данных? Мне также было непонятно, что политика по умолчанию для исходящего трафика — ALLOW, ведь я вроде ничего не настраивал на блокировку! Еще раз большое спасибо.