Доступ к серверу с определенных IP на примере firewalld

Понадобилось мне подключаться к VPS только с определенных IP. На firewalld сделать это не сложно.

Шаг 1. Удаляем все из зоны public

Убираем всё из зоны public, потому что по умолчанию цель этой зоны - принимать пакеты icmp и отклонять все остальное.

Например, удалим сервис ssh:
firewall-cmd --remove-service=ssh --permanent; firewall-cmd --reload

Шаг 2. Установим зону external как зону по умолчанию

Когда зона external станет зоной по умолчанию, вам больше не надо будет каждый раз добавлять в firewall-cmd строку --zone=external.

Делаем external зоной по умолчанию:
# firewall-cmd --set-default-zone=external; firewall-cmd --reload
success
success
#

Теперь зона external как зона по умолчанию:
# firewall-cmd --get-default-zone
external

Шаг 3 Добавляем сервисы в зону external

Добавляем нужные сервисы (если вам необходимо разрешить извне входящие подключения к серверу) в зону external. В моём случае достаточно ssh. Но вы можете добавить любые другие.
firewall-cmd --add-service=ssh --permanent; firewall-cmd --reload

Если же вы хотите добавить много сервисов, то лучше это сделать одной строкой:
for i in http https ssh dns ntp; do firewall-cmd --permanent --add-service $i; done; firewall-cmd --reload

Шаг 4 Добавляем IP с которых будем подключаться

Можно добавить один адрес, а можно несколько и даже целую подсеть. В этой статье мы добавим 3 белых IP.
firewall-cmd --add-source=1.1.1.1 --permanent
firewall-cmd --add-source=2.2.2.2 --permanent
firewall-cmd --add-source=3.3.3.3 --permanent
firewall-cmd --reload

Проверяем:
# firewall-cmd --list-all
external (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: 1.1.1.1 2.2.2.2 3.3.3.3
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Конечно вы можете добавить определенный IP в любую другую зону, например внутренние IP в зону internal.
В таком случае к команде добавится опция --zone-internal:
firewall-cmd --zone=internal --add-source=1.1.1.1 --permanent; firewall-cmd --reload

Дополнение

После вышеперечисленных действий перезагружаем CentOS и каким-то образом внешний интерфейс (в моём случае eth0) привязывается к зоне по умолчанию (external). Из-за этого возможны входящие подключения с любых IP на этот интерфейс.

Как оказалось это старый баг и похоже его так и не исправят.
Источник: https://bugs.centos.org/view.php?id=7957

Решение

После того как перезагрузите систему, выполните следующие команды.

Убеждаемся, что eth0 прицепился к зоне external после перезагрузки:
# firewall-cmd --get-zone-of-interface=eth0
external

Пробуем удалить eth0 из зоны:
# firewall-cmd --remove-interface=eth0 --zone=external --permanent
Warning: NOT_ENABLED: eth0
success

Пишет: Warning: NOT_ENABLED: eth0, но на самом деле он еще как ENABLED.

Затем добавляем eth0 в зону public:
# firewall-cmd --add-interface=eth0 --zone=public --permanent
success

Чтобы eth0 действительно удалился из зоны, надо перезагрузить сервер. Других способов нет. После перезагрузки всё вышенаписанное будет работать.

Добавить комментарий