Как выполнить проброс портов в Ubuntu Server
Papa-jobs.ru

Ремонт телефонов

Как выполнить проброс портов в Ubuntu Server

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

С увеличением количества компьютеров, необходимое количество IP адресов увеличивалось и диапазона IPv4 начало не хватать. Тогда была разработана технология NAT, которая позволяет нескольким компьютерам объединяться в локальную сеть и быть доступными из внешней сети по IP адресу маршрутизатора.

Когда пакет приходит на маршрутизатор, выполняется выяснение какому устройству он был адресован и замена ip адресата на нужный. Кроме переопределения IP получателя и отправителя, NAT может изменять порты. Это называется проброс портов и может быть полезно если вы создали частную сеть, но все же хотите пропускать некоторые виды трафика. Всем этим можно управлять с помощью iptables. В этой статье мы рассмотрим как выполняется проброс портов iptables в Linux.

Как работает NAT?

Чтобы иметь возможность общаться с другими компьютерами в сети компьютер должен иметь уникальный ip адрес. Но поскольку количество адресов уменьшалось нужно было придумать технологию, которая позволяла бы давать один адрес нескольким машинам. И была придумана технология NAT или Network Address Translation.

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

Недостаток в том, что инициировать подключение извне нельзя, потому что маршрутизатор просто еще не знает к кому обращаются. Тут на помощь приходит проброс портов. Мы можем сказать роутеру: при поступлении пакетов на порт 80 перенаправлять их на порт 80 компьютера 192.168.1.2. Теперь адрес отправителя и порт будет заменяться на указанный нами и пакет будет передан туда, куда нужно. Если на маршрутизаторе установлен Linux, то все это можно настроить с помощью iptables.

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

Первое что нужно сделать, это включить переадресацию трафика на уровне ядра, если это еще не сделано. Для этого выполните:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Чтобы настройка сохранялась после перезагрузки используйте такую команду:

sudo sysctl -w net.ipv4.ip_forward=1

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

Настройка прохождения пакетов

Сначала мы рассмотрим как разрешить прохождение пакетов через маршрутизатор. Для этого в брандмауэре есть цепочка FORWARD. По умолчанию для всех пакетов применяется правило DROP, которое означает что все нужно отбросить. Сначала разрешим инициализацию новых соединений, проходящих от eth0 до eth1. Они имеют тип contrack и представлены пакетом SYN:

sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp –syn –dport 80 -m conntrack –ctstate NEW -j ACCEPT

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

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

Это еще не проброс портов, мы только разрешили определенному трафику, а именно на порт 80, проходить через маршрутизатор на другие машины локальной сети. Теперь настроим правила, которые будут отвечать за перенаправление трафика.

Модификация пакетов в iptables

Далее мы настроим правила, которые будут указывать как и куда нужно перенаправить пакеты, приходящие на порт 80. Сейчас маршрутизатор может их пропускать в сеть, но он еще не знает куда. Для этого нам нужно будет настроить две вещи – модификацию адреса назначения (Destination) DNAT и модификацию адреса отправителя (Source) SNAT.

Правила DNAT настраиваются в цепочке PREROUTING, в таблице NAT. Эта операция изменяет адрес назначения пакета чтобы он достиг нужной нам цели, когда проходит между сетями. Клиенты будут отправлять пакеты нашему маршрутизатору, и им не нужно знать топологию внутренней сети. Пакет автоматически будет приходить нашему веб-серверу (192.168.1.2).

С помощью этого правила мы перенаправляем все пакеты, пришедшие на порт 80, к 192.168.1.2 опять же на порт 80:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.1.2

Но это только половина работы. Пакет будет иметь исходный адрес клиента, а значит будет пытаться отправить ответ ему. Так как клиент ожидает получить ответ от маршрутизатора, то нормального TCP соединения не получиться. Чтобы решить эту проблему нужно модифицировать адрес источника и заменить его на адрес маршрутизатора 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, то нужно указать его после ip адреса:

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

Также может понадобиться выполнить проброс диапазона портов iptables, для этого просто укажите диапазон, например, 1000:2000:

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

После добавления этого правила можете проверять работу перенаправление портов iptables будет выполняться и все будет отправляться так, как нужно.

Сохранение настроек iptables

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

sudo service iptables-persistent save

Готово. Теперь проброс портов iptables ubuntu будет работать так, как нужно.

Выводы

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

На завершение, видео о том, что такое NAT:

Проброс и перенаправление портов в iptables

Проброс трафика за NAT или проброс трафика на другой сервер

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

