Как включить форвардинг в ubuntu

Обновлено: 06.07.2024

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

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

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

Требования

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

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

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

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

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

ip -4 addr show scope global
2: eth0 : <BROADCAST,MULTICAST,UP,LOWER_UP> 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 : <BROADCAST,MULTICAST,UP,LOWER_UP> 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
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
>
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
. . .

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

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

Чтобы настроить правильную переадресацию, нужно также изменить исходный адрес пакета. Этот адрес нужно заменить внутренним 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
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
>
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
. . .

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

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

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

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

sudo service iptables-persistent save

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

sudo nano /etc/iptables/rules.v4

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

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

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

sudo iptables-restore -t < /etc/iptables/rules.v4

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

sudo service iptables-persistent reload

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

Заключение

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

Как включить/выключить IP Forwarding в Linux

Почти во всех распространенных дистрибутивах IP Forwarding выключен по-умолчанию и это имеет смысл, так как далеко не каждый его использует. Но в том случае, если вы планируете поднять собственный маршрутизатор на ОС Linux, настроить VPN сервер и так далее, вам необходимо включить форвардинг пакетов (маршрутизацию транзитных IP-пакетов, т.е. тех пакетов, которые не предназначены именно для вашего компьютера) в вашей ОС. В данной мини-инструкции я расскажу как это можно сделать:

Проверяем включен или нет IP Forwarding в данный момент

Для проверки в каком состоянии в данный момент находится форвардинг пакетов (включен или выключен), мы должны сделать запрос к ядру через команду sysctl. Делается это так:

В ответ мы получим текущий статус (1 - включен, 0 - выключен)

Временно включаем/отключаем IP Forwarding

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

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

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

Постоянно включаем/отключаем IP Forwarding в системе

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

Для перманентного включения IP Forwarding, в конец данного файла добавляем следующую строчку:

Для перманентного отключения IP Forwarding, в конец данного файла добавляем следующую строчку:

. И сохраняем отредактированный файл.

Если в конфигурационном файле /etc/sysctl.conf уже есть настройка net.ipv4.ip_forward и она не закомментирована, то можно в ней выставить нужное значение и добавлять в конец файла эту настройку еще раз - нет необходимости

Далее, чтобы применить новую настройку, которую мы добавили, нам необходимо выполнить следующую команду:


В определенных сценариях может потребоваться настроить переадресацию IP в системе Linux.

Если сервер Linux действует как брандмауэр, маршрутизатор или устройство NAT, он должен быть способен пересылать пакеты, предназначенные для других пунктов назначения (кроме него самого).

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

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

В этом руководстве мы рассмотрим пошаговые инструкции по включению или отключению IP-переадресации с помощью примеров командной строки.

Вы можете применить эти команды к любому крупному дистрибутиву Linux, включая популярные версии, такие как Ubuntu и Red Hat.

Как проверить текущий статус переадресации IP

Большинство систем смогут использовать команду sysctl, которая может применять переменные ядра.

Следовательно, вы можете использовать следующую команду sysctl, чтобы проверить, включена или отключена переадресация IP.

В приведенном выше примере параметр ядра net.ipv4.ip_forward равен 0.

Это означает, что переадресация выключена.

Если бы значение было бы 1, это означало бы, что включена.

Этот параметр также можно просмотреть в файле /proc/sys/net/ipv4/ip_forward в системах с systemd или любой другой системой инициализации.


Включение или отключение IP переадресации

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

Вы также можете изменить настройку внутри /proc/sys/net/ipv4/ip_forward, чтобы включить или выключить настройку.

Ubuntu Server. Настраиваем форвардинг портов на роутере.

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

По сути форвардинг (перенаправление, проброс на жаргоне) портов дает возможность вынести определенные сервисы локальной сети в интернет. Это дает возможность держать почтовые (Web, FTP и т.п.) сервера в более безопасной зоне локальной сети (а лучше в DMZ).

При этом следует осознавать потенциальную опасность подобного способа по сравнению с VPN или DirectAccess доступом, в данном случае ваши сервисы будут доступны всем желающим и стоит уделить особое внимание безопасности подобного решения.

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

port-forwarding.jpg

В данном случае у нас имеется локальная сеть 10.0.0.0/24 в которой присутствует сервер терминалов по адресу 10.0.0.2, роутер с внутренним адресом 10.0.0.1 и внешним 192.168.64.134 (данный адрес взят нами для примера, в реальности здесь должен быть белый IP адрес) и ноутбук во внешней сети, который должен получить доступ к серверу терминалов.

Наиболее очевидным способом для многих будет форвардинг портов при помощи iptables, однако, прежде чем рубить с плеча, вспомним, каким образом работает iptables. Данный момент очень важен и предупреждает ситуации: "я все сделал как написано, но не работает". Правила (цепочки) iptables обрабатываются последовательно, в порядке их перечисления в файле /etc/nat. Допустим у нас там записано три правила:

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

Это правило разрешает прохождение входящих пакетов на порт 3389 внутрь сети. Теперь опишем форвардинг:

Первая строка подменяет адрес приемника на внутренний ip, а вторая адрес отправителя на внешний. Сохраняем файл, перезагружаем сервер:

Проверяем, все должно работать:

port-forwarding2.jpg

Как видим, ничего сложного. Главное - понимание того, что вы делаете. Не тупое повторение скопированных команд, а знание того, что вы делаете, зачем и почему именно таким образом. Успехов!

Читайте также: