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

Например, удалим сервис ssh:
Делаем external зоной по умолчанию:
Теперь зона external как зона по умолчанию:
Если же вы хотите добавить много сервисов, то лучше это сделать одной строкой:
Проверяем:
Конечно вы можете добавить определенный IP в любую другую зону, например внутренние IP в зону internal.
В таком случае к команде добавится опция --zone-internal:
Как оказалось это старый баг и похоже его так и не исправят.
Источник: https://bugs.centos.org/view.php?id=7957
Убеждаемся, что eth0 прицепился к зоне external после перезагрузки:
Пробуем удалить eth0 из зоны:
Пишет: Warning: NOT_ENABLED: eth0, но на самом деле он еще как ENABLED.
Затем добавляем eth0 в зону public:
Чтобы eth0 действительно удалился из зоны, надо перезагрузить сервер. Других способов нет. После перезагрузки всё вышенаписанное будет работать.

Шаг 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 действительно удалился из зоны, надо перезагрузить сервер. Других способов нет. После перезагрузки всё вышенаписанное будет работать.