Как настроить сервер Linux в качестве маршрутизатора с NAT

Вопрос или проблема

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

Таким образом, мы хотим настроить компьютер на LINUX, чтобы он стал маршрутизатором с симметричным NAT, таким образом мы сможем захватывать все пакеты к этому «NAT» и получать необходимую информацию. Как мы можем это сделать на linux (система Fedora, ядро 2.6.xx)?

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

1- Включите пересылку на устройстве с помощью

echo 1 > /proc/sys/net/ipv4/ip_forward

Предполагая, что ваш публичный интерфейс — eth1, а локальный интерфейс — eth0

2- Настройте правило NAT с помощью:

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

3- Разрешите трафик с eth0:

iptables -A INPUT -i eth0 -j ACCEPT

4- Разрешите установленные соединения с публичного интерфейса.

iptables -A INPUT -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

5- Разрешите исходящие соединения:

iptables -A OUTPUT -j ACCEPT

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

Я думаю, что другие ответы упустили некоторые важные моменты. Вот другой способ, предполагая, что iptables в свежем состоянии, снова используя eth0 в качестве внутреннего интерфейса и eth1 в качестве внешнего:

  1. Включите пересылку IP в ядре:

    echo 1 > /proc/sys/net/ipv4/ip_forward
    # или
    sysctl -w net.ipv4.ip_forward=1
    

    Чтобы сохранить это изменение после перезагрузки, добавьте или раскомментируйте net.ipv4.ip_forward=1 в /etc/sysctl.conf или в файле в /etc/sysctl.d.

  2. Включите маскировку на eth1, чтобы переписывать адрес источника в исходящих пакетах. Если вы действительно хотите симметричный NAT, вам нужно добавить --random в конце:

    iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE --random
    
  3. Настройте правила пересылки. По умолчанию iptables будет перенаправлять весь трафик без условий. Вероятно, вы хотите ограничить входящий трафик с интернета, но разрешить все исходящие:

    # Разрешить трафик с внутреннего на внешний
    iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
    # Разрешить возвращающий трафик с внешнего на внутренний
    iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate RELATED, ESTABLISHED -j ACCEPT
    # Отбрасывать весь другой трафик, который не должен быть перенаправлен
    iptables -A FORWARD -j DROP
    

Обратите внимание, что мы не трогали цепочки INPUT или OUTPUT в таблице фильтров; они не относятся к маршрутизации.

Чтобы сохранить эти изменения брандмауэра после перезагрузки:

iptables-save > /etc/sysconfig/iptables
systemctl enable --now iptables

Этот шаг будет варьироваться в зависимости от дистрибутива Linux.

Это простой скрипт, который может сделать свое дело, он включает в себя все, что нужно маршрутизатору, он хорошо протестирован на UBUNTU 16.04

#!/bin/bash
# Этот скрипт написан, чтобы сделать вашу Linux-машину маршрутизатором
# С его помощью вы можете настроить свою Linux-машину в качестве шлюза.
# Автор @ Mansur Ul Hasan
# Email  @ [email protected]

  # Определение интерфейсов для шлюза.
  INTERNET=eth1
  LOCAL=eth0

# ВАЖНО: активируйте пересылку IP в ядре!

   # По умолчанию отключено!
   echo "1" > /proc/sys/net/ipv4/ip_forward

   # Загружаем различные модули. Обычно они уже загружены 
   # (особенно для новых ядер), в этом случае 
   # следующие команды не нужны.

   # Загружаем модуль iptables:
   modprobe ip_tables

   # активируем отслеживание соединений
   # (учитываются состояния соединений)
   modprobe ip_conntrack

   # Специальные функции для IRC:
   modprobe ip_conntrack_irc

   # Специальные функции для FTP:
   modprobe ip_conntrack_ftp

   # Удаление всех правил в INPUT, OUTPUT и FILTER   
   iptables --flush

   # Сбрасываем все правила в таблице nat 
   iptables --table nat --flush

   # Удаление всех существующих цепочек
   iptables --delete-chain

   # Удаление всех цепочек, которые не находятся в таблице фильтров и nat по умолчанию
   iptables --table nat --delete-chain

   # Разрешение установленных соединений с публичного интерфейса.
   iptables -A INPUT -i $INTERNET -m state --state ESTABLISHED,RELATED -j ACCEPT

   # Настройка пересылки IP и маскирования
   iptables --table nat --append POSTROUTING --out-interface $INTERNET -j MASQUERADE
   iptables --append FORWARD --in-interface $LOCAL -j ACCEPT

   # Разрешение исходящих соединений
   iptables -A OUTPUT -j ACCEPT

Для тех, кто хочет попробовать firewall-cmd

Предполагаем:
wan интерфейс — ens192,
lan интерфейс — ens224,
зона брандмауэра nm-shared уже создана и установлена (как было в моем случае)

по умолчанию оба интерфейса находились в моей зоне public, так что я просто переместил ens224 в nm-shared

firewall-cmd --zone=nm-shared --change-interface=ens224

и включил masquerade на public

firewall-cmd --zone=public --add-masquerade

и на этом этапе это сработало.
Для постоянных изменений см. флаги --permanent и --reload

больше информации docs.redhat.com и man firewall-cmd

Ответ или решение

Как настройки сервер Linux в качестве маршрутизатора с NAT

В данном руководстве мы подробно рассмотрим, как настроить сервер на базе Linux в качестве маршрутизатора с симметричным NAT (Network Address Translation). Это позволит вам захватывать пакеты и диагностировать сетевые проблемы, используя возможности системы Linux. Для примера мы будем рассматривать сервер на Fedora с ядром 2.6.xx.

Шаг 1: Включение IP-прокидывания

Первым делом необходимо активировать прокидывание пакетов. Это можно сделать с помощью следующей команды:

echo 1 > /proc/sys/net/ipv4/ip_forward

Чтобы сохранить это изменение после перезагрузки, необходимо добавить или раскомментировать строку net.ipv4.ip_forward=1 в файле /etc/sysctl.conf или в отдельном файле внутри директории /etc/sysctl.d.

Также для применения изменения можно использовать:

sysctl -w net.ipv4.ip_forward=1

Шаг 2: Настройка NAT

Используйте iptables для настройки маскировки исходящего трафика через ваш внешний интерфейс (например, eth1). Это можно сделать с помощью следующей команды:

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE --random

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

Шаг 3: Настройка правил форвардинга

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

# Разрешить трафик из внутренней сети во внешнюю
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

# Разрешить ответные пакеты во внутренней сети
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# Отклонить весь остальной трафик, который не должен быть перенаправлен
iptables -A FORWARD -j DROP

Эти правила обеспечат корректный обмен данными в вашей сети.

Шаг 4: Сохранение правил iptables

Правила, которые вы создали, не сохранятся после перезагрузки системы. Чтобы сделать их постоянными, выполните следующие команды:

iptables-save > /etc/sysconfig/iptables
systemctl enable --now iptables

Это обеспечит автоматическую загрузку ваших правил при старте системы.

Шаг 5: Дополнительно — использование firewalld

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

  1. Переместите ваш локальный интерфейс (например, ens224) в созданную зону (например, nm-shared):
firewall-cmd --zone=nm-shared --change-interface=ens224
  1. Включите маскировку на внешнем интерфейсе (например, ens192):
firewall-cmd --zone=public --add-masquerade

Для постоянного внедрения этих изменений используйте флаги --permanent и --reload.

Заключение

Теперь ваш сервер Linux настроен как маршрутизатор с симметричным NAT, что позволит вам детально отслеживать и захватывать пакеты. Это особенно полезно для отладки и анализа сетевых проблем. Следуя приведённым шагам, вы сможете без труда организовать надежную и высокоэффективную сетевую инфраструктуру.

Оцените материал
Добавить комментарий

Капча загружается...