Маршрутизация трафика с одного интерфейса на другой с использованием iptables

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

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

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

  • Внутренний IP маршрутизатора = 192.168.0.1
  • Внешний IP ПК = 192.168.0.2
  • Внутренний IP ПК = 10.0.0.1

Клиент, которому я хочу предоставить Интернет через маршрутизатор, = 10.0.0.2


Редактировать: Я только что заметил после выполнения iptables -t nat -L -v, что я получаю:

$ iptables -t nat -L -v
Цепочка PREROUTING (политика ACCEPT 103 пакета, 13461 байт)
 pkts bytes target     prot opt in     out     source               destination         

Цепочка INPUT (политика ACCEPT 40 пакетов, 5406 байт)
 pkts bytes target     prot opt in     out     source               destination         

Цепочка OUTPUT (политика ACCEPT 795 пакетов, 54448 байт)
 pkts bytes target     prot opt in     out     source               destination         

Цепочка POSTROUTING (политика ACCEPT 202 пакета, 14292 байта)
 pkts bytes target     prot opt in     out     source               destination         
  594 40264 MASQUERADE  all  --  any    enp2s0  anywhere             anywhere  

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


Редактировать 2: На данный момент все, что я хочу, это получить NAT трафика с одной стороны на другую, команды, которые я использовал, следующиe:

$ iptables -F
$ iptables -t nat -F
$ echo 1 > /proc/sys/net/ipv4/ip_forward
$ iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE

И таблицы после выполнения этого:

$ iptables -L -v
Цепочка INPUT (политика ACCEPT 5077 пакетов, 1875K байт)
 pkts bytes target     prot opt in     out     source               destination         

Цепочка FORWARD (политика ACCEPT 446 пакетов, 47160 байт)
 pkts bytes target     prot opt in     out     source               destination         

Цепочка OUTPUT (политика ACCEPT 6292 пакета, 649K байт)
 pkts bytes target     prot opt in     out     source               destination   

$ iptables -L -v
Цепочка INPUT (политика ACCEPT 5077 пакетов, 1875K байт)
 pkts bytes target     prot opt in     out     source               destination         

Цепочка FORWARD (политика ACCEPT 446 пакетов, 47160 байт)
 pkts bytes target     prot opt in     out     source               destination         

Цепочка OUTPUT (политика ACCEPT 6292 пакетов, 649K байт)
 pkts bytes target     prot opt in     out     source               destination   

Вы не можете сделать это. IPTABLES не маршрутизирует трафик. Он может фильтровать и выполнять NAT трафика, но маршрутизация должна выполняться с помощью других команд, таких как “ip” или “route” (старый метод)

Сказав это, ваша команда iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE неверна. Скорее всего, всё будет работать, если вы измените enp2s0 на eth1

Однако, более правильным способом было бы убрать MASQUERADE и добавить маршрут к сети 10.0.0.0 с маской 255.0.0.0 на маршрутизаторе с шлюзом 192.168.0.2

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

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

Настройка iptables

  1. Сброс правил iptables: Убедитесь, что предыдущие правила не мешают новой настройке. Вы можете очистить текущие правила с помощью:

    iptables -F
    iptables -t nat -F
  2. Включение IP-рутирования: Чтобы система могла маршрутизировать пакеты между интерфейсами, необходимо включить IP-рутирование. Это можно сделать с помощью следующей команды:

    echo 1 > /proc/sys/net/ipv4/ip_forward
  3. Настройка NAT: Для того чтобы трафик, идущий на внешний интерфейс (eth1), корректно обрабатывался, добавьте следующий правило в таблицу NAT:

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

    Убедитесь, что интерфейс eth1 соответствует вашему внешнему интерфейсу. Название интерфейса может отличаться (например, enp2s0, как вы указали в своём вопросе).

Проверка маршрутизации

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

iptables -L -v
iptables -t nat -L -v

Убедитесь, что в цепочке POSTROUTING есть правило MASQUERADE, призванное маскировать исходящий трафик, и что цепочка FORWARD не блокирует трафик.

Настройка маршрутов на роутере

Также полезно будет настроить роутер (192.168.0.1) так, чтобы он знал, как отправлять пакеты обратно на вашу подсеть 10.0.0.0/8. На роутере добавьте маршрут для этой сети с шлюзом 192.168.0.2 (IP вашего компьютера).

Diagnosing Problems

Если вы все правильно сделали, но все еще не можете получить интернет на клиенте с IP 10.0.0.2, рекомендую проверить следующее:

  • Убедитесь, что клиент (10.0.0.2) настроен правильно, и у него установлен шлюз 10.0.0.1 (IP вашего компьютера).
  • Используйте команду tcpdump или wireshark, чтобы проследить путь пакетов и убедиться, что они проходят через нужные интерфейсы.
  • Проверьте настройки брандмауэра на роутере, чтобы убедиться, что они не блокируют трафик из вашей подсети.

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

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

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