Проброс портов в локальную сеть с помощью iptables

  • 23.06.2016
  • 21 706
  • 4
  • 04.02.2022
  • 18
  • 16
  • 2
Проброс портов в локальную сеть с помощью iptables

Компьютер с операционной системой Linux, который выступает в роли маршрутизатора для локальной сети - явление не редкое, за счет достаточно скромных системных требований (по факту нужен компьютер любой мощности и две сетевые карты) и простоты настройки. Тем не менее, есть некоторые ньюансы, которые требуют чуть более продвинутых знаний, и одно из них - это проброс портов в локальную сеть.

Описание задачи

Допустим, есть у вас компьютер с операционной системой Linux на борту, который еще выступает в качестве шлюза (роутера) в вашей локальной сети. Есть у вас другой компьютер, на котором, допустим, крутится сайт, к которому нужно обеспечить доступ из внешнего мира. Задача я думаю ясна - нужно пробросить 80 порт с шлюза до компьютера внутри локальной сети.

Статья предполагает, что у вас уже разрешен IP Forwarding на вашем устройстве под управлением Linux. Если же нет, то прочитать о том, как включить IP Forwarding в Linux можно по этой ссылке.

Пусть шлюз будет иметь ip адрес 192.168.1.1, а компьютер с сайтом - 192.168.1.10. Внешний адрес шлюза (внешний ip) пусть будет 123.123.123.123. Пробрасывать, повторюсь, будем 80 порт. Во внешний мир смотрит интерфейс eth0, в локальную сеть - eth1.

Решение

После выполнения этой команды, все что приходит на адрес 123.123.123.123 по 80 порту будет передаваться на адрес 192.168.1.10:

iptables -t nat -A PREROUTING --dst 123.123.123.123 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10

Однако, чтобы все работало как надо, нужно еще добавить разрешающее передачу пакетов правило, так как иначе фаирволл просто не будет пропускать соединения:

iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.1.10 -p tcp -m tcp --dport 80 -j ACCEPT

Теперь любой из внешней сети, набрав в адресной строке ip адрес 123.123.123.123, или связанное с ним доменное имя, попадет на 80 порт компьютера 192.168.1.10, который находится внутри локальной сети.

Чтобы клиенты из локальной сети могли зайти по этому же внешнему адресу, и их перекинуло на 80 порт компьютера внутри локальной сети, необходимо добавить так же еще одно правило:

iptables -t nat -A POSTROUTING --dst 192.168.1.10 -p tcp --dport 80 -j SNAT --to-source 123.123.123.123

Так же можно сделать правило на тот случай, если обратиться к этому адресу нужно будет с самого шлюза:

iptables -t nat -A OUTPUT --dst 123.123.123.123 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10
Была ли эта статья Вам полезна?

Комментарии к статье (4)

    • Гость

    Не работает проброс порта через iptables от слова вообще, пробовал другие утилиты, все прекрасно работает, но они костыльные

      • AJIekceu4

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

    • Сергей

    Долго искал способ проброса портов WhatsApp. Спасибо автору - решение в этой статье. А именно:

    1# iptables -I FORWARD 1 -i eth0 -o eth1 -p tcp -m multiport --dports 4244,5222,5223,5228,5242,50318,59234 -j ACCEPT
    2# iptables -I FORWARD 1 -i eth1 -o eth0 -p tcp -m multiport --dports 4244,5222,5223,5228,5242,50318,59234 -j ACCEPT
    3# iptables -I FORWARD 1 -i eth0 -o eth1 -p udp -m multiport --dports 34784,45395,50318,59234 -j ACCEPT
    4# iptables -I FORWARD 1 -i eth1 -o eth0 -p udp -m multiport --dports 34784,45395,50318,59234 -j ACCEPT
    • Сергей

    Мне кажется в этой строке ошибка:

    iptables -t nat -A POSTROUTING --dst 192.168.1.10 -p tcp --dport 80 -j SNAT --to-source 123.123.123.123

    Думаю что строка должна иметь следующий вид:

    iptables -t nat -A POSTROUTING --dst 192.168.1.10 -p tcp --dport 80 -j SNAT --to-source 192.168.1.1

    То есть пакет посланный машиной внутри сети на внешний адрес веб сервера подвергнется следующим изменениям:
    1. Подмена получателя(dst) в заголовке пакета . То есть внешнего адреса сервера(123.123.123.123) на внутренний(192.168.1.10).
    2. Подмена источника(srс) в заголовке пакета. Скажем внутренняя машина имеет адрес 192.168.1.40. Так вот 192.168.1.40 заменяется на 192.168.1.1(внутренний адрес шлюза). Дело в том что если не делать эту подмену то на сервер придет пакет в котором в source будет адрес 192.168.1.40. Сервер отправит ответный пакет именно на этот адрес. Внутренняя машина отбросит этот пакет так как она не знает внутренний адрес сервера, она отправляла пакет на адрес 123.123.123.123. Поэтому делается замена адреса source чтобы ответный пакет пришел на шлюз, а он в свою очередь в соответствии с таблицей NAT отправит этот пакет на внутреннюю машину.

Добавить комментарий для AJIekceu4

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Напоминаем Вам, что Ваше сообщение будет опубликовано только после проверки администратором сайта. Обычно это занимает 1-2 рабочих дня.