Почему SNAT работает, устанавливая одни правила в таблицах без правил в цепочке PREROUTING?

Почему SNAT работает, устанавливая одни правила в таблицах без правил в цепочке PREROUTING?

У меня есть несколько вопросов о SNAT с iptables. Предположим, что есть один маршрутизатор, который играет роль DHCP-сервера для назначения частных IP-адресов в моей локальной сети и NAT для хостов в моей локальной сети, которые могут получить доступ к публичному интернету.

Маршрутизатор имеет два интерфейса, один "eth0" с динамическим публичным IP и другой "eth1" с частным IP 192.168.0.1, а подсеть - 192.168.0.0/24. Предположим, что на этом маршрутизаторе включена пересылка пакетов ipv4. Я знаю, что мне нужно установить одно правило в таблице NAT для маскировки исходного IP пакета в публичный Интернет с хостов в моей локальной сети. Это правило может выглядеть так, как показано ниже.

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

Я понимаю, зачем мне это правило, поскольку пакету из моей локальной сети нужен публичный IP-адрес для маршрутизации в Интернете.

Но я не понимаю, почему мне не нужно устанавливать еще одно правило в PREROUTINGцепочке для ответных пакетов, чтобы изменять их IP-адреса назначения.

Является ли изменение адреса назначения этих ответных пакетов поведением по умолчанию правила MASQUERADE, которое я только что установил?

И еще один вопрос: как iptable узнает, какие пакеты следует модифицировать?

Спасибо.

решение1

iptables NAT имеет состояние. Использование таблицы 'nat' автоматически загрузитconntrackсистема, которая хранит список активных соединений и распознает, какой пакет принадлежит какому соединению. Система conntrack регистрирует внутренние хуки, которые работают отдельно от правил iptables, и автоматически преобразует пакеты, которые она распознает.

(Таблицу состояний conntrack можно просмотреть с помощью conntrack -Lили через /proc/self/net/nf_conntrack.)

При использовании этой системы правила в таблице «nat» фактически соответствуют толькоисходныйпакет, принадлежащий каждому соединению, а не каждому отдельному пакету. После сопоставления начального пакета соответствующая запись conntrack помечается как требующая NAT (или нет), и дальнейшие пакеты автоматически преобразуются, даже не проходя через таблицу 'nat'.

Связанный контент