Как настроить проброс портов iptables

Проброс портов в локальную сеть с помощью 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 отправит этот пакет на внутреннюю машину.

    Источник

    Настройка netfilter с помощью iptables

    Утилита командной строки iptables используется для настройки брандмауэра netfilter, встроенного в систему на базе ядра Linux.

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

    Принцип настройки

    Общий синтаксис использования iptables:

    iptables -t [номер]

    Правила netfilter распределены по 4-м таблицам, каждая из которых имеет свое назначение (подробнее ниже). Она указывается ключом -t, но если данный параметр не указан, действие будет выполняться для таблицы по умолчанию — filter.

    Команды указывают, какое именно действие мы совершаем над netfilter, например, создаем или удаляем правило.

    В каждой таблице есть цепочки, для каждой из которых создаются сами правила. Например, для вышеупомянутой таблицы filter есть три предопределенные цепочки — INPUT (входящие пакеты), OUTPUT (исходящие) и FORWARD (транзитные).

    [номер]

    Некоторые команды требуют указания номера правила, например, на удаление или редактирование.

    Условие описывает критерии отработки того или иного правила.

    Ну и, собственно, что делаем с пакетом, если он подходит под критерии условия.

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

    Ключи iptables и примеры их использования

    Для работы с таблицами (iptables -t)

    Напоминаю, все правила в netfilter распределены по таблицам. Чтобы работать с конкретной таблицей, необходимо использовать ключ -t.

    Ключ Описание
    -t filter Таблица по умолчанию. С ней работаем, если упускаем ключ -t. Встроены три цепочки — INPUT (входящие), OUTPUT (исходящие) и FORWARD (проходящие пакеты)
    -t nat Для пакетов, устанавливающий новое соединение. По умолчанию, встроены три цепочки — PREROUTING (изменение входящих), OUTPUT (изменение локальных пакетов перед отправкой) и POSTROUTING (изменение всех исходящих).
    -t mangle Для изменения пакетов. Цепочки — INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING.
    -t raw Для создания исключений в слежении за соединениями. Цепочки: PREROUTING, OUTPUT.

    Команды

    Нижеперечисленные ключи определяют действия, которые выполняет утилита iptables.

    Ключ Описание и примеры
    -A Добавление правила в конец списка:
    iptables -A INPUT -s 192.168.0.15 -j DROP
    запретить входящие с 192.168.0.15.
    -D Удаление правила:
    iptables -D INPUT 10
    удалить правило в цепочке INPUT с номером 10.
    -I Вставка правила в определенную часть списка:
    iptables -I INPUT 5 -s 192.168.0.15 -j DROP
    вставить правило 5-м по списку.
    -R Замена правила.
    iptables -R OUTPUT 5 -s 192.168.0.15 -j ACCEPT
    заменить наше 5-е правило с запрещающего на разрешающее.
    -F Сброс правил в цепочке.
    iptables -F INPUT
    -Z Обнуление статистики.
    iptables -Z INPUT
    -N Создание цепочки.
    iptables -N CHAINNEW
    -X Удаление цепочки.
    iptables -X CHAINNEW
    -P Определение правила по умолчанию.
    iptables -P INPUT DROP
    -E Переименовывание цепочки.
    iptables -E CHAINNEW CHAINOLD

    Условия

    Данные ключи определяют условия правила.

    Ключ Описание и примеры
    -p Сетевой протокол. Допустимые варианты — TCP, UDP, ICMP или ALL.
    iptables -A INPUT -p tcp -j ACCEPT
    разрешить все входящие tcp-соединения.
    -s Адрес источника — имя хоста, IP-адрес или подсеть в нотации CIDR.
    iptables -A INPUT -s 192.168.0.50 -j DROP
    запретить входящие с узла 192.168.0.50
    -d Адрес назначения. Принцип использования аналогичен предыдущему ключу -s.
    iptables -A OUTPUT -d 192.168.0.50 -j DROP
    запретить исходящие на узел 192.168.0.50
    -i Сетевой адаптер, через который приходят пакеты (INPUT).
    iptables -A INPUT -i eth2 -j DROP
    запретить входящие для Ethernet-интерфейса eth2.
    -o Сетевой адаптер, с которого уходят пакеты (OUTPUT).
    iptables -A OUTPUT -o eth3 -j ACCEPT
    разрешить исходящие с Ethernet-интерфейса eth3.
    —dport Порт назначения.
    iptables -A INPUT -p tcp —dport 80 -j ACCEPT
    разрешить входящие на порт 80.
    —sport Порт источника.
    iptables -A INPUT -p tcp —sport 1023 -j DROP
    запретить входящие с порта 1023.

    Перечисленные ключи также поддерживают конструкцию с использованием знака !. Он инвертирует условие, например,
    iptables -A INPUT -s ! 192.168.0.50 -j DROP
    запретит соединение всем хостам, кроме 192.168.0.50.

    Действия

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

    Таблица Действие Описание
    filter ACCEPT Разрешает пакет.
    DROP Запрещает пакет.
    REJECT Запрещает с отправкой сообщения источнику.
    nat MASQUERADE Для исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет.
    SNAT Аналогично MASQUERADE, но с указанием конкретного сетевого интерфейса, чей адрес будет использоваться для подмены.
    DNAT Подмена адреса для входящих пакетов.
    REDIRECT Перенаправляет запрос на другой порт той же самой системы.
    mangle TOS Видоизменение поля TOS (приоритезация трафика).
    DSCP Изменение DSCP (тоже приоритезация трафика).
    TTL Изменение TTL (время жизни пакета).
    HL Аналогично TTL, но для IPv6.
    MARK Маркировка пакета. Используется для последующей фильтрации или шейпинга.
    CONNMARK Маркировка соединения.
    TCPMSS Изменение значения MTU.

    Примеры часто используемых команд iptables

    Общие команды

    Просмотр правил с их номерами:

    iptables -L —line-numbers

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

    Источник

    Проброс портов в Линукс с помощью 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

    Даем доступ интерфейсу 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.
    Для этого добавляем правила:

    Источник

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

    Источник

    Читайте также:  Телевизор лджи настроить цифровое телевидение без приставки как
Оцените статью