Определимся с переменными, которые будут использоваться в статье:

$EXT_IP – внешний, реальный IP-адрес шлюза;
$INT_IP – внутренний IP-адрес шлюза, в локальной сети;
$LAN_IP – внутренний IP-адрес сервера, предоставляющего службы внешнему миру;
$SRV_PORT – порт службы. Для веб-сервера равен 80, для SMTP – 25 и т.д.;
eth0 – внешний интерфейс шлюза. Именно ему присвоен сетевой адрес $EXT_IP;
eth1 – внутренний интерфейс шлюза, с адресом $INT_IP;

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

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

Рассмотрим пример

Если входящий пакет пришёл извне на шлюз (1.2.3.4), но предназначен веб-серверу (порт 80), то адрес назначения подменяется на локальный адрес 192.168.1.50. И впоследствии маршрутизатор передаст пакет в локальную сеть.

Дальше принимается решение о маршрутизации. В результате пакет пойдёт по цепочке FORWARD таблицы filter, поэтому в неё надо добавить разрешающее правило. Оно может выглядеть, например, так:

Рассмотрим пример

Пропустить пакет, который пришёл на внешний интерфейс, уходит с внутреннего интерфейса и предназначен веб-серверу (192.168.1.50:80) локальной сети.

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

Допустим, 192.168.1.31 – ip-адрес клиента внутри локальной сети.

  1. Пользователь вводит в адресную строку браузера адрес example.com;
  2. Сервер обращается к DNS и разрешает имя example.com в адрес 1.2.3.4;
  3. Маршрутизатор понимает, что это внешний адрес и отправляет пакет на шлюз;
  4. Шлюз, в соответствии с нашим правилом, подменяет в пакете адрес 1.2.3.4 на 192.168.1.50, после чего отправляет пакет серверу;
  5. Веб-сервер видит, что клиент находится в этой же локальной сети (обратный адрес пакета – 192.168.1.31) и пытается передать данные напрямую клиенту, в обход шлюза;
  6. Клиент игнорирует ответ, потому что он приходит не с 1.2.3.4, а с 192.168.1.50;
  7. Клиент и сервер ждут, но связи и обмена данными нет.

Есть два способа избежать данной ситуации.

Первый – разграничивать обращения к серверу изнутри и извне, для этого создать на локальном DNS-сервере А-запись для example.com указывающую на 192.168.1.50

Второй – с помощью того же iptables заменить обратный адрес пакета.
Правило должно быть добавлено после принятия решения о маршрутизации и перед непосредственной отсылкой пакета. То есть – в цепочке POSTROUTING таблицы nat.

Рассмотрим пример

Если пакет предназначен веб-серверу, то обратный адрес клиента заменяется на внутренний адрес шлюза.
Этим мы гарантируем, что ответный пакет пойдёт через шлюз.

Надо дополнительно отметить, что это правило важно только для внутренних клиентов. Ответ внешним клиентам пойдёт через шлюз в любом случае.

Читать еще:  Оригинальный коврик для мыши своими руками

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

Рассмотрим пример

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

rules.sh

Теперь, чтобы обеспечить доступ извне к локальному FTP по адресу 192.168.1.52, достаточно набрать в консоли от имени супер-пользователя:

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

Перенаправление портов нужно в том случае, если мы хотим «замаскировать» внутреннюю службу, обеспечив к ней доступ извне не по стандартному, а совсем по другому порту.

Пусть $FAKE_PORT – обманный порт на внешнем интерфейсе шлюза, подключившись к которому мы должны попасть на адрес $LAN_IP и порт $SRV_PORT .

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

Как выполнить проброс портов в Ubuntu Server

Добрый день. Есть шлюз на Ubuntu Server 10.04. Стоит задача пробпросить порт на IP-камеру внутри сети. Условия:
eth0 – внешний интерфейс
eth1 – внутренний
10.100.10.150 – внутренний IP камеры
188.163.192.178 – внешний IP шлюза
8000 – порт для проброса

Соответствующие правила добавил, но результата не получил. Ниже вывод iptables-save. Подскажите, куда копать и что подправить.

