Назад | Перейти на главную страницу

Iptables, похоже, не применяет SNAT к пакетам, отправляемым через необработанный сокет

Я отправляю пакеты из программы пользовательского пространства на свой беспроводной интерфейс wlan0. Я установил правило SNAT с iptables следующим образом

iptables -t nat -A POSTROUTING -o wlan0 -j SNAT --to 192.168.1.3

И это работает для всего обычного трафика, исходящего с моей машины.

Я работаю над программой, которая должна создавать пакеты, начиная со слоя 2. Iptables не применяет SNAT ни к каким пакетам уровня 3, отправляемым этой программой.

Могу ли я как-нибудь отправлять пакеты в пользовательском пространстве со слоя 2 и при этом применять к ним NAT?

Я перепечатал это из суперпользователь. Сделаю обновление, если что-нибудь там получу.

Когда пакеты отправляются непосредственно через интерфейс Ethernet, они не будут проходить через уровень IP в сетевом стеке ядра. Это также означает отсутствие iptables.

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

Есть несколько различных способов получить пакет через сетевой стек:

  • Отправьте его на MAC-адрес вашей собственной машины, чтобы ядро ​​маршрутизировало его, а затем перенаправляло обратно на тот же интерфейс.
  • Отправьте его через виртуальный сетевой интерфейс вместо физического.
  • Используйте сокет на уровне IP вместо уровня Ethernet.

Raw Sockets обходят стек netfilter, поэтому iptables не будет влиять на эти пакеты.