Как пробросить порт linux

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

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

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

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

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

Решение

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

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

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

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

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

Была ли эта статья Вам полезна?

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

    • Сергей
    • 23.04.2019 21:49

    Долго искал способ проброса портов 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

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

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

    То есть пакет посланный машиной внутри сети на внешний адрес веб сервера подвергнется следующим изменениям:
    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 отправит этот пакет на внутреннюю машину.

    Источник

    Проброс портов (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. Но для начала нам нужно включить форвардинг пакетов на нашем сервере:

    Для автоматического включения открываем файл /etc/sysctl.conf и ищем там строку #net.ipv4.ip_forward=1 , убираем знак комментария.

    Настройка port forwarding на Linux

    Итак, приступим. Для выполнения поставленной задачи, перенаправление порта 2222 на порт 22 другой машины, необходимо добавить следующие правила iptables:

    Это правило разрешает прохождение входящих пакетов внутрь сети.

    Теперь опишем форвардинг (forwarding) пакетов:

    • Первая строка подменяет IP адрес приемника (белый IP) на внутренний (серый IP)
    • Вторая адрес отправителя (серый IP) на внешний (белый IP).
    • 10.0.7.2 — IP адрес машины в локальной сети, на который перенаправляет трафик.
    • 80.81.82.83 — внешний IP адрес нашего сервера.
    • 22 — внутренний порт локальной машины
    • 2222 — внешний порт для подключения.

    Перенаправления всего трафика

    Если есть необходимость проброса всего трафика, то выполним следующее правило.

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

    содержимое файла по первому примеру:

    Далее открываем файл interfaces

    И добавляем в конце следующую строчку:

    Данное выражение подгрузить правила iptables после перезагрузки системы.

    Как посмотреть правила iptables

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

    Вот и все, на этом рассмотрение проброса портов в операционных системах под управлением Linux с помощью iptables завершено.

    Если есть вопросы, то пишем в комментариях.

    Также можете вступить в Телеграм канал, ВК или подписаться на Twitter. Ссылки в шапки страницы.
    Заранее всем спасибо.

    Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

    Источник

    Как в Linux сделать проброс портов?

    Чаще всего проброс трафика используется, если мы находимся в локальной сети и от внешнего мира отделены шлюзом. Для того, чтобы открыть доступ для локальных служб (ssh, web, ftp), нам необходимо пробросить порты. Поскольку в качестве шлюза мы будем использовать сервер на Linux, то осуществлять данные действия будем с помощью iptables.

    Порты в Linux

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

    Порт — это числовой идентификатор программы или процесса, которые обслуживают сетевые соединения на заданном сетевом адресе (IP-адресе).

    Например, некоторые Интернет-сервера имеют несколько одновременно работающих сетевых приложений, таких как веб-сервер (для организации доступа к веб-сайтам на этом сервере), почтовый сервер (для организации получения и отправки сообщений электронной почты) и FTP-сервер (для передачи файлов). Самому физическому серверу в данном случае назначен его уникальный IP-адрес, но если мы попытаемся создать соединение с сервером только по его IP, возникнет проблема неоднозначности — мне не знаем с каким именно приложением мы должны соединиться для обмена данными.

    Проброс портов в Linux

    На шлюз приходит пакет, который мы должны перенаправить на нужный сервер в локальной сети перед принятием решения о маршрутизации, то есть — в цепочке PREROUTING таблицы nat.

    iptables -t nat -A PREROUTING —dst $EXT_IP -p tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP

    Перенаправление портов в Linux

    Перенаправление портов нужно в том случае, если мы хотим «замаскировать» внутреннюю службу, обеспечив к ней доступ извне не по стандартному, а совсем по другому порту. Пусть $FAKE_PORT — обманный порт на внешнем интерфейсе шлюза, подключившись к которому мы должны попасть на адрес $LAN_IP и порт $SRV_PORT. Набор правил для iptables будет отличаться несущественно, поэтому приведу сразу пример итогового скрипта для ленивых.

    #!/bin/bash
    EXT_IP=»xxx.xxx.xxx.xxx» # внешний, реальный IP-адрес шлюза;
    INT_IP=»xxx.xxx.xxx.xxx» # См. выше.
    EXT_IF=eth0 # Внешний и внутренний интерфейсы.
    INT_IF=eth1 # Для шлюза они вряд ли изменятся, поэтому можно прописать вручную.
    FAKE_PORT=$1 # Вначале передаём скрипту «неправильный» порт на внешнем интерфейсе,
    LAN_IP=$2 # затем — локальный адрес сервера
    SRV_PORT=$3 # и в конце — реальный порт для подключения к серверу
    # Здесь опять надо сделать проверку ввода данных, потому что операции всё ещё серьёзные.
    iptables -t nat -A PREROUTING -d $EXT_IP -p tcp -m tcp —dport $FAKE_PORT -j DNAT —to-destination $LAN_IP:$SRV_PORT
    iptables -t nat -A POSTROUTING -d $LAN_IP -p tcp -m tcp —dport $SRV_PORT -j SNAT —to-source $INT_IP
    iptables -t nat -A OUTPUT -d $EXT_IP -p tcp -m tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP
    iptables -I FORWARD 1 -i $EXT_IF -o $INT_IF -d $LAN_IP -p tcp -m tcp —dport $SRV_PORT -j ACCEPT

    Предположим, у вас есть веб-сервер в локальной сети, который должен быть доступным из дикого интернета только по https (443/tcp). Причин не использовать VPN или отдельный IP для отдельного сервера может быть много. Например, архитектура сети, отсутствие свободных IP, веб-сервер — гостевая виртуальная машина, а наш шлюз — хост )) Ну, не знаю, сами придумайте ситуацию.

    Причем мы хитрые и хотим, чтобы наш веб сервер из интернета не был виден на 443 порту, а был доступен, скажем, на 1293 порту (примерно вот так: https://1.2.3.4:1293). Итак, мы хотим перенаправить входящие из интернет на порт 1293 на порт 443 сервера в локальной сети.

    IF_EXT=»eth0″ # Внешний сетевой адаптер
    IF_INT=»eth1″ # Внутренний сетевой адаптер

    IP_EXT=»1.2.3.4″ # Внешний IP
    IP_INT=»192.168.1.1″ # Внутренний IP

    FAKE_PORT=»1293″ # Фейковый порт, доступен из интернет

    LOCAL_SRV=»192.168.1.28″ # Web сервер в LAN
    SRV_PORT=»443″ # Настоящий порт

    # NAT
    $IPT -t nat -A PREROUTING -i $IF_EXT -p tcp -d $IP_EXT —dport $FAKE_PORT -j DNAT —to $LOCAL_SRV:$SRV_PORT

    # FORWARD
    $IPT -A FORWARD -i $IF_EXT -o $IF_INT -d $LOCAL_SRV -p tcp —dport $SRV_PORT -j ACCEPT

    Перенаправление с одного ip на другой в Linux

    Не всегда перенаправление совершается из/в локальную сеть. Бывает, что необходимо сделать проброс соединения на какой-то сервер, используя промежуточный. Это может быть необходимо для дополнительной фильтрации подключаемых клиентов, для разделения нагрузки и других задач. Есть хост с публичным IP-адресом (1.1.1.1), ему может быть сопоставлено доменное имя, для которого могут быть выпущены SSL-сертификаты и прочее.

    Нужно, чтобы клиенты, обращающиеся на 1.1.1.1:25, направлялись бы на 2.2.2.2:25, с 1.1.1.1:443 — на 3.3.3.3:443, а с ip 4.4.4.4 обращения на порт 3535 шли бы на 3.3.3.3:22. 1.1.1.1, 2.2.2.2, 3.3.3.3 — это публичные IP-адреса (а могут быть и внутренними, не важно, могут быть от разных ISP и вообще, в разных местах). Подключающимся клиентам это знать незачем, не придется ничего перенастраивать в почтовых программах и т.п.

    # flush
    $IPT —flush
    $IPT -t nat —flush
    $IPT -t mangle —flush
    $IPT -X

    # loopback
    $IPT -A INPUT -i lo -j ACCEPT
    $IPT -A OUTPUT -o lo -j ACCEPT

    # default
    $IPT -P INPUT DROP
    $IPT -P OUTPUT DROP
    $IPT -P FORWARD DROP

    # allow forwarding
    echo 1 > /proc/sys/net/ipv4/ip_forward

    # NAT
    $IPT -t nat -A PREROUTING -i $IF_EXT -p tcp —dport 25 -j DNAT —to 2.2.2.2:25
    $IPT -t nat -A PREROUTING -i $IF_EXT -p tcp —dport 443 -j DNAT —to 3.3.3.3:443
    $IPT -t nat -A PREROUTING -i $IF_EXT -p tcp -s 4.4.4.4 —dport 3535 -j DNAT —to 3.3.3.3:22

    $IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE

    # FORWARD
    $IPT -A FORWARD -m state —state ESTABLISHED,RELATED -j ACCEPT

    $IPT -A FORWARD -i $IF_EXT -o $IF_EXT -s 4.4.4.4 -d 3.3.3.3 -j ACCEPT
    $IPT -A FORWARD -i $IF_EXT -o $IF_EXT -d 2.2.2.2 -j ACCEPT
    $IPT -A FORWARD -i $IF_EXT -o $IF_EXT -d 3.3.3.3 -j ACCEPT

    # log
    #$IPT -A FORWARD -j LOG —log-prefix » —FORWARD-LOG— «

    # INPUT
    $IPT -A INPUT -p tcp ! —syn -m state —state NEW -j DROP
    $IPT -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT

    # ssh
    $IPT -A INPUT -p tcp —dport 22 -j ACCEPT

    # OUTPUT
    $IPT -A OUTPUT -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT

    Если что-то не так, вы должны понимать, что пакет все же пришел на 1.1.1.1:25. А вот потом не ушел. Он не должен попасть никуда, кроме FORWARD. Поэтому для отлова отбрасываемого трафика в цепочке FORWARD раскомментируйте правило лога (есть в примере) и просматривайте события в реальном времени (например, «tail -f /var/log/messages»). В соответствии с тем, что вы увидите в логе, испрвьте ваши правила iptables. Все должно получиться. Когда это произойдет, не забудьте выключить логирование (иначе размер лог-файла станет огромным).

    Источник

    Проброс портов в Linux

    Система Убунту является самой оптимальной ОС для работы не только крупных производств, но и частных отдельных лиц. Однако если с одного гаджета работает несколько человек, это может стать причиной многих проблем, связанных с работой Линукс. Для решения этой проблемы есть такое явление, как проброс портов в Ubuntu. Этот процесс имеет свои преимущества и недостатки. Также для него характерны некоторые специфические нюансы и методики решения проблем у новичков в области IT-технологии.

    Что такое проброс портов в Linux

    Сначала нужно разобраться в сути явления проброса портов Linux. Эта техника необходима в том случае, когда запрашивающих портов гораздо больше, чем места на искомом устройстве. В этом случае для связи пользователя и сервиса нужна особая связь через «посредника».

    В целом проброс портов debain или иными словами, настройка rinetd, осуществляется с помощью общей программы NAT.

    Работа передачи данных достаточно проста и понятна: компьютер или ноутбук имеет свой уникальный адрес. Когда с помощью него нужно передать какие-то программы или документы, идет запрос к роутеру, а тот меняет адрес компьютера на уникальный адрес сервера. Таким образом, устанавливается связь пользователя с сервером. Обратный ответ получается аналогично через роутер. Чтобы можно было устанавливать свои адреса для роутера, было создано перенаправление портов Ubuntu.

    Ubuntu port forwarding имеет несколько этапов работы:

    1. Переадресация трафика на ядерном уровне. Это происходит с помощью выражения echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward . Чтобы это состояние и возможные изменения смогли сохраниться после перезагрузки оборудования, нужно ввести команду sudo sysctl –w net.ipvip_forward=1.
    2. Настройка прохождения пакетов. Чтобы новые пакеты беспрепятственно приходили на определенный порт, следует ввести выражение sudo iptables — A FORWARD -i eth0 -o eth1 -p tcp —syn —dport 80 -m conntrack —ctstate NEW -j ACCEP T . Для разрешения прохода другого трафика нужно ввести команду sudo iptables -A FORWARD -i eth0 -o eth1 -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT . Чтобы процесс хорошо проходил в обоих направлениях, нужно ввести запись $ sudo iptables -A FORWARD -i eth1 -o eth0 -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT . По умолчанию поставить режим DROP: sudo iptables -P FORWARD DROP .
    3. Модификация пакетов. В этом случае создаются определенные правила работы системы с пакетами. Чтобы осуществлялось перенаправление документов только на один порт, нужна команда: sudo iptables -t nat -A PREROUTING -i eth0 -p tcp —dport 80 -j DNAT —to-destination168.1.2 . Можно настроить получение пакетов на маршрутизатор: sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp —dport 80 -d 192.168.1.2 -j SNAT —to-source 192.168.1.1 . Для установки еще одного порта: sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp —dport 80 -d 192.168.1.2 -j SNAT —to-source 192.168.1.1:8080 . Для указания возможного диапазона: sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp —dport 1000:2000 -d 192.168.1.2 -j SNAT —to-source 192.168.1.1
    4. Сохранение настроек. Это делается просто, одной записью: sudo service iptables-persistent save .

    Технология Ubuntu port forwarding достаточна проста.

    Как сделать проброс портов в Ubuntu

    Проброс портов в Ubuntu server может происходить разными путями. Причем у каждого метода есть своя специфическая методика.

    С помощью маршрутизатора

    Пусть есть конкретная ситуация:

    $EXT_IP – внешний, реальный IP-адрес шлюза

    $INT_IP – внутренний IP-адрес шлюза, в локальной сети

    $LAN_IP – внутренний IP-адрес сервера, предоставляющего службы внешнему миру

    $SRV_PORT – порт службы. Для веб-сервера равен 80, для SMTP – 25 и т. д.

    eth0- внешний интерфейс шлюза. Именно ему присвоен сетевой адрес $EXT_IP

    eth1 – внутренний интерфейс шлюза, с адресом $INT_IP

    А для облегчения понимания, в таких блоках рассмотрены конкретные ситуации:

    1.2.3.4 – внешний адрес шлюза

    192.168.0.1 – внутренний адрес шлюза

    В локальной сети работает веб-сервер (порт 80) для сайта webname.dom

    192.168.0.22 – внутренний адрес веб-сервера

    Тогда методика проведения проброса портов будет выглядеть следующим образом:

    1. Маршрутизация: установка параметров маршрутизатора iptables -t nat -A PREROUTING —dst2.3.4 -p tcp —dport 80 -j DNAT —to-destination 192.168.0.22 и установка процесса iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.0.22 -p tcp -m tcp —dport 80 -j ACCEPT .
    2. Для разрешения доступа других пользователей с другими адресами: iptables -t nat -A POSTROUTING —dst168.0.22 -p tcp —dport 80 -j SNAT —to-source 192.168.0.1.
    3. Для предотвращения переадресации к маршрутизатору: iptables -t nat -A OUTPUT —dst2.3.4 -p tcp —dport 80 -j DNAT —to-destination 192.168.0.22.

    Для автоматического запуска изучаемого процесса можно создать скрипт.

    И дальнейшее обращение к пробросу будет выполняться пользователем записью в командной строке: ./script.sh 192.168.0.56 20,21.

    С помощью установки Hamachi в Ubuntu

    Технология немного отличается от предыдущего варианта:

    1. Скачивание, загрузка и «сборка» необходимого пакета программы: wgethttps: //secure.logmein.com/labs/logmein-hamachi_2.1.0.119-1_amd64.deb; sudo apt-get install lsb; dpkg -i logmein-hamachi_2.1.0.119-1_amd64.deb.
    2. Запуск программы, наименование гаджета и подключение к сети: service logmein-hamachi start hamachi login; hamachi set-nick $NAME; hamachi join $NAME_NETWORK.
    3. Выбор необходимой сети: hamachi list.
    4. Далее следует изменить настройки: sudo apt-get install rinetd; nano /etc/rinetd.conf; IP_in port_in IP_out port_out.
    5. Перезапустить службу: service rinetd restart.
    6. Выключить менеджер задач: sudo ufw disable.

    Осталось только перезагрузить систему.

    С помощью Squid

    Он используется для контроля слишком большого трафика.

    Алгоритм также прост:

    1. Установка: sudo apt-get install squid3.
    2. Настройка: /etc/squid/squid.conf.

    Затем действия идут такие же, как и в предыдущем варианте.

    С помощью Iptables

    Такая программа аналогична первому варианту. Собственно алгоритм будет такой же:

    1. Маршрутизация: установка параметров маршрутизатора iptables -t nat -A PREROUTING —dst2.3.4 -p tcp —dport 80 -j DNAT —to-destination 192.168.0.22 и установка процесса iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.0.22 -p tcp -m tcp —dport 80 -j ACCEPT.
    2. Для разрешения доступа других пользователей с другими адресами: iptables -t nat -A POSTROUTING —dst168.0.22 -p tcp —dport 80 -j SNAT —to-source 192.168.0.1.
    3. Для предотвращения переадресации к маршрутизатору: iptables -t nat -A OUTPUT —dst2.3.4 -p tcp —dport 80 -j DNAT —to-destination 192.168.0.22.

    Для автоматического запуска изучаемого процесса можно создать скрипт.

    И дальнейшее обращение к пробросу будет делаться пользователем записью в командной строке: ./script.sh 192.168.0.56 20,21.

    Распространенные ошибки

    Самая важная проблема и часто возникающая ошибка у начинающих пользователей – открытые порты. Они являются гарантом небезопасного нахождения в виртуальном пространстве. Для решения этой проблемы существуют различные программные обеспечения.

    Заключение

    Проброс портов в Ubuntu – очень важный процесс в комфортной работе с различными данными компьютера. Однако надо точно выполнять различные методики, иначе могут трудноразрешимые проблемы.

    Источник

    Читайте также:  Microsoft powerpoint ��� mac os
Оцените статью