# Generated by iptables-save v1.4.4 on Wed Jan 29 11:36:35 2014
*mangle
:PREROUTING ACCEPT [12658249:9894759752]
:INPUT ACCEPT [6485360:5436368592]
:FORWARD ACCEPT [6172678:4458381891]
:OUTPUT ACCEPT [6899629:5486552867]
:POSTROUTING ACCEPT [13062408:9944261107]
COMMIT
# Completed on Wed Jan 29 11:36:35 2014
# Generated by iptables-save v1.4.4 on Wed Jan 29 11:36:35 2014
*nat
:PREROUTING ACCEPT [209568:20457546]
:POSTROUTING ACCEPT [128551:8441493]
:OUTPUT ACCEPT [138678:9183467]
-A PREROUTING -d 188.163.192.178/32 -i eth1 -p tcp -m multiport –dports 80,8080 -j ACCEPT
-A PREROUTING -i eth1 -p tcp -m multiport –dports 80,8080 -j REDIRECT –to-ports 3128
-A PREROUTING -d 188.163.192.178/32 -p tcp -m tcp –dport 8000 -j DNAT –to-destination 10.100.10.150:8000
-A POSTROUTING -s 10.100.10.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -d 10.100.10.150/32 -p tcp -m tcp –dport 8000 -j SNAT –to-source 188.163.192.178
COMMIT
# Completed on Wed Jan 29 11:36:35 2014
# Generated by iptables-save v1.4.4 on Wed Jan 29 11:36:35 2014
*filter
:INPUT DROP [83597:8761067]
:FORWARD DROP [63:3416]
:OUTPUT DROP [10133:742247]
:ssh_brute_check – [0:0]
-A INPUT -p icmp -f -j DROP
-A INPUT -p tcp -m conntrack –ctstate NEW -m tcp ! –tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A INPUT -p tcp -m conntrack –ctstate INVALID,NEW -m tcp –tcp-flags SYN,ACK SYN,ACK -j REJECT –reject-with tcp-reset
-A INPUT -s 127.0.0.1/32 -i lo -j ACCEPT
-A INPUT -s 10.100.10.0/24 -i lo -j ACCEPT
-A INPUT -p tcp -m tcp –tcp-flags FIN,SYN,RST,ACK RST -m limit –limit 1/sec -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp –sport 53 -j ACCEPT
-A INPUT -p udp -m udp –sport 53 -j ACCEPT
-A INPUT -p tcp -m conntrack –ctstate NEW -m tcp –dport 22 -j ssh_brute_check
-A INPUT -s 10.100.10.0/24 -i eth1 -p tcp -m multiport –dports 25,53,110,137,138,139,445,631,953,3128,80,8080,993,995,443 -j ACCEPT
-A INPUT -s 10.100.10.0/24 -i eth1 -p udp -m multiport –dports 53,67,68,123,137,138,139,445,631,953 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp –dport 25 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp –dport 110 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp –dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp –dport 8080 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp –dport 3128 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp –sport 123 -j ACCEPT
-A INPUT -p tcp -m tcp –dport 3389 -j ACCEPT
-A INPUT -p tcp -m tcp –dport 3390 -j ACCEPT
-A INPUT -p tcp -m tcp –dport 5000 -j ACCEPT
-A INPUT -s 10.100.40.0/24 -p tcp -j ACCEPT
-A INPUT -s 10.100.40.0/24 -p udp -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -p tcp -m tcp –sport 53 -j ACCEPT
-A FORWARD -p tcp -m tcp –dport 53 -j ACCEPT
-A FORWARD -p udp -m udp –sport 53 -j ACCEPT
-A FORWARD -p udp -m udp –dport 53 -j ACCEPT
-A FORWARD -d 10.100.10.0/24 -i tun0 -o eth1 -j ACCEPT
-A FORWARD -s 10.100.10.0/24 -i eth1 -o tun0 -j ACCEPT
-A FORWARD -d 10.100.10.0/24 -i eth0 -o eth1 -m state –state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.100.10.0/24 -i eth1 -o eth0 -j ACCEPT
-A FORWARD -i eth0 -p tcp -m tcp –dport 8000 -j ACCEPT
-A OUTPUT -d 127.0.0.1/32 -o lo -j ACCEPT
-A OUTPUT -d 10.100.10.0/24 -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp –dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp –dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp –dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp –sport 22 -j ACCEPT
-A OUTPUT -d 10.100.10.0/24 -o eth1 -p tcp -m multiport –sports 25,53,110,137,138,139,445,631,953,3128,80,8080,993,995,443 -j ACCEPT
-A OUTPUT -d 10.100.10.0/24 -o eth1 -p udp -m multiport –sports 53,67,68,123,137,138,139,445,631,953 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp –sport 25 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp –dport 25 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp –sport 110 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp –dport 110 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp –sport 80 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp –dport 80 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp –sport 8080 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp –dport 8080 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp –sport 3128 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp –dport 3128 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m udp –dport 123 -j ACCEPT
-A OUTPUT -p tcp -m tcp –sport 3389 -j ACCEPT
-A OUTPUT -p tcp -m tcp –sport 3390 -j ACCEPT
-A OUTPUT -p tcp -m tcp –sport 5000 -j ACCEPT
-A OUTPUT -d 10.100.40.0/24 -p tcp -j ACCEPT
-A OUTPUT -d 10.100.40.0/24 -p udp -j ACCEPT
-A ssh_brute_check -m conntrack –ctstate NEW -m recent –update –seconds 600 –hitcount 3 –name DEFAULT –rsource -j LOG –log-level 6
-A ssh_brute_check -m conntrack –ctstate NEW -m recent –update –seconds 600 –hitcount 3 –name DEFAULT –rsource -j DROP
-A ssh_brute_check -m recent –set –name DEFAULT –rsource -j ACCEPT
COMMIT
# Completed on Wed Jan 29 11:36:35 2014

