Перейти к содержанию

Как открыть порт в iptables, не потеряв SSH

Рассмотрим задачу: разрешить TCP/8443 только от управляющего узла 192.0.2.50. Такой пример безопаснее, чем открывать порт в Интернет без ограничений. Адрес условный, его необходимо заменить.

Условия выполнения

Работайте в согласованное окно изменений, имея резервный доступ к консоли. Если это виртуальный сервер, проверьте, что облачные правила безопасности также позволяют нужный порт. Для публичных сервисов сначала согласуйте ограничение по источникам и модель угроз.

1. Убедитесь, что приложение слушает порт

sudo ss -lntp | grep ':8443' || true
sudo iptables -S INPUT
sudo iptables -L INPUT -n -v --line-numbers

Если серверное приложение ещё не запущено, firewall не сможет сделать его доступным: он только разрешает пакеты.

2. Сохраните временный снимок правил

sudo mkdir -p /root/firewall-backups
sudo iptables-save | sudo tee /root/firewall-backups/ipv4-before-8443.rules >/dev/null
sudo ip6tables-save | sudo tee /root/firewall-backups/ipv6-before-8443.rules >/dev/null
sudo chmod 600 /root/firewall-backups/*.rules

Не публикуйте дамп без проверки: он может содержать внутреннюю адресацию инфраструктуры. Эти снимки нужны для восстановления с консоли; они не доказывают, как правила сохраняются при загрузке ОС.

3. Разрешите ограниченное входящее соединение

Подставьте проверенный IP администрирующего клиента:

sudo iptables -w -I INPUT 1 -p tcp \
  -s 192.0.2.50/32 --dport 8443 -j ACCEPT

-I INPUT 1 вставляет правило в начало цепочки, поэтому оно применится до последующих запретов. Это временное правило; для постоянного применения необходим подтверждённый механизм сохранения на конкретном образе.

4. Проверьте результат

sudo iptables -L INPUT -n -v --line-numbers
sudo iptables -S INPUT

С клиента 192.0.2.50 откройте тестовое подключение к настоящему адресу сервера. Если есть доступ к curl, проверьте соответствующий протокол (https://...:8443/ — только если сервис действительно использует HTTPS). Убедитесь, что счётчик пакетов нужного правила увеличился.

5. Удалите только добавленное правило при ошибке

Команда удаления по полной спецификации не зависит от того, как изменился порядковый номер строки:

sudo iptables -w -D INPUT -p tcp \
  -s 192.0.2.50/32 --dport 8443 -j ACCEPT

Если правила многократно дублировались, проверьте вывод iptables -S INPUT и удаляйте по одному экземпляру. Не делайте iptables -F INPUT.

6. Как сделать изменение постоянным

Точное действие зависит от /etc/systemd/scripts/ip4save, iptables.service и действующего сценария инициализации. В предоставленном архиве имеется SPEC, но не исходный файл ip4save. Поэтому нельзя достоверно рекомендовать одну «волшебную» команду. Читайте сохранение правил и сначала проверяйте содержимое установленного сервиса.

А что с IPv6?

Если сервис доступен по IPv6, нужна отдельная политика ip6tables: открытое IPv4 не регулирует IPv6. До включения IPv6-правил определите реальные адреса клиента и сервера. Не копируйте IPv4-правило с подменой iptables на ip6tables без проверки адресной схемы.