Вопрос или проблема
Извините за вопрос, который является очень распространённым, но решения от других просто не сработали.
Я хочу направить трафик с 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
-
Сброс правил iptables: Убедитесь, что предыдущие правила не мешают новой настройке. Вы можете очистить текущие правила с помощью:
iptables -F iptables -t nat -F
-
Включение IP-рутирования: Чтобы система могла маршрутизировать пакеты между интерфейсами, необходимо включить IP-рутирование. Это можно сделать с помощью следующей команды:
echo 1 > /proc/sys/net/ipv4/ip_forward
-
Настройка 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, и обеспечить доступ к интернету для вашего клиента.