Ответить | Правка | Cообщить модератору

Оглавление

  • Проброс портов Ubuntu Server, iptables, pavel_simple, 17:56 , 29-Янв-14, (1)
  • Проброс портов Ubuntu Server, iptables, ACCA, 07:36 , 30-Янв-14, (2)

Сообщения по теме [Сортировка по времени | RSS]

>[оверквотинг удален]
> :POSTROUTING ACCEPT [13062408:9944261107]
> COMMIT
> # Completed on Wed Jan 29 11:36:35 2014
> # Generated by iptables-save v1.4.4 on Wed Jan 29 11:36:35 2014
> *nat
> :PREROUTING ACCEPT [209568:20457546]
> :POSTROUTING ACCEPT [128551:8441493]
> :OUTPUT ACCEPT [138678:9183467]
> -A PREROUTING -d 188.163.192.178/32 -i eth1 -p tcp -m multiport –dports 80,8080
> -j ACCEPT

данное правило определяет судьбу того что вы хотите — и в дальнейшем обработка dnat’ом не производится.
> -A PREROUTING -i eth1 -p tcp -m multiport –dports 80,8080 -j REDIRECT
> –to-ports 3128
> -A PREROUTING -d 188.163.192.178/32 -p tcp -m tcp –dport 8000 -j DNAT
> –to-destination 10.100.10.150:8000

а вот заход из внешних сетей должен проходить сдесь
> -A POSTROUTING -s 10.100.10.0/24 -o eth0 -j MASQUERADE
> -A POSTROUTING -d 10.100.10.150/32 -p tcp -m tcp –dport 8000 -j SNAT
> –to-source 188.163.192.178

а вот это опять лишнее.
>[оверквотинг удален]
> -A FORWARD -p tcp -m tcp –sport 53 -j ACCEPT
> -A FORWARD -p tcp -m tcp –dport 53 -j ACCEPT
> -A FORWARD -p udp -m udp –sport 53 -j ACCEPT
> -A FORWARD -p udp -m udp –dport 53 -j ACCEPT
> -A FORWARD -d 10.100.10.0/24 -i tun0 -o eth1 -j ACCEPT
> -A FORWARD -s 10.100.10.0/24 -i eth1 -o tun0 -j ACCEPT
> -A FORWARD -d 10.100.10.0/24 -i eth0 -o eth1 -m state –state RELATED,ESTABLISHED
> -j ACCEPT
> -A FORWARD -s 10.100.10.0/24 -i eth1 -o eth0 -j ACCEPT
> -A FORWARD -i eth0 -p tcp -m tcp –dport 8000 -j ACCEPT

но в форварде нет разрешающего правила , которое бы разрешало трафик извне на внутренний ip/порт

>[оверквотинг удален]
> -A OUTPUT -p tcp -m tcp –sport 5000 -j ACCEPT
> -A OUTPUT -d 10.100.40.0/24 -p tcp -j ACCEPT
> -A OUTPUT -d 10.100.40.0/24 -p udp -j ACCEPT
> -A ssh_brute_check -m conntrack –ctstate NEW -m recent –update –seconds 600 –hitcount
> 3 –name DEFAULT –rsource -j LOG –log-level 6
> -A ssh_brute_check -m conntrack –ctstate NEW -m recent –update –seconds 600 –hitcount
> 3 –name DEFAULT –rsource -j DROP
> -A ssh_brute_check -m recent –set –name DEFAULT –rsource -j ACCEPT
> COMMIT
> # Completed on Wed Jan 29 11:36:35 2014

собственно поэтому и не работает

ИТ База знаний

Полезно

— Узнать IP – адрес компьютера в интернете

— Онлайн генератор устойчивых паролей

— Онлайн калькулятор подсетей

— Калькулятор инсталляции IP – АТС Asterisk

— Руководство администратора FreePBX на русском языке

— Руководство администратора Cisco UCM/CME на русском языке

— Руководство администратора по Linux/Unix

Навигация

Серверные решения

Телефония

FreePBX и Asterisk

Настройка программных телефонов

Корпоративные сети

Протоколы и стандарты

Популярное и похожее

Установка VirtualBox 6.0 на Linux

15 примеров CURL в Linux

Мониторинг пропускной способности и скорости сети в Linux

Топ – 20 полезных команд CentOS

Grandstream GXW4108

Про SSH port forwarding в Linux

SSH туннели один из самых часто используемых методов связи среди системных и сетевых администраторов. В данном руководстве расскажем о такой функции как переброс порта SSH. Это используется для безопасной передачи данных между двумя и более системами.

Что такое переброс порта SSH?

Коротко, переброс порта SSH даёт возможность создавать туннель между несколькими системами, а затем настроить эти системы так, чтобы трафик они гнали через этот туннель. Именно по такой логике работает VPN или SOCKS Proxy.

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

  • Локальный переброс порта позволяет получать доступ ко внешним ресурсам из локальной сети и работать в удаленной системе, как если бы они находились в одной локальной сети. По такому принципу работает Remote Access VPN.
  • Переброс удаленного порта дает возможность удалённой системе получать доступ к вашей локальной сети.
  • Динамический переброс создает SOCKS прокси сервер. После этого настраиваем приложения так, чтобы они использовали это туннель для передачи данных. Чаще всего такой переброс используется для доступа к ресурсам, который по той или иной причине заблокированы для данной страны.

Для чего нужен переброс порта SSH?

Допустим у вас есть какое-то приложение, которые передаёт данные в открытом виде или через нешифрованный протокол. Ввиду того, что SSH создает шифрованное соединение, то вы с легкостью можете настроить программу так, чтобы трафик её шёл через этот туннель.

Он так же часто используется для доступа к внутренним ресурсам извне. Приблизительно это напоминает Site-to-Site VPN, где нужно указывать какой именно трафик нужно заворачивать в туннель.

Сколько сессий можно устанавливать?

Теоретически, можно создавать столько сессий, сколько нам захочется. В сети используется 65 535 различных портов, и мы можем перебрасывать любой из этих портов.

Но при перебросе порта нужно учитывать, что некоторые из них зарезервированы за конкретными сервисами. Например, HTTP использует 80 порт. Значит, переброс на порт 80 возможен только если нужно переадресовать веб трафик.

Порт, который перебрасывается на локальном хосте может не совпадать с портом удаленной системы. Мы легко можем перебросить локальный порт 8080 на порт 80 на удаленной машине. Иными словами, если мы напишем IP адрес нашей машины и порт 8080, то запрос пойдет на 80 порт удалённой системы.

Если вам не критично какой порт использовать на своем хосте, лучше выбрать что-то из диапазона 2000-10000, так как все порты ниже 2000 зарезервированы.

Переброс локального порта

Локальная пересылка представляет собой переброс порта из клиентской системы на сервер. Он позволяет настроить порт в системе таким образом, чтобы все соединения на этот порт проходили через туннель SSH.

Для переадресации локального порта используется ключ L. Общий синтаксис команды таков:

Данной командой мы говорим системе, что все запросы на 8080 порт example1.com переадресовывать на example2.com. Это часто используется когда нужно организовать доступ извне на внутренний ресурсы компании.

Тестирование работы переадресованного порта

Чтобы проверить, работает ли переадресация должным образом можно воспользоваться утилитой netcat. На машине, где была запущена команда переадресации нужно ввести команду netcat в следующем виде:

Если переадресация работает и трафик проходит, то утилита вернёт “Успех!”. В противном случае выдаст ошибку об истечении времени ожидания.

Если что-то не работает, нужно убедиться, что подключение к удаленному порту по SSH работает корректно и запросы не блокируются межсетевым экраном.

Создание постоянного туннеля (Autossh)

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

По умолчанию, Autossh не установлен. Чтобы установить эту утилиту введем команду ниже.

Синтаксис утилиты autossh почти похож на синтаксис ssh:

Переброс удалённого порта

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

А общий синтаксис команды выглядит так:

Динамическая переадресация портов

Динамическая переадресация портов позволит ssh функционировать как прокси-сервер. Вместо переброса трафика на специфический порт, здесь трафик будет идти через на диапазон портов.

