Проброс портов (port forwarding) в Linux используя iptables

В этой статье поговорим о том, как можно перенаправить трафик с IP адреса (белого) на другой IP адрес (серый) использую утилиту iptables.
Начальные данные
У нас имеется компьютер под управлением linux, выступающий в роли маршрутизатора с одним внешним интерфейсом enp0s3 для доступа в Интернет (80.81.82.83) и внутренним enp0s8 интерфейсом Локальной сети (10.0.7.1). Требуется пробросить tcp порт (2222) с белого ip-адреса на серый ip-адрес Локальной сети порт (22).
Чаще всего проброс трафика используется, если мы находимся в локальной сети и от внешнего мира отделены шлюзом. Для того, чтобы открыть доступ для локальных служб (ssh, web, ftp и т.д.), нам необходимо пробросить порты. Поскольку в качестве шлюза мы будем использовать сервер на Linux, то осуществлять данные действия будем с помощью утилиты iptables.
Алгоритм проброса портов в iptables.
В принципе все довольно просто, необходимо добавить всего два правила в таблицу маршрутизации iptables. Но для начала нам нужно включить форвардинг пакетов на нашем сервере:
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
Для автоматического включения открываем файл /etc/sysctl.conf
и ищем там строку #net.ipv4.ip_forward=1
, убираем знак комментария.
sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
Настройка port forwarding на Linux
Итак, приступим. Для выполнения поставленной задачи, перенаправление порта 2222 на порт 22 другой машины, необходимо добавить следующие правила iptables:
sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -j ACCEPT
Это правило разрешает прохождение входящих пакетов внутрь сети.
Теперь опишем форвардинг (forwarding) пакетов:
sudo iptables -t nat -A PREROUTING -p tcp -d 80.81.82.83 --dport 2222 -j DNAT --to-destination 10.0.7.2:22
sudo iptables -t nat -A POSTROUTING -p tcp --sport 22 --dst 10.0.7.2 -j SNAT --to-source 80.81.82.83:2222
- Первая строка подменяет IP адрес приемника (белый IP) на внутренний (серый IP)
- Вторая адрес отправителя (серый IP) на внешний (белый IP).
- 10.0.7.2 — IP адрес машины в локальной сети, на который перенаправляет трафик.
- 80.81.82.83 — внешний IP адрес нашего сервера.
- 22 — внутренний порт локальной машины
- 2222 — внешний порт для подключения.
Перенаправления всего трафика
Если есть необходимость проброса всего трафика, то выполним следующее правило.
iptables -t nat -A PREROUTING -p tcp -d 80.81.82.83 -j DNAT --to-destination 10.0.7.2
iptables -t nat -A POSTROUTING -p tcp --dst 10.0.7.2 -j SNAT --to-source 80.81.82.83
Для сохранения наших правил необходимо создать файл и подгружать его при каждой перезагрузки системы, иначе правила iptables которые мы написали слетять. Для этого набираем в терминале следующее:
sudo nano /etc/nat
содержимое файла по первому примеру:
#!/bin/sh
# Перенаправляем ssh с 2222 на 22 IP-10.0.7.2
iptables -t nat -A PREROUTING -p tcp -d 80.81.82.83 --dport 2222 -j DNAT --to-destination 10.0.7.2:22
iptables -t nat -A POSTROUTING -p tcp -dst 10.0.7.2 --sport 22 -j SNAT --to-source 80.81.82.83:2222
Далее открываем файл interfaces
sudo nano /etc/network/interfaces
И добавляем в конце следующую строчку:
pre-up /etc/nat
Данное выражение подгрузить правила iptables после перезагрузки системы.
Как посмотреть правила iptables
Посмотреть текущие правила iptables можно с помощью команды:
sudo iptables -L -t nat
Пример:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere 80.81.82.83 tcp dpt:2222 to:10.0.7.2:22
Chain POSTROUTING (policy ACCEPT)
SNAT tcp -- 10.0.7.2 anywhere tcp spt:ssh to:80.81.82.83:2222
Вот и все, на этом рассмотрение проброса портов в операционных системах под управлением Linux с помощью iptables завершено.
Если есть вопросы, то пишем в комментариях.
Также можете вступить в Телеграм канал, ВКонтакте или подписаться на Twitter. Ссылки в шапке страницы.
Заранее всем спасибо!!!
Доброго дня! У меня задача: » разрешить прохождение исходящих udp-пакетов по порту 55777; настроить портфорвардинг (перенаправление) входящих udp-пакетов по порту 55777. Пакеты udp:55777 (по умолчанию), приходящие на внешнюю карту Proxy из Интернета, нужно переадресовывать на компьютер в локальной сети с установленным ViPNet (в заголовке таких пакетов нужно изменить destination: IP-адреса… Подробнее »
Здравствуйте Алексей. Чтобы перенаправить пакеты приходящие на порт 55777 в локальную сеть на ПК VipNet пишем такие строки: iptables -t nat -I PREROUTING -p udp --dport 55777 -d 10.10.10.1 -j DNAT --to-destination 10.5.5.2:55777 iptables -t nat -A POSTROUTING -p udp --dport 55777 --dst 10.5.5.2 -j SNAT --to-source 10.10.10.1:55777 Где 10.10.10.1… Подробнее »
Спасибо за подсказку! Если можно разъяснить по этой части: Где 10.10.10.1 — ip адрес машины для входящих пакетов10.5.5.2 — ip адрес vipnet в локальной сети у меня есть входящий белый айпи компании условно 63.23.123.154 есть адрес шлюза на входе — 192.168.1.1 (iptables in Fedora Linux) и локальный ПК с установленным… Подробнее »
Если белый ап на той же машине что и 192.168.1.1 то пишите его. Если нет то указываете 192.168.1.1
sudo echo 1 > /proc/sys/net/ipv4/ip_forward — включаем форвардинг пакетов sudo nano /etc/sysctl.conf — для авто включения net.ipv4.ip_forward=1 sudo iptables -A FORWARD -i eno3 -o eno4 -j ACCEPT — разрешаем вход. траффик и делаем проброс портов sudo iptables -t nat -A PREROUTING -p tcp -d xxx.xxx.xxx.xxx. --dport 80 -j DNAT --to-destination 192.168.0.254:30080 sudo… Подробнее »
Здравствуйте, а система у вас какая. Если ubuntu 18.04 и выше, то для автозапуска правил iptables надо использовать не /etc/network/interfaces. используйте либо crontab -e от root. и создайте правило
@reboot /etc/nat
Или же для iptables есть утилита iptables-persistent, она более предпочтительна.
sudo iptables -t nat -A PREROUTING -p tcp -d 172.20.100.141 --dport 58080 -j DNAT --to-destination 172.20.100.17:58080 sudo iptables -t nat -A POSTROUTING -p tcp --sport 58080 --dst 172.20.100.17 -j SNAT --to-source 172.20.100.141 в итоге набираю 172.20.100.141:58080 = на выходе не попадаю на 172.20.100.17 и проброса в принципе никакого нет, делаю… Подробнее »
В файле должно sysctl.conf должно быть включено forwarding ip v4 и во второй строке с Postrouting не указан порт с которого идёт перенаправление
Подскажите как удалить это прописанное правило?
Вместо большой буквы A прописать букву D
Зравствуйте, что бы перебросить порты для того чтобы подключиться по рдп из вне на локальную сеть, алгоритм тот же?
Здравствуйте. Да тот же
Спасибо помогло. Да при наборе route появилась строчка
192.168.1.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
Спасибо маршруты заработали!!!!
192.168.1.0
Пропишите в настройка впна строчку в конфигурационном файле сервера.
route 192.168.1.0 255.255.255.0 10.8.0.2
Где 10.8.0.2 адрес роутера при подключении к впн.
192.168.1.0 и маска — это сеть за роутером
Также после внесения изменений перезагрузите сервис впн. А также посмотрите на наличия данных адресов в выводе route
Самое интересное, что да. Настроил по вашей статье и заходил. Пробовал на двух серверах сделать. Потом перестало работать, и заново уже не получается. Пытался причину понять. У себя все перегружал
Внутренняя сеть в офисе 192.168.1.0/24 или 192.168.0.0/24?
впн подключен, я не могу зайти в офисную сеть
А до этого могли?
есть офис где интернет 4g. Нужно обеспечить доступ удаленный к ней. 4g за nat поэтому делаем впн и заходим в офисную сеть через впн. вход впн роутер сеть
Хорошо. Сейчас не можете подключится к vpn. Я правильно понял?
vpn на 1194. vpn подключен и работает, я его делал что бы снаружи заходить во внутреннею сеть, которая на 4g стоит. т.е вся эта катавасия для получения белого айпи
Хорошо. Ещё раз, что бы мне понять. Что перестало работать? Так сказать, что необходимо настроить?
Сперва стоит роутер, а за ним уже сервер с openvpn
проброс портов на vds где стоит openvpn на мой роутер
делал по вашей статье и все работало, неделю назад перестало работать и уже не могу настроить, не пойму в чем дело
Вывод iptables-save . Лучше даже фото
А на каком порту vpn работает
Добрый день. Консультации оказываете?
Здравствуйте, по какому вопросу?