В этой статье поговорим о том, как можно перенаправить трафик с 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. Но для начала нам нужно включить форвардинг пакетов на нашем сервере:
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
Для автоматического включения открываем файл /etc/sysctl.conf
и ищем там строку #net.ipv4.ip_forward=1
, убираем знак комментария.
sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
Настройка port forwarding на Linux
Итак, приступим. Для выполнения поставленной задачи, перенаправление порта 2222 на порт 22 другой машины, необходимо добавить следующие правила iptables:
sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -j ACCEPT
Это правило разрешает прохождение входящих пакетов внутрь сети.
Теперь опишем форвардинг (forwarding) пакетов:
sudo iptables -t nat -A PREROUTING -p tcp -d 80.81.82.83 --dport 2222 -j DNAT --to-destination 10.0.7.2:22
sudo iptables -t nat -A POSTROUTING -p tcp --sport 22 --dst 10.0.7.2 -j SNAT --to-source 80.81.82.83:2222
- Первая строка подменяет IP адрес приемника (белый IP) на внутренний (серый IP)
- Вторая адрес отправителя (серый IP) на внешний (белый IP).
- 10.0.7.2 — IP адрес машины в локальной сети, на который перенаправляет трафик.
- 80.81.82.83 — внешний IP адрес нашего сервера.
- 22 — внутренний порт локальной машины
- 2222 — внешний порт для подключения.
Перенаправления всего трафика
Если есть необходимость проброса всего трафика, то выполним следующее правило.
iptables -t nat -A PREROUTING -p tcp -d 80.81.82.83 -j DNAT --to-destination 10.0.7.2
iptables -t nat -A POSTROUTING -p tcp --dst 10.0.7.2 -j SNAT --to-source 80.81.82.83
Для сохранения наших правил необходимо создать файл и подгружать его при каждой перезагрузки системы, иначе правила iptables которые мы написали слетять. Для этого набираем в терминале следующее:
sudo nano /etc/nat
содержимое файла по первому примеру:
#!/bin/sh
# Перенаправляем ssh с 2222 на 22 IP-10.0.7.2
iptables -t nat -A PREROUTING -p tcp -d 80.81.82.83 --dport 2222 -j DNAT --to-destination 10.0.7.2:22
iptables -t nat -A POSTROUTING -p tcp -dst 10.0.7.2 --sport 22 -j SNAT --to-source 80.81.82.83:2222
Далее открываем файл interfaces
sudo nano /etc/network/interfaces
И добавляем в конце следующую строчку:
pre-up /etc/nat
Данное выражение подгрузить правила iptables после перезагрузки системы.
Как посмотреть правила iptables
Посмотреть текущие правила iptables можно с помощью команды:
sudo iptables -L -t nat
Пример:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere 80.81.82.83 tcp dpt:2222 to:10.0.7.2:22
Chain POSTROUTING (policy ACCEPT)
SNAT tcp -- 10.0.7.2 anywhere tcp spt:ssh to:80.81.82.83:2222
Вот и все, на этом рассмотрение проброса портов в операционных системах под управлением Linux с помощью iptables завершено.
[endtxt]