Если вы когда-нибудь пользовались прокси сервером для посещения заблокированного сайта или просмотра контента, недоступного в вашем регионе, вероятнее всего вы пользовались SOCKS сервером.

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

Таким образом, если нужно весь трафик идущий на порт 1234 направить на SSH сервер, нужно ввести команду:

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

Множественная переадресация

Иногда приходится перебрасывать несколько внутренних портов на несколько внешних. Допустим у нас на одном и том же сервере крутятся и веб сервер и oracale. В таком случае мы можем указать несколько условий переадресации ставя перед каждым из них ключ L для локальной переадресации и R для внешней.

Просмотр списка туннелей

Чтобы просмотреть сколько SSH туннелей активны на данный момент можно прибегнуть к помощи команды lsof:

Как видим, на нашей системе сейчас активно три подключения. Чтобы вместо имени хоста показать IP адрес к команде нужно добавить ключ n.

Ограничение переадресации портов

По умолчанию, переброс портов SSH активен для всех. Но если нужно ограничить переадресацию портов в целях безопасности, то нужно отредактировать файл sshd_config.

$ sudo vi /etc/ssh/sshd_config

Здесь есть несколько опций, позволяющих ограничивать создание SSH туннелей.

PermitOpen позволяет прописать адреса, для которых можно включить переадресацию портов. Тут можно указать конкретный IP адреса или название хоста:

AllowTCPForwarding данная опция включает или отключает переадресацию портов для SSH. Так же можно указать какой тип переадресации допускается на этом хосте.

Для подробной информации можно вызвать руководство по файлу sshd_config:

Уменьшение задержки

Проблема с переадресацией портов на SSH это возможность увеличения задержки. При работе с текстовой информацией э то не критично. Проблема даёт о себе знать если по сети идёт много трафика, а SSH сервер настрое как SOCKS сервер, то есть на нём настроена динамический переброс портов.

Это происходит по той причине, что SSH туннели по сути это TCP туннель поверх TCP. Это не очень эффективный метод передачи данных.

Для решения проблемы можно настроить VPN, но если по какой-то причине предпочитаете SSH туннели, то существует программа sshuttle, которая устраняет проблему. На Ubuntu или других дистрибутивах семейства Debian программу можно установить командой

Если же программы нет в репозиториях дистрибутива, то можно взять ее с GitHub:

Настройка туннеля в sshuttle отличается от SSH. Чтобы завернуть весь трафик в туннель нужно ввести следующую команду:

Прервать соединение можно комбинацией клавиш Ctrl+C. Чтобы запустить sshuttle как демон, нужно добавить ключ D.

Чтобы убедиться что туннель поднят и в глобальной сети показывается другой IP, в терминале можно ввести команду:

Или же просто открыть любой другой сайт, который покажет белый IP и местоположение.

Полезна ли Вам эта статья?

Пожалуйста, расскажите почему?

😪 Нам жаль, что статья не была полезна для вас 🙁 Пожалуйста, если не затруднит, укажите по какой причине? Мы будем очень благодарны за подробный ответ. Спасибо, что помогаете нам стать лучше!

😍 Подпишитесь на нашу еженедельную рассылку, и мы будем присылать самые интересные публикации 🙂 Просто оставьте свои данные в форме ниже.

Предложение от 8host.com

Форвардинг портов через шлюз Linux в Iptables

NAT (network address translation, или трансляция сетевых адресов) – это технология перенаправления пакетов на альтернативный адрес. Как правило, она помогает трафику преодолеть границы сети. Хост, который реализует NAT, как правило, имеет доступ к двум или нескольким сетям и настроен для маршрутизации трафика между ними.

Форвардинг портов (или перенаправление портов) – это процесс переадресации запросов одного порта на другой хост, порт или сеть. Поскольку этот процесс изменяет назначение передаваемого пакета, он считается операцией NAT.

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

Требования

Для работы вам понадобится:

  • Два хоста Ubuntu 14.04 в одном датацентре с включенной частной сетью.
  • Пользователь с доступом к sudo на каждом хосте.

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

Данные хостов

Сначала нужно узнать свои сетевые интерфейсы. Чтобы узнать интерфейсы хостов и связанные с ними адреса, введите:

ip -4 addr show scope global
2: eth0 :
mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 198.51.100.45 /18 brd 45.55.191.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1 :
mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.5 /16 brd 10.132.255.255 scope global eth1
valid_lft forever preferred_lft forever

Вывод показал два интерфейса, eth0 и eth1, и присвоенные им адреса, 192.51.100.45 и 192.168.1.5 соответственно. Чтобы узнать свой открытый интерфейс, введите:

ip route show | grep default
default via 111.111.111.111 dev eth0

Команда выведет на экран интерфейс, подключенный к шлюзу по умолчанию (в данном примере это eth0). Обычно это и есть открытый интерфейс.

Найдите эти значения на каждой машине и используйте их в дальнейшей работе.

Условные данные руководства

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

  • Внешний IP: 203.0.113.2
  • Внутренний IP: 192.0.2.2
  • Открытый интерфейс: eth0
  • Закрытый интерфейс: eth1
  • Внешний IP: 203.0.113.15
  • Внутренний IP: 192.0.2.15
  • Открытый интерфейс: eth0
  • Закрытый интерфейс: eth1

Настройка веб-сервера

Установка Nginx

Сначала нужно установить Nginx и настроить его для прослушивания закрытого интерфейса. Так веб-сервер будет доступен только в случае правильной настройки форвардинга портов.

Обновите индекс пакетов и установите пакет:

sudo apt-get update
sudo apt-get install nginx

Настройка Nginx

Откройте виртуальный хост по умолчанию:

sudo nano /etc/nginx/sites-enabled/default

В нём найдите директиву listen:

server <
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
. . .
>

В файле она встречается дважды. В первой директиве listen нужно указать внутренний IP веб-сервера и задать порт 80.

Данное руководство предназначено только для IPv4, потому вторую директиву listen, для IPv6, можно просто удалить.

server <
listen 192.0.2.2:80 default_server;
. . .
>

Сохраните и закройте файл. Проверьте синтаксис на наличие ошибок:

Если ошибок нет, перезапустите Nginx:

sudo service nginx restart

Проверка настройки Nginx

Теперь нужно убедиться, что Nginx доступен только на закрытом интерфейсе.

Перейдите на сервер брандмауэра и попробуйте получить доступ к закрытому интерфейсу веб-сервера:

curl –connect-timeout 5 192.0.2.2

Welcome to nginx!

Welcome to nginx!

Попробуйте использовать открытый интерфейс:

curl –connect-timeout 5 203.0.113.2
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused

Настройка форвардинга

Перейдите на сервер брандмауэра.

Включение форвардинга в ядро

Сначала нужно включить форвардинг на уровне ядра. По умолчанию в большинстве систем эта функция отключена.

Чтобы включить форвардинг на одну сессию, введите:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Чтобы включить форвардинг на постоянной основе, нужно отредактировать файл /etc/sysctl.conf.

sudo nano /etc/sysctl.conf

Найдите и раскомментируйте эту строку:

Сохраните и закройте файл, а затем обновите настройки:

sudo sysctl -p
sudo sysctl –system

Настройка брандмауэра

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

  • Установить iptables-persistent.
  • Сохранить набор правил по умолчанию в /etc/iptables/rules.v4.
  • Научиться добавлять и редактировать правила брандмауэра.

Настроив свой брандмауэр, можно добавить в него правила перенаправления портов.

Правила форвардинга

Итак, теперь нужно настроить брандмауэр таким образом, чтобы трафик, поступающий на порт 80 открытого интерфейса eth0, перенаправлялся на закрытый интерфейс eth1.

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

Цепочка FORWARD будет принимать новые соединения, предназначенные для порта 80 и поступающие от открытого интерфейса, и передавать их закрытому интерфейсу. Новые соединения обнаруживаются по расширению conntrack и пакету TCP SYN.

sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp –syn –dport 80 -m conntrack –ctstate NEW -j ACCEPT

Это правило пропустит через брандмауэр первый пакет, который предназначен для создания соединения. Также необходимо разрешить любой последующий трафик в обоих направлениях, что является результатом этого соединения. Чтобы разрешить трафик между открытым и закрытым интерфейсом (ESTABLISHED,RELATED), введите:

iptables -A FORWARD -i eth0 -o eth1 -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT

Если цепочка FORWARD использует другую политику по умолчанию, установите в ней политику DROP:

sudo iptables -P FORWARD DROP

Теперь брандмауэр пропускает трафик между открытым и закрытым интерфейсом. Однако пока iptables ещё не знает, как именно нужно направлять этот трафик.

Правила NAT

Теперь нужно добавить правила iptables для маршрутизации трафика. Чтобы iptables мог правильно изменять пакеты и поддерживать взаимодействие между клиентами и веб-сервером, нужно выполнить две операции.

Первая операция, DNAT, будет выполняться в цепи PREROUTING таблицы nat. Эта операция изменяет целевой адрес пакета. Клиенты будут подключаться к серверу брандмауэра по общедоступной сети, не подозревая о перенаправлении пакетов. Нужно изменить адрес получателя каждого пакета, чтобы пакет, попадая в частную сеть, знал, как найти веб-сервер.

NAT не нужно применять ко всем пакетам, которые прошли брандмауэр. Настройте NAT для пакетов, поступающих на порт 80 внутреннего IP-адреса (в данном примере это 192.0.2.2).

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.0.2.2

Теперь пакет будет перенаправлен на веб-сервер. Однако на данный момент исходным адресом пакета все еще остается адрес клиента. Сервер попытается отправить ответ непосредственно на этот адрес, в результате чего TCP-соединение не будет легитимным.

Чтобы настроить правильную переадресацию, нужно также изменить исходный адрес пакета. Этот адрес нужно заменить внутренним IP-адресом сервера брандмауэра (в данном примере это 192.0.2.15). После этого ответ будет отправлен на сервер брандмауэра, а уже оттуда он попадёт к клиенту.

Для этого нужно добавить правило в цепочку POSTROUTING в таблицу nat. Она читается непосредственно перед отправкой пакетов по сети.

sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp –dport 80 -d 192.0.2.2 -j SNAT –to-source 192.0.2.15

Теперь веб-сервер будет доступен в браузере, если направить его на внешний адрес хоста брандмауэра.

curl 203.0.113.15

Welcome to nginx!

Welcome to nginx!

Форвардинг портов настроен.

Сохранение правил

Добавив правила для форвардинга портов, нужно сохранить их в наборе постоянных правил брандмауэра.

Если в постоянном наборе правил нет важных комментариев, можете просто использовать такую команду:

sudo service iptables-persistent save

Чтобы сохранить комментарии, откройте файл и отредактируйте его вручную:

sudo nano /etc/iptables/rules.v4

Отредактируйте конфигурации в таблице filter, в цепочке FORWARD. Также нужно отредактировать таблицу nat, в которую нужно добавить правила PREROUTING и POSTROUTING. В данном случае эти правила будут выглядеть так:

*filter
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# Custom per-protocol chains
:UDP – [0:0]
:TCP – [0:0]
:ICMP – [0:0]
# Acceptable UDP traffic
# Acceptable TCP traffic
-A TCP -p tcp –dport 22 -j ACCEPT
# Acceptable ICMP traffic
# Boilerplate acceptance policy
-A INPUT -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Drop invalid packets
-A INPUT -m conntrack –ctstate INVALID -j DROP
# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack –ctstate NEW -j UDP
-A INPUT -p tcp –syn -m conntrack –ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack –ctstate NEW -j ICMP
# Reject anything that’s fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT –reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT –reject-with tcp-reset
-A INPUT -j REJECT –reject-with icmp-proto-unreachable
# Rules to forward port 80 to our web server
# Web server network details:
# * Public IP Address: 203.0.113.2
# * Private IP Address: 192.0.2.2
# * Public Interface: eth0
# * Private Interface: eth1
#
# Firewall network details:
#
# * Public IP Address: 203.0.113.15
# * Private IP Address: 192.0.2.15
# * Public Interface: eth0
# * Private Interface: eth1
-A FORWARD -i eth0 -o eth1 -p tcp –syn –dport 80 -m conntrack –ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o eth1 -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eth1 -o eth0 -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT
# End of Forward filtering rules
# Commit the changes
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Rules to translate requests for port 80 of the public interface
# so that we can forward correctly to the web server using the
# private interface.
# Web server network details:
# * Public IP Address: 203.0.113.2
# * Private IP Address: 192.0.2.2
# * Public Interface: eth0
# * Private Interface: eth1
#
# Firewall network details:
#
# * Public IP Address: 203.0.113.15
# * Private IP Address: 192.0.2.15
# * Public Interface: eth0
# * Private Interface: eth1
-A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.0.2.2
-A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp –dport 80 -j SNAT –to-source 192.0.2.15
# End of NAT translations for web server traffic
COMMIT
*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

Сохраните и закройте файл.

Проверьте ошибки в файле:

sudo iptables-restore -t

Если ошибок нет, обновите список правил:

sudo service iptables-persistent reload

Убедитесь, что веб-сервер всё ещё доступен по внешнему адресу сервера брандмауэра:

Заключение

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

Ссылка на основную публикацию
Adblock
detector
1. “Проброс портов Ubuntu Server, iptables” + / –
Сообщение от pavel_simple (ok) on 29-Янв-14, 17:56