Проброс портов linux: NAT Linux (nat iptables linux)

Проброс портов 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 до eth2. Они имеют тип contrack и представлены пакетом SYN:

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

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

sudo iptables -A FORWARD -i eth0 -o eth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A FORWARD -i eth2 -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 eth2 -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 eth2 -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 eth2 -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:

https://youtu.be/F7kCOa6PybQ

 

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

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

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

Содержание статьи

  • 1 Порты в Linux
  • 2 Проброс портов в Linux
  • 3 Перенаправление портов в Linux
  • 4 Перенаправление с одного ip на другой в Linux

Порты в 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=eth2 # Для шлюза они вряд ли изменятся, поэтому можно прописать вручную.
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 сервера в локальной сети.

IPT="/sbin/iptables"

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

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 и вообще, в разных местах). Подключающимся клиентам это знать незачем, не придется ничего перенастраивать в почтовых программах и т.п.

#!/bin/sh

IF_EXT="eth0"
IPT="/sbin/iptables"

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

Переадресация портов SSH в Linux

Переадресация портов SSH используется для переадресации портов между локальным и удаленным компьютером Linux с использованием протокола SSH. Он в основном используется для шифрования соединений с различными приложениями. Даже если это приложение не поддерживает шифрование SSL, переадресация портов SSH может создать безопасное соединение. Вы даже можете использовать переадресацию портов, чтобы предоставить компьютеру доступ в Интернет без маршрутизируемого в Интернете IP-адреса, чтобы вы могли получить к нему удаленный и безопасный доступ. Есть много других применений переадресации портов SSH.

В основном существует два типа переадресации портов SSH. Переадресация локального порта и переадресация удаленного порта.

В этой статье я покажу вам, как сделать переадресацию портов в Linux. Чтобы следовать этой статье, на вашем компьютере с Linux должны быть установлены утилиты SSH. Я покажу вам, как это сделать, не волнуйтесь. Давайте начнем.

В RHEL 7 и CentOS 7 вы можете установить утилиты SSH с помощью следующей команды:

$ sudo yum install openssh-clients openssh-server

Нажмите y , а затем нажмите для продолжения.

Утилиты SSH должны быть установлены.

Установка утилит SSH в Ubuntu, Debian и других дистрибутивах на основе Ubuntu/Debian

В Ubuntu, Debian, Linux Mint и других дистрибутивах на основе операционной системы Ubuntu/Debian выполните следующую команду для установки утилит SSH:

$ sudo apt-get установить openssh-client openssh-server

Теперь нажмите y , а затем нажмите , чтобы продолжить.

Утилиты SSH должны быть установлены.

Установка утилит SSH в Arch Linux

Если вы используете Arch Linux, выполните следующую команду для установки утилит SSH:

$ sudo pacman -Sy openssh

Теперь нажмите y , а затем нажмите . <Ввод> .

Утилиты SSH должны быть установлены.

В Arch Linux сервер SSH не запускается по умолчанию. Вам придется запустить его вручную с помощью следующей команды:

$ sudo systemctl start sshd

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

$ sudo systemctl enable sshd

Переадресация локального порта

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

Допустим, у вас есть сервер server1 с IP-адресом 192. 168.199.153 . server1 имеет работающий веб-сервер. Конечно, если вы подключены к той же сети, что и сервер server1 , вы можете ввести IP-адрес в браузере и подключиться к server1 со своего компьютера. Но что, если вы хотите получить к нему доступ, как если бы служба работала на вашем компьютере на каком-то порту? Вот что делает локальная переадресация портов.

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

Теперь выполните следующую команду с вашего локального компьютера, чтобы перенаправить порт 80 (http) на порт 6900 (допустим) на локальный компьютер:

$ ssh -L 6900:192.168.199.153:80 localhost

Введите yes и нажмите для продолжения.

Теперь введите пароль вашего локального компьютера и нажмите <Ввод> .

Вы подключены.

Теперь вы можете получить доступ к веб-серверу, который вы использовали раньше, как http://localhost:6900, как вы можете видеть на снимке экрана ниже.

Переадресация удаленного порта

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

Допустим, вы хотите подключиться к веб-серверу вашего локального компьютера из Интернета. Но у него нет интернет-маршрутизируемого IP-адреса. Вы можете использовать удаленный (например, VPS) сервер, к которому можно получить доступ из Интернета, и выполнять с ним удаленную переадресацию портов. У меня нет ВПС. Давайте просто предположим, что server1 — это удаленный сервер.

Сначала настройте сервер1 сервер, чтобы разрешить доступ к переадресованным портам через Интернет.

Для этого отредактируйте /etc/sshd_config с помощью следующей команды:

$ sudo nano /etc/sshd_config

Вы должны увидеть следующее окно.

Прокрутите вниз и найдите GatewayPorts , как показано на скриншоте ниже.

Теперь раскомментируйте его и установите да , как отмечено на скриншоте ниже.

Теперь нажмите + x и затем нажмите y и затем нажмите , чтобы сохранить файл.

Теперь перезапустите SSH-сервер server1 с помощью следующей команды:

$ sudo systemctl restart sshd

На моем локальном компьютере работает веб-сервер, как вы можете видеть на снимке экрана ниже.

Теперь вы можете выполнить следующую команду с локального компьютера, чтобы перенаправить порт 80 (http) вашего локального компьютера на порт 9999 на удаленном сервере server1 с IP-адресом 192. 168.199.153 :

$ ssh -R 9999:localhost:80 192.168.199.153

Введите yes 900 16 и нажмите .

Введите пароль вашего удаленного сервера server1 .

Вы подключены.

Как вы можете видеть на снимке экрана ниже, я могу подключиться к порту 9999 на моем удаленном сервере server1 и получить доступ к моему локальному веб-серверу.

Я также могу подключиться к своему веб-серверу, используя IP-адрес удаленного сервера server1 и перенаправленный порт 9999 с других компьютеров в моей сети, как вы можете видеть на снимке экрана ниже.

Вот как вы выполняете переадресацию портов SSH в Linux. Спасибо, что прочитали эту статью.

linux — Как выполнить перенос с помощью iptables?

спросил

Изменено
3 года, 2 месяца назад

Просмотрено
555 тысяч раз

Я хочу, чтобы соединения, входящие через ppp0 через порт 8001, направлялись на 192. 168.1.200 через eth0 через порт 8080.

У меня есть эти два правила j DNAT —назначение 192.168.1.200:8080
-A FORWARD -m состояние -p tcp -d 192.168.1.200 —dport 8080 —state НОВЫЙ,УСТАНОВЛЕННЫЙ,СВЯЗАННЫЙ -j ПРИНЯТЬ

и это не работает. Что мне не хватает?

  • linux
  • iptables
  • переадресация портов

4

Прежде всего — проверьте, разрешена ли вообще переадресация:

 cat /proc/sys/net/ipv4/conf/ppp0/forwarding
кот /proc/sys/net/ipv4/conf/eth0/форвардинг
 

Если оба возвращают 1 , все в порядке. Если нет, сделайте следующее:

 echo '1' | sudo тройник /proc/sys/net/ipv4/conf/ppp0/форвардинг
эхо '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding
 

Во-вторых, DNAT можно применять только на столе nat . Итак, ваше правило следует расширить, добавив также спецификацию таблицы ( -t nat ):

 iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192. 168.0. 1.200:8080
iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m состояние --state НОВОЕ,УСТАНОВЛЕННОЕ,СВЯЗАННОЕ -j ПРИНЯТЬ
 

Оба правила применяются только к TCP-трафику (если вы хотите изменить и UDP, вам необходимо указать аналогичные правила, но с -p udp набор опций).

Последнее, но не менее важное, это настройка маршрутизации. Тип:

 IP-маршрут
 

и проверьте, есть ли 192.168.1.0/24 среди возвращенных записей маршрутизации.

8

Вы забыли исходный адрес постмаршрутизации SNAT ‘ing:

 sysctl net.ipv4.ip_forward=1
ваш_wan_ip=101.23.3.1
-A PREROUTING -p tcp -m tcp -d $yours_wan_ip --dport 8001 -j DNAT --назначение 192.168.1.200:8080
-A FORWARD -m состояние -p tcp -d 192.168.1.200 --dport 8080 --state НОВЫЙ,УСТАНОВЛЕННЫЙ,СВЯЗАННЫЙ -j ПРИНЯТЬ
-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip
 

И не забудьте установить брандмауэр Linux в качестве шлюза по умолчанию на компьютере с адресом 192. 168.1.200.

2

Я думаю, что вам нужно:

 iptables -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state
    НОВЫЙ,УСТАНОВЛЕННЫЙ,СВЯЗАННЫЙ -j ПРИНЯТЬ
iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --к месту назначения
    192.168.1.200:8080
 

2

Принятое решение работает, когда хост назначения и шлюз находятся в одной и той же подсети (как и в вашем случае, оба находятся в eth0 192.168.1.0/24).

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

1) Включить IP-переадресацию:

 sysctl net.ipv4.conf.eth0.forwarding=1
sysctl net.ipv6.conf.eth0.forwarding=1
 

2) Добавить 2 правила iptables для переадресации определенного TCP-порта:

Чтобы переписать IP-адрес назначения пакета (и обратно в ответном пакете):

 iptables -A PREROUTING -t nat -p tcp -i ppp0 --dport 8001 -j DNAT --назначение 192. 168.1.200:8080
 

Чтобы переписать исходный IP-адрес пакета на IP-адрес шлюза (и обратно в ответном пакете):

 iptables -A POSTROUTING -t nat -p tcp -d 192.168.1.200 --dport 8080 -j МАСКАРАД
 

3) Если у вас нет правила брандмауэра по умолчанию ПРИНЯТЬ , разрешите трафик к месту назначения:

 iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state -- состояние НОВЫЙ,УСТАНОВЛЕННЫЙ,СВЯЗАННЫЙ -j ПРИНЯТЬ
 

4) Проверьте новую установку. Если это работает, убедитесь, что изменения сохраняются после перезагрузки:

 cat < /etc/sysctl.d/99-forwarding.conf
sysctl net.ipv4.conf.eth0.forwarding=1
sysctl net.ipv6.conf.eth0.forwarding=1
EOF
iptables-save > /etc/network/iptables.up.rules
echo '#!/bin/sh' > /etc/network/if-pre-up.d/iptables
echo "`который iptables-restore` < /etc/network/iptables.up.rules" >> /etc/network/if-pre-up.d/iptables
chmod +x /etc/network/if-pre-up. [Yy]$ ]]; затем
  если [[ "удалить" == "$ действие" ]]; затем
    iptables -t nat -D PREROUTING -p tcp -m tcp -d $wan_addr --dport $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -D FORWARD -m состояние -p tcp -d $dest_addr_lan --dport $dest_port_lan --state НОВЫЙ, УСТАНОВЛЕННЫЙ, СВЯЗАННЫЙ -j ПРИНЯТЬ
    iptables -t nat -D POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Правило переадресации удалено"
  еще
    iptables -t nat -A PREROUTING -p tcp -m tcp -d $wan_addr --dport $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -A FORWARD -m состояние -p tcp -d $dest_addr_lan --dport $dest_port_lan --state НОВЫЙ,УСТАНОВЛЕННЫЙ,СВЯЗАННЫЙ -j ПРИНЯТЬ
    iptables -t nat -A POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Добавлено правило переадресации"
  фи
еще
  echo "Информация не подтверждена, выход..."
фи
 

Использование скрипта простое, просто скопируйте и вставьте его в файл, а затем.

 # chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... подтвердите детали ... нажмите y
# Добавлено правило переадресации
 

Чтобы удалить то же правило

 # ./port_forward.sh -r 192.168.1.100 3000
... подтвердите детали ... нажмите y
# Правило переадресации удалено
 

Я подумал, что это может сэкономить кому-то время на соответствующем маршрутизаторе.

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

Хитрость заключалась в том, чтобы использовать МАСКАРАД.

 sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp -d MACHINE_B --dport 443 -j DNAT --назначение MACHINE_C
iptables -t nat -A POSTROUTING -s MACHINE_A -o INTERFACE_NAME -j MASQUERADE
 

Обратите внимание, что вы можете настроить команды:

  1. Чтобы разрешить пересылку пакетов только на определенном интерфейсе. Например:

     sysctl net.