Categories: linux

Проброс портов (port forwarding) в Linux с помощью Firewalld

Firewalld – утилита для управления брандмауэром, доступная практически во всех дистрибутивах Linux. Работает как интерфейс для iptables. В этой статье мы рассмотрим, как настроить проброс портов в Linux с помощью firewalld .

Технология Port Forwarding широко используется для прозрачного перенаправления входящего трафика с определенного порта на другой порт и/или IP адрес. Чаще всего применяется, когда нужно получить доступ снаружи в локальную сеть за NAT (проброс порта с белого IP адреса на серый). Внешний клиент подключается к определенному порту на маршрутизаторе, а тот перенаправляет его на нужных хост внутри локальной сети. Или, например, когда вы хотите закрыть потенциально опасные для атаки порты сервера, но не потерять связь с ними.

Статус сервиса firewalld проверяется командой:

# service firewalld status

В моем случае сервис запущен, но никаких настроек в нем нет, так как сервер тестовый. На сервере из активных служб работает только SSH со стандартным портом 22. Давайте попробуем настроить forwarding с нового TCP порта 6666 на 22, чтобы в дальнейшем закрыть доступ на стандартный SSH порт из внешнего мира (своеобразная защита ssh от типичных атак автоматическими сканерами; дополнительно можете использовать fail2ban ):

# firewall-cmd --zone=public --add-masquerade --permanent
# firewall-cmd --zone=public --add-forward-port=port=6666:proto=tcp:toport=22:toaddr=IP --permanent
# firewall-cmd --reload

Где IP — это адрес вашего сервера. После изменения правил firewalld, его нужно перезагрузить. В качестве IP-адреса может указать адрес любого другого хоста в сети, куда вы хотите перенаправить все запросы.

Обратите внимание, что firewalld позволяет пробрасывать как TCP, так и UDP порты. В Windows встроенные средства позволяют перенаправлять только TCP порты.

Теперь можно попробовать подключится с Windows компьютера в локальной сети на порт 6666 Linux сервера. Можно использовать встроенный ssh клиент :

ssh root@server2 -p 6666

При подключении firewalld должен автоматически перенаправить трафик с порта 666 на порт 22, а вы увидеть баннер SSH.

В SSH есть собственные возможности по пробросу портов через туннель .

Аналогичным образом можно пробросить трафик с других служб. Например, пробросим порт 3333 на порт mysql (tcp/3306). Такой сценарий может замаскировать ваш сервис mysql, опубликованный наружу.

# firewall-cmd --zone=public --add-forward-port=port=3333:proto=tcp:toport=3306:toaddr=IP --permanent
# firewall-cmd --reload

Вы можете перенаправлять входящий трафик с определенных подсетей или IP отдельных адресов на нужный вам порт. Например:

# firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=IP-client forward-port port=2222 protocol=tcp to-port=22 to-addr=IP-server'

Где:

  • IP-client – это адрес клиента или отдельная подсеть, для которых должно срабатывать трафила перенаправления трафика;
  • IP-server — это адрес вашего сервера или удаленного, куда будет направляться трафик через forwarding портов.

Все запросы с указанного адреса или подсети, будут фильтроваться через созданное вами правило. Если IP адрес источника не соответствует правилу в зоне public, то он не получит доступ на целевой хост.

Проверить созданные правила firewalld, можно с помощью команды:

# firewall-cmd --permanent --list-all --zone=public

Обратите внимание, при написании статьи мы работали с зоной public. Вы можете использовать любую другую и в таком случае при настройке нужно будет указывать ее.

Чтобы очистить все правила, настроенные в firewalld, нужно выполнить несколько команд:

# cp -pR /etc/firewalld/zones /etc/firewalld/zones.bak
# rm -f /etc/firewalld/zones/*
# systemctl restart firewalld

Как видите, все правила были очищены.

В firewalld есть мощные возможности по настройке различных правил не только для открытия/закрытия портов сервера или фильтрации, но он также умеет тонко и довольно просто настраивать forwarding портов.

admin

Recent Posts

Настройка Mercurial по HTTPS

Иногда mercurial, при скачивании и комитах ругается на https. Особенно на самоподписанные сертификаты. Чтобы заработал…

5 дней ago

Компиляция libvirt в Ubuntu

Компиляция libvirt Подробнее

5 дней ago

Ошибка libvirt permission denied: решение

Если возникает ошибка libvirt destroy lxc permission denied , при попытке остановить контейнер: _x000D_# virsh…

5 дней ago

Настройка редиректа в NGINX

Файлы с примерами редиректа для nginx Подробнее

5 дней ago

Включение gzip в NGINX

Как включить gzip сжатие в Nginx ? Подробнее

5 дней ago

Удаление postinst-скрипта в Linux

Иногда возникает ситуация, когда криво настроенные пакеты не устанавливаются в системе. У меня это произошло…

5 дней ago