Linux проброс портов без nat

Поднимаем VPN-туннель из мира домой в обход NAT

.

Хочу рассказать вам про то как имея в интернете свой VPS-сервер можно поднять туннель в домашнюю сеть. И не платить при этом за статический IP провайдеру, и даже находясь за NAT, все равно сделать доступными в интернете свои домашние сервисы.

Исходные данные

  • VPS сервер на debian со статическим реальным IP
  • роутер с прошивкой OpenWRT, который находится за провайдерским NAT
  • домашняя сеть с компьютерами и виртуальными машинами в 192.168.1.0/24

Настройка туннеля

Первым делом установим и настроим OpenVPN сервер на нашем VPS:

Отредактируем файл конфигурации:

Здесь 10.9.8.x будет наша VPN-сеть, в которой адрес 10.9.8.1 мы назначем VPN-серверу, а адрес 10.9.8.2 VPN-клиенту.
Последняя строчка являет ссобой статисческий маршрут, который нужен для того, что бы наш VPS знал что путь в нашу домашнюю сеть лежит через роутер

Еще нам нужно сгенерировать ключ с которым будет подключаться к серверу наш роутер:

И можно запускать демона:

Теперь установим OpenVPN на наш роутер с которого мы будем инициализировать VPN-соединение:

Скопируем ключ на наш рутер, исполюзуя scp:

Отредактируем конфигурацию интерфейса:

keepalive 60 180
Означает следующее: каждые 60 секунд посылать ping на удаленный хост, и, если за 180 секунд не было получено ни одного пакета — то перезапускать туннель.

И проверим, все ли у нас заработает:

Если все ок, то запустим и добавим OpenVPN демона в автозапуск:

Маршрутизация

Теперь настроим маршрутизацию.

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

Создадим файлик и запишем в него эти правила:

Cделаем его исполняемым:

И добавим его в /etc/rc.local для автозапуска:

Добавлять нужно перед exit 0

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

Вот так, к примеру, выглядит проброс ssh порта на одну из машин у меня в домашней сети:

Где XX.XX.XX.XXX — внешний IP сервера, 192.168.1.200 — IP моей машины внутри домашней сети, 666 — порт при обращении к которому я попадаю на эту машину

PS: Если у вас что-то не получается убедитесь что на вашем VPS есть и подключены все необходимые для этого модули ядра

Источник

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

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

Порты в Linux

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

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

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

Читайте также:  Загрузка без бренда windows 10 что это

Проброс портов в 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-сертификаты и прочее.

Читайте также:  Cisco packet tracer kali linux

Нужно, чтобы клиенты, обращающиеся на 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. Все должно получиться. Когда это произойдет, не забудьте выключить логирование (иначе размер лог-файла станет огромным).

Источник

Проброс портов в Линукс с помощью iptables

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

C его помощью, например, можно достаточно легко организовать локальную сеть с NAT.

Начнем с краткого описания нужных операций в iptables:

Синтаксис: iptables -t *таблица* *команда*

Ключи:
-L — список правил
-F — удалить все правила
-A — добавить правило
пример: iptables -t *таблица* -A *цепочка* *правило*
-D — удалить правило

пример: iptables -t *таблица* -D *цепочка* *номер правила*

Для сохранения текущих правил выполните:

И так, допустим, у нас есть локальная сеть, и нам необходимо обеспечить ее Интернетом, а так же пробросить порты с внешнего адреса в локальную сеть.

Для начала нам нужно включить форвардинг:

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

1. Доступ в Интернет

Предположим, что eth0 подключен к провайдеру и имеет IP-адрес в его подсети, допустим 199.199.199.2.
eth1 подключен к компьютеру в локальной сети, которому нужно обеспечить доступ в Интернет через NAT.
eth1 имеет адрес 10.10.10.1.
IP-адрес компьютера, которому необходимо обеспечить доступ — 10.10.10.2

Читайте также:  Как с помощью командной строки загрузить windows с флешки

Даем доступ интерфейсу eth1 с IP-адреса 10.10.10.2:

или всей подсети:

2. Проброс порта

Взависимости от ситуации внешний порт можно пробросить на локальную машину.

Например, у нас имеется ftp сервер внутри сети — 10.10.10.2 порт 21,и нам нужно разрешить пользователям подключаться к нему из Интеренета.
Внешний адрес — 199.199.199.2, адрес ftp — 10.10.10.2, порт — 21.

Первое правило добавляется в табицу трасляции (-t nat), оно перенапрявляет пакеты, посланные на порт 21, с адреса 199.199.199.2 на 10.10.10.2.
Второе правило разрешает пакетам проходить по данному маршруту.

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

В случае переадресации внешний порт можно изменить, например, с 21 на 4321.
Например, нам надо замаскировать сервис так, чтобы при подключении к 199.199.199.2:4321 клиент попадал на 192.168.0.2:21.
Для этого добавляем правила:

Источник

Проброс портов (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.

Источник

Оцените статью