Обо всём.

«Проброс» порта внутрь сети через iptables

14 апреля 2015, 21:28

Для примера рассматриваю случай, когда на машине установлены Linux containers (LXC) и нужно «пробросить» порт для соединения по ssh c машиной-гостем напрямую. На машине-хосте один сетевой интерфейс и он имеет статический IP 192.168.1.100, порт с которым надо будет соединяться чтобы получить доступ к гостю выберем 1022, гостевая машина находится в виртуальной подсети и имеет IP 10.0.3.150, а порт на ней у ssh стандартный 22.

iptables -t nat -I PREROUTING -p tcp -d 192.168.1.100 --dport 1022 -j DNAT --to 10.0.3.150:22
iptables -A FORWARD -p tcp -d 10.0.3.150 --dport 22 -j ACCEPT

В Ubuntu и Debian можно установить пакет iptables-persistent, который запомнит все текущие настройки iptables и будет загружать во время старта системы.
Если делается проброс в одной сети (например, с какой-то целью надо было перебросить соединение с 192.168.1.100:1022 на 192.168.1.150:22), необходимо добавить:

iptables -t nat -I POSTROUTING -p tcp -d 192.168.1.150 --dport 22 -j SNAT --to-source 192.168.1.100

Подробности этого случая хорошо описаны в статье Проброс порта на другой комп, iptables:

Пакет прилетает на сервер A в цепочку PREROUTING, правило (DNAT) изменяет адрес назначения на IP:PORT сервера B. Таким образом пакет не попадает на сервер A, и переходит в цепочку POSTROUTING, тут правило (SNAT) подменяет адрес обратно на сервера A, чтобы сервер B отправлял ответный пакет на сервер A.

В остальном рекомендую «курить» man iptables.

Post ScriptumСтатьи с меткой bash я пишу в первую очередь для себя, чтобы не искать концы по всему интернету и не восстанавливать подолгу последовательность команд, поэтому здесь всё кратко и по делу. Если тебе, читатель, есть что сказать — пиши мне на email с любым именем пользователя в домене второго уровня.

Популярное