iptables SNAT / DNAT объяснить поведение

Я новичок в iptables, и я хочу понять, как работает iptables nat.
У меня есть машина linux с контейнером lxc.
Конфигурация сети машины выглядит следующим образом: интерфейс eth0, который соединяет машину с интернетом (это IPv4-адрес 10.9.63.173) и интерфейс veth-1 (192.168.2.1) для контейнера lxc.
На контейнере lxc имеется интерфейс eth0 (192.168.2.2), подключенный к veth-1.

на машине linux я добавил две iptables правила:

1) iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.9.63.173
2) iptables -t nat -A PREROUTING -d 10.9.63.173 -j DNAT --to-destination 192.168.2.2

Если я делаю ping 8.8.8.8 из контейнера lxc все работает (исходный IP переводится на 10.9.63.173 при выходе из машины linux). Но второе правило никогда не совпадает с ответами Эха ping. Я наблюдал входящие пакеты на eth0 (10.9.63.173), используя tcpdump, и выход выглядит следующим образом:

23:34:33.151565 IP google-public-dns-a.google.com > host.local: ICMP echo reply, id 536, seq 174, length 64

поэтому пакеты с назначением 10.9.63.173 поступают на интерфейс eth0.

у меня три вопросы:

1) Почему следующее правило Нат не совпали?

2) как iptables умеет изменять ответы таким образом, чтобы пересылать их в 192.168.2.2?

3) может ли целевой объект SNAT изменить исходный порт (без явного указания перевести на определенный порт)?

спасибо!

24
задан SebiSebi
22.04.2023 22:42 Количество просмотров материала 2394
Распечатать страницу

3 ответа

Iptables использует таблицу NAT и машину conntrack. Таким образом, если ваш контейнер инициирует соединение, он будет соответствовать правилу SNAT, запишите в таблицу NAT и заполните conntrack.

когда приходит ответ, conntrack знает (с IP и портом источника и назначения, и последовательностью TCP если соединение TCP), то что пакет принадлежит соединению, и адресует его к правой корреспонденции NAT.

в соединение, только первый пакет будет соответствует правилу NAT, то каждый другой будет просто следовать по тому же пути (или обратному пути).

Если новое соединение поступает извне в контейнер, оно будет соответствовать правилу DNAT.

SNAT не может изменить исходный порт.

0
отвечен Sanael 2023-04-24 06:30

почитайте для TCP и связь отслеживания мне кажется: http://www.iptables.info/en/connection-state.html

SNAT может изменять только IP-адрес источника, который я знаю.

0
отвечен Tim Connor 2023-04-24 08:47

1) Почему следующее правило Нат не совпали?

iptables NAT работает на" connections"*, только первый пакет каждого "connection" проходит через контролируемые пользователем таблицы nat.

2) как iptables умеет изменять ответы так, чтобы пересылать их в 192.168.2.2?

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

3) может ли целевой объект SNAT изменить исходный порт (без явного указания перевести на определенный порт)?

Да, это возможно, но по умолчанию это будет сделано, только если это nessacery, чтобы избежать двусмысленности.

* "соединение"здесь относится к набору критериев, которые могут использоваться для сопоставления запросов с соответствующими ответами. например, IP-адрес источника / порт источника / назначения порт IP/кортеж назначения для TCP/UDP или IP-адрес источника/тип/код/код/IP-адрес назначения для ICMP-запросы.

0
отвечен plugwash 2023-04-24 11:04

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

firewall
iptables
linux
nat
networking
Вверх