1

Я пытаюсь понять, как именно NAT работает, чтобы решить еще одну большую проблему, вот моя установка Linux:

Интерфейс eth0 подключен к интернету (публичный IP-адрес)

eth1 подключен к локальной сети и выступает в качестве шлюза (имеет IP 192.168.1.1) для всех внутренних узлов для обеспечения доступа в Интернет.

Используются следующие правила iptable:

1)$iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
2)$iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
3)$iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Теперь я хотел бы понять, что именно делают правила 1,2 и 3?

Теперь возьмите этот пример:

ПК1 с IP-адресом 192.168.1.5 и MAC-адресом MAC1 необходим для доступа к URL-адресу www.google.com, он создает такой пакет

Предположим, MAC-адрес шлюза MAC2

source MAC | destination MAC | source ip | destination ip| payload
   MAC1           MAC2        192.168.1.5   <google ip>     <data>

Теперь шлюз (192.168.1.1) получает этот пакет на интерфейсе eth1 и изменяет исходный ip на ip-адрес интерфейса eth0 и обновляет некоторую таблицу записью для обратного просмотра при получении ответа.Какие правила отвечают за эту операцию rule1/rule 2?

И когда ответ получен на eth0, он изменяет IP-адрес назначения, просматривая запись таблицы, и отбрасывает пакет на eth1. что именно здесь делает rule3?

Скажем, приложение на шлюзе должно иметь доступ к Интернету и создает пакет и отправляет через eth0, когда ответ получен, как пакет направляется приложению на шлюзе вместо передачи пакета по интерфейсу eth1 в соответствии с правилом 1?

Обновить

При отправке пакета правило 3 изменяет исходный IP-адрес, и оно называется soruce NAT, то есть, когда на eth0 получен ответный пакет, адрес назначения изменился, не является ли это адресатом NAT? почему не правило для этого.?

Предположим, есть другой интерфейс eth2, который также подключен к Интернету с публичным ip, и в таблице маршрутизации существует маршрут по умолчанию для маршрутизации трафика через это устройство:

$ip route add default via <IP> dev eth2 scope link

Правила прямой цепочки iptables таблицы фильтра говорят о выходе пакетов через eth0, но в таблице маршрутизации есть маршрут по умолчанию через eth2, в этом случае какой интерфейс используется для Интернета?

Можно ли перенаправить трафик, который пересылается с eth1(локальный н / ж) на eth0, и трафик данных приложения, который отправляется на шлюзе через интерфейс eth2?

Спасибо!

1 ответ1

4

Я переоформлю и переформулирую ваши правила:

$iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Это правило позволяет брандмауэру FORWARD (т.е. выступает в качестве маршрутизатора) ко всем пакетам, входящим в eth1 (локальный) и маршрутизируемым для выхода через eth0 (Интернет)

$iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Это правило выполняет Source NAT: оно заменяет исходный адрес исходящих пакетов из 192.168.1.xxx на ваш общедоступный IP-адрес, в то же время записывая сведения о NAT в conntrack (отслеживание соединения) маршрутизатора.

Поскольку сведения о NAT записаны, ответные пакеты из Интернета будут проверяться по этой таблице. Если ответ соответствует записи conntrack, пакет будет испытывать «обратный NAT» (мой термин), то есть заменять адрес назначения (помните, это ответ!) с исходным адресом отправителя (192.168.1.xxx)

$iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

Это правило позволяет маршрутизировать пакеты, которые являются ответами на исходящий пакет (например, один из описанных выше SNAT), в локальную сеть.

Теперь шлюз (192.168.1.1) получает этот пакет на интерфейсе eth1 и изменяет исходный ip на ip-адрес интерфейса eth0 и обновляет некоторую таблицу записью для обратного просмотра при получении ответа.Какие правила отвечают за эту операцию rule1/rule 2?

Это сочетание Правил 2 и 3 (в вашем оригинальном сообщении)

Скажем, приложение на шлюзе должно иметь доступ к Интернету и создает пакет и отправляет через eth0, когда ответ получен, как пакет направляется приложению на шлюзе вместо передачи пакета по интерфейсу eth1 в соответствии с правилом 1?

Если шлюз сам отправляет исходящий пакет, пакет не будет соответствовать какой-либо записи таблицы conntrack и, следовательно, не будет «обратным NAT-ed».

При отправке пакета правило 3 изменяет исходный IP-адрес, и оно называется soruce NAT, то есть, когда на eth0 получен ответный пакет, адрес назначения изменился, не является ли это адресатом NAT? почему не правило для этого.?

Технически это DNAT. Но netfilter (т. Е. Инфраструктура фильтрации / искажения пакетов, которая является «движком» iptables) достаточно умна. При получении входящего пакета он сопоставляется с таблицей conntrack сетевого фильтра. Если пакет является ответом на существующее исходящее соединение (установлен флаг ACK, соответствует IP: порт, соответствует порядковый номер TCP и т.д.), Netfilter автоматически выполняет DNAT. Нет необходимости в дополнительных правилах.

Предположим, есть другой интерфейс eth2, который также подключен к Интернету с публичным ip, и в таблице маршрутизации существует маршрут по умолчанию для маршрутизации трафика через это устройство:

$ip route add default via <IP> dev eth2 scope link

Правила прямой цепочки iptables таблицы фильтра говорят о выходе пакетов через eth0, но в таблице маршрутизации есть маршрут по умолчанию через eth2, в этом случае какой интерфейс используется для Интернета?

iptables не выполняет маршрутизацию; он действует против пакетов после их маршрутизации iproute2 (т. е. каркас маршрутизации Linux). Вот почему цепочка правил называется "POSTROUTING".

Если сценарий, как вы объяснили, iproute2 заставит ядро Linux отправлять пакеты через eth2. В этом случае исходное правило -t nat -A POSTROUTING -o eth0 -j MASQUERADE больше не будет совпадать, и MASQUERADE/SNAT больше не будет выполняться.

Можно ли перенаправить трафик, который пересылается с eth1(локальный н / ж) на eth0, и трафик данных приложения, который отправляется на шлюзе через интерфейс eth2?

Да, но вам нужна помощь iproute2.

Во-первых, вы должны создать 2 новые таблицы маршрутизации. Давайте назовем их 100 и 102:

ip route add default via $DG_eth0 dev eth1 table 100
ip route add default via $DG_eth2 dev eth2 table 102

Далее вы создаете политику маршрутизации:

# Rule #10: All packets must refer to the 'main' table
ip rule add order 10 from all  lookup main
# Rule #20: Packets entering eth1 must refer to the '100' table
ip rule add order 20 iif  eth1 lookup 100
# Rule #30: Packets from this gateway must refer to the '102' table
ip rule add order 30 iif  lo   lookup 102

Наконец, вы удаляете маршрут по умолчанию в таблице main:

ip route delete default table main

main таблица важна, потому что она содержит список всех подсетей вокруг вашего шлюза; вот почему это все еще должно упоминаться в правиле № 10.

Я надеюсь, что я достаточно ясно. Не стесняйтесь задавать мне больше вопросов по iptables.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .