Перенаправление портов, также называемое маппингом портов, представляет собой метод, позволяющий удаленным устройствам подключаться к определенной службе в вашей частной локальной сети (LAN). Как следует из названия, этот процесс включает в себя перенаправление запросов к определенному порту на другой порт или сеть. Он изменяет назначение пакета в процессе передачи и считается типом операции трансляции сетевых адресов (NAT)ы.
Включение перенаправления портов позволяет устройствам или хостам, не подключенным к внутренней сети, получать доступ друг к другу, что в противном случае ограничено, когда эта функция отключена. Вы можете использовать преимущества перенаправления портов для блокировки целевых веб-сайтов, повышения безопасности и обхода брандмауэра NAT в удобное для вас время.
В этом руководстве мы расскажем вам о шагах по перенаправлению портов с помощью iptables в Linux.
Предварительные требования
Чтобы следовать этому руководству, вам понадобятся:
- Установленная Ubuntu в вашей системе.
- Два хоста Ubuntu 20.04 в одном дата-центре с включенной частной сетью.
- Учетная запись пользователя без прав root, настроенная с привилегиями sudo на каждой машине.
Сведения о хосте
Во-первых, нам нужно знать сведения об интерфейсах и адресах рабочих серверов. Давайте проверим сетевые интерфейсы нашей системы:
|
1 |
ip -4 addr show scope global |
Вы увидите вывод:
|
1 2 3 4 5 6 7 8 9 |
Пример вывода 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, назначенный адресу 192.51.100.45, а второй eth1, назначенный адресу 192.168.1.5. Из этих двух интерфейсов один является публичным, а другой — частным. Мы запустим команду, чтобы различить их и определить публичный интерфейс, подключенный к вашему шлюзу по умолчанию. Чтобы различить их, введите:
|
1 |
ip route show | grep default= |
Вы увидите вывод:
|
1 2 3 |
Вывод: ip route show | grep default |
Фиктивные данные для руководства
В этом руководстве мы будем использовать фиктивные адреса и назначения интерфейсов. Вы можете использовать эти данные или заменить их по своему усмотрению.
Сетевые данные веб-сервера:
-
Публичный IP-адрес: 203.0.113.2
-
Частный IP-адрес: 192.0.2.2
-
Публичный интерфейс: eth0
-
Частный интерфейс: eth1
Сетевые данные брандмауэра:
-
Публичный IP-адрес: 203.0.113.15
-
Частный IP-адрес: 192.0.2.15
-
Публичный интерфейс: eth0
-
Частный интерфейс: eth1
Настройка веб-сервера
Давайте начнем с нашего хоста веб-сервера. Сначала войдите в систему под своим sudo пользователем.
Установка Nginx
Сначала мы установим Nginx на нашем хосте веб-сервера и заблокируем его так, чтобы он прослушивал только свой частный интерфейс. Это позволит нашему веб-серверу быть доступным только в том случае, если мы правильно настроили перенаправление портов.
Затем обновите локальный кэш пакетов и используйте apt для загрузки и установки Nginx:
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
Добавление ограничений
После установки Nginx на хосте веб-сервера мы заблокируем его, чтобы он принимал входящие соединения только с частных интерфейсов и ниоткуда больше. Кроме того, это гарантирует, что наши веб-серверы будут активны только в том случае, если настройка перенаправления портов выполнена правильно.
Чтобы добавить ограничения, откройте файл конфигурации блока сервера по умолчанию /etc/nginx/sites-enabled/default в любом текстовом редакторе по вашему выбору (здесь мы используем текстовый редактор nano) и введите:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
В выводе вы увидите, что директива listen появляется дважды:

В этом руководстве мы используем первую директиву для демонстрации перенаправления IPv4. Вторую, настроенную для IPv6, можно удалить. Добавьте частный IP-адрес вашего веб-сервера с двоеточием непосредственно перед 80, чтобы указать Nginx принимать входящие соединения только с частного интерфейса. Затем отредактируйте директиву:

После завершения сохраните и закройте файл. Прежде чем двигаться дальше, убедитесь в отсутствии синтаксических ошибок. Давайте протестируем файл:
|
1 |
sudo nginx -t |

Если ошибок не обнаружено, вы можете перезапустить Nginx и применить новую конфигурацию:
|
1 |
sudo service nginx restart |
Проверка сетевого ограничения
Давайте проверим уровень доступа к нашему веб-серверу. Попробуйте получить доступ к веб-серверу через частный интерфейс с помощью curl команды:
|
1 |
curl --connect-timeout 5 192.0.2.2 |
Вы увидите следующий вывод:

Если мы попытаемся использовать публичный интерфейс, мы не сможем подключиться:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused |
Это именно то, чего мы ожидали.
Настройка брандмауэра для перенаправления порта 80
Давайте продолжим нашу работу по внедрению перенаправления портов на нашей машине с брандмауэром.
Включение перенаправления в ядре
По умолчанию на большинстве систем перенаправление портов выключено. Мы внесем изменения, чтобы включить перенаправление портов, сделав несколько правок. Также есть возможность включить перенаправление портов на постоянной основе, используя привилегии sudo , как показано в следующих шагах.
Чтобы включить перенаправление трафика на уровне ядра, введите:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
Чтобы включить перенаправление портов на постоянной основе, отредактируйте файл /etc/sysctl.conf . Откройте файл с привилегиями sudo и введите:
|
1 |
sudo nano /etc/sysctl.conf |
Внутри найдите и раскомментируйте строку, которая выглядит следующим образом:
|
1 |
net.ipv4.ip_forward=1 |
После завершения сохраните и закройте файл. Затем используйте команды sysctl для применения изменений в настройках, чтобы они вступили в силу:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
Базовая настройка брандмауэра
Сначала ознакомьтесь с руководством по настройке базового брандмауэра на вашей машине. По завершении у вас будет:
- Установлен iptables-persistent
- Сохранен набор правил по умолчанию в /etc/iptables/rules.v4
- Исчерпывающие знания о добавлении и изменении правил с помощью iptables команды
Также вы можете узнать, как просмотреть и удалить правила брандмауэра iptables.
Добавление правил перенаправления
Мы настроим наш брандмауэр так, чтобы трафик, поступающий на наш публичный интерфейс ( eth0 ) на порту 80 перенаправлялся на наш частный интерфейс ( eth1). По умолчанию в нашем базовом брандмауэре цепочка FORWARD настроена на DROP трафика. Добавление правил брандмауэра позволит перенаправлять соединения на наш веб-сервер. Для повышения безопасности мы ограничим правила брандмауэра, чтобы разрешить только необходимые запросы на перенаправление.
В цепочке FORWARD мы будем принимать новые соединения, предназначенные для порта 80 поступающие с нашего публичного интерфейса и направляющиеся на наш частный интерфейс. Мы будем идентифицировать новые соединения с помощью расширения conntrack и представлять их с помощью TCP SYN пакета:
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
Вам необходимо разрешить любой последующий трафик в обоих направлениях, возникающий в результате входящего соединения. Введите команды ниже, чтобы разрешить трафик ESTABLISHED и RELATED между нашими публичным и частным интерфейсами:
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Давайте проверим, установлена ли наша политика для цепочки FORWARD в значение DROP:
|
1 |
sudo iptables -P FORWARD DROP |
К настоящему моменту мы добавили несколько правил, которые позволяют трафику проходить между нашими публичным и приватным интерфейсами через брандмауэр. Однако iptables еще не настроен для направления трафика, так как конфигурация правил брандмауэра еще не завершена. На следующих шагах мы добавим правила NAT и скорректируем постоянный набор правил для направления трафика.
Добавление правил NAT для направления пакетов
Мы выполним две отдельные операции, чтобы iptables мог корректно изменять пакеты и оптимизировать взаимодействие с клиентами и веб-сервером.
DNAT — это первая операция, которая начинает цепочку PREROUTING таблицы nat Эта операция изменяет адрес назначения пакета и позволяет правильно маршрутизировать его при прохождении между сетями. Однако клиенты в публичной сети будут подключаться к нашему серверу брандмауэра и не будут иметь информации о топологии нашей приватной сети. Чтобы передавать информацию в приватную сеть, измените адрес назначения каждого пакета, чтобы он мог правильно достичь нашего целевого веб-сервера.
Важно отметить, что мы сосредоточены на настройке перенаправления портов. Выполнение NAT для каждого пакета, попадающего на брандмауэр, не входит в рамки нашего руководства. Мы будем сопоставлять пакеты на порту 80 с приватным IP-адресом нашего веб-сервера:
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
Пакет будет правильно перенаправлен на наш веб-сервер, содержащий исходный адрес клиента в качестве адреса источника. Несмотря на попытки сервера отправить ответ напрямую на этот адрес, установить легитимное TCP-соединение будет невозможно.
Чтобы настроить правильную маршрутизацию, мы изменим адрес источника пакета. Давайте изменим адрес источника на приватный IP-адрес нашего сервера брандмауэра. После изменения ответ будет отправлен обратно на брандмауэр, который перенаправит его клиенту.
Чтобы включить эту функцию, добавьте правило в цепочку POSTROUTING таблицы nat которая оценивается непосредственно перед отправкой пакетов в сеть. Затем сопоставьте пакеты, предназначенные для нашего веб-сервера, по IP-адресу и порту:
|
1 |
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 |
Как только это правило вступит в силу, наш веб-сервер должен стать доступен при переходе в веб-браузере по публичному адресу нашего брандмауэра:
|
1 |
curl 203.0.113.15 |
Вы увидите следующий вывод:

Настройка перенаправления портов завершена.
Корректировка постоянного набора правил
После завершения настройки перенаправления портов мы сохраним ее в наш постоянный набор правил. Если вы хотите сохранить комментарии в текущем наборе правил, используйте службу iptables-persistent для сохранения ваших правил:
|
1 |
sudo service iptables-persistent save |
Вы также можете открыть его и отредактировать вручную, чтобы сохранить комментарии в файле:
|
1 |
sudo nano /etc/iptables/rules.v4 |
Затем настройте таблицу filter и таблицу nat для добавления правил цепочки FORWARD и правил ROUTING соответственно. Корректировка таблицы nat позволит нам добавить правила PREROUTING и POSTROUTING как показано в примере ниже:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/правила.v4 *фильтр # Разрешить все исходящие, но сбрасывать входящие и пересылаемые пакеты по умолчанию :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Пользовательские цепочки для отдельных протоколов :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Допустимый UDP-трафик # Допустимый TCP-трафик -A TCP -p tcp --dport 22 -j ACCEPT # Допустимый ICMP-трафик # Шаблонная политика разрешения -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Сбрасывать некорректные пакеты -A INPUT -m conntrack --ctstate INVALID -j DROP # Передавать трафик в цепочки для конкретных протоколов ## Разрешать только новые соединения (установленные и связанные уже должны быть обработаны) ## Для TCP дополнительно разрешать только новые SYN-пакеты, так как это единственный допустимый ## способ установления нового TCP-соединения -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # Отклонять все, что дошло до этого момента ## Постарайтесь указать конкретный протокол в сообщении об отклонении -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # Правила для перенаправления порта 80 на наш веб-сервер # Сетевые параметры веб-сервера: # * Публичный IP-адрес: 203.0.113.2 # * Приватный IP-адрес: 192.0.2.2 # * Публичный интерфейс: eth0 # * Приватный интерфейс: eth1 # # Сетевые параметры межсетевого экрана: # # * Публичный IP-адрес: 203.0.113.15 # * Приватный IP-адрес: 192.0.2.15 # * Публичный интерфейс: eth0 # * Приватный интерфейс: eth1 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Конец правил фильтрации Forward # Применить изменения COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Правила для трансляции запросов к порту 80 публичного интерфейса # чтобы мы могли корректно перенаправлять их на веб-сервер, используя # приватный интерфейс. # Сетевые параметры веб-сервера: # * Публичный IP-адрес: 203.0.113.2 # * Приватный IP-адрес: 192.0.2.2 # * Публичный интерфейс: eth0 # * Приватный интерфейс: eth1 # # Сетевые параметры межсетевого экрана: # # * Публичный IP-адрес: 203.0.113.15 # * Приватный IP-адрес: 192.0.2.15 # * Публичный интерфейс: eth0 # * Приватный интерфейс: eth1 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 -A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --to-source 192.0.2.15 # Конец трансляций NAT для трафика веб-сервера COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
После добавления указанных выше значений сохраните и закройте файл. Затем введите команду ниже, чтобы протестировать синтаксис ваших правил:
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
Если ошибок нет, загрузите набор правил:
|
1 |
sudo service iptables-persistent reload |
Давайте проверим, что наш веб-сервер по-прежнему доступен через публичный IP-адрес вашего межсетевого экрана:
|
1 |
curl 203.0.113.15 |
Заключение
К концу этого руководства вы научитесь уверенно перенаправлять порты на сервере Linux с помощью iptables. Вы можете использовать возможности перенаправления портов, чтобы скрыть топологию вашей частной сети, одновременно оптимизируя трафик служб для его свободного прохождения через ваш шлюзовой межсетевой экран.
Поскольку этот процесс напрямую зависит от безопасности вашей сети и используемых портов, он безопасен. Риск может возникнуть, если в вашей сети нет межсетевого экрана или VPN. Поэтому рекомендуется настроить межсетевой экран, как описано в этом руководстве. Надеемся, что это руководство поможет вам оставаться в безопасности в Интернете при использовании вашей частной сети.
Чтобы подробнее изучить другие решения для межсетевого экрана, которые вы можете внедрить в своей системе, ознакомьтесь со следующими ресурсами в нашем блоге:
- Настройка межсетевого экрана с помощью UFW в Ubuntu 18.04
- Настройка межсетевого экрана с помощью FirewallD в CentOS 7
- Основы UFW: изучение основных команд межсетевого экрана
Приятной работы!
Комментарии
Комментариев пока нет. Будьте первым.