Настраивать проброс портов и общий доступ к интернету через один публичный адрес умеют все, но не все знают, что возможности NAT в netfilter гораздо шире. Сегодня я продемонстрирую тебе эти возможности с помощью синтаксиса команды iptables.

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

 

1:1 NAT

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

Чтобы это сделать, нужно всего лишь указать по одному адресу вместо целой сети в --source/--destination и --to-destination/--to-source соответственно.

Вот команды для сопоставления частного адреса 10.0.0.10 публичному 102.0.2.10:

$ sudo iptables -t nat -I PREROUTING -d 192.0.2.10 -j DNAT --to-destination 10.0.0.10
$ sudo iptables -t nat -I POSTROUTING -s 10.0.0.10 -j SNAT --to-source 192.0.2.10

INFO

Если нет необходимости подключаться к внутреннему адресу из интернета, достаточно одного правила SNAT — об ответах позаботится модуль conntrack, если он не выключен.

 

NETMAP

Что делать, если нужно транслировать не один адрес, а целую сеть? Нередко одной компании бывает нужно подключиться к сети другой — например, к поставщику технической поддержки или иных услуг. Проблемы начинаются, если у поставщика уже есть клиент с такой же сетью, как у тебя.

Здесь на помощь приходит опция NETMAP, которая транслирует одну сеть в другую.

INFO

Полезно знать, что сети для частного использования из RFC 1918 на самом деле очень большого размера. Вот они:

  • 10.0.0.0/8 (до 10.255.255.255);
  • 172.16.0.0/12 (до 172.31.255.255);
  • 192.168.0.0/16 (до 192.168.255.255).

Если выбрать менее популярные адреса, чем 192.168.(0|1).0 или 10.0.0.0, с конфликтом можно не столкнуться никогда.

Предположим, в компании-клиенте используется сеть 192.168.0.0/24, а в компании-поставщике — 10.85.0.0/24. Мы сделаем вид, что в нашей компании сеть не 192.168.0.0/24, а 172.17.18.0/24:

$ sudo iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -d 10.85.0.0/24 -j NETMAP --to 172.17.18.0/24
$ sudo iptables -t nat -I PREROUTING -s 10.85.0.0/24 -d 172.17.18.0/24 -j NETNAP --to 192.168.0.0/24

В отличие от SNAT и DNAT, она заменяет не весь адрес источника или назначения, а только адрес хоста — ту часть, где в маске сети нули. Адрес 192.168.0.10 всегда транслируется в 172.17.18.10, так что этот метод отлично подходит для двусторонней работы.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Check Also

Разгоняем микроконтроллер. Как я выжал 620 МГц из совместимой с Arduino платы

Производительности всегда не хватает. Иногда проблему можно решить, просто обновившись до …

8 комментариев

  1. Аватар

    Laglag

    23.07.2019 at 18:19

    Как помимо всего зашифровать трафик между двумя компами…?

    • Аватар

      ya

      24.07.2019 at 10:08

      всё зависит от целей, самый простой вариант — ssh туннель, а там и разные vpn-ы и куча туннелей с разным уровнем шифрования и вложенности

  2. Аватар

    duodai

    25.07.2019 at 07:24

    Полезно знать, что сети для частного использования из RFC 1918 на самом деле очень большого размера. Вот они:
    10.0.0.0/8 (до 10.255.255.255.255);

    Мне кажется, одна 255 — лишняя 🙂

  3. Аватар

    icoz

    25.07.2019 at 23:33

    Порадовало: «10.0.0.0/8 (до 10.255.255.255.255)»
    Поправьте, пожалуйста.

  4. Аватар

    BlackVS

    08.08.2019 at 07:10

    В коммандах для 1:1 Nat очепятка: 192.0.2.10 -> 10.0.2.10

  5. Аватар

    BlackVS

    08.08.2019 at 08:25

    Относительно Hairpin:

    «Остается одно: пропускать весь трафик из сети в нее саму через маршрутизатор:
    sudo iptables -t nat -I POSTROUTING -s 10.0.0.0/24 -d 10.0.0.0/24 -j MASQUERADE»

    А) Если -I — то указывать позицию, куда вставляется правило. Если добавляем в конец списка правил — то -A.

    Б) Плохой совет — маскарадить ВЕСЬ локальный трафик через роутер, особенно если у вас сегментированная сеть %). По разным причинам.

    Тут всё проще — если у вас сервер сидит в своей DMZ (как это должно быть) — то скорее всего ничего делать и не нужно (разве что в фаерволе правила-разрешения для доступа с локалки прописать), так как путь туда и обратно будет одинаков. Если же у вас всё в одном сегменте (не есть хорошо), то путь туда и обратно будет разным — туда через роутер, обратно сервер ответит напрямую клиенту (так как они в одном широковещательном сегменте в пределе прямой видимости). Потому на помощь и приходит костыль в виде маскарадинга (в данном случае именно костыль), чтобы сервер ответил обратно на роутер, а роутер уже клиенту.

    Если для доступа снаружи у нас правило prerouting:

    $ sudo iptables -t nat -A PREROUTING -p tcp -d 203.0.113.10:80 -j DNAT —to-destination 10.0.0.20

    то для доступа изнутри к этому же ресурсу ставим симметричное postrouting (10.0.0.0/24 — локальные клиенты, которым даем доступ к ресурсу 10.0.0.20:80 через глобальный ип, выдавая клиентов за роутер):

    sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -d 10.0.0.20:80 -j MASQUERADE

    То есть маскарадим только избранный трафик — в данном случае HTTP на 10.0.0.20. Не маскарадьте весь трафик через роутер — это зло %)

    Ну и всегда смотрим цепочку активных правил, чтобы не сделать мессиво из правил %) :

    iptables -S (ну или iptables -L)
    iptables -t nat -S

    Если намесили и нужно очистить, к примеру, правила nat:

    iptables -t nat -F

Оставить мнение