web-dev-qa-db-ja.com

Iptablesはrawソケットで送信されたパケットにSNATを適用していないようです

ユーザースペースプログラムからワイヤレスインターフェイスwlan0にパケットを送信しています。次のようにiptablesを使用してSNATルールを設定しました

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

そして、それは私のマシンから出て行くすべての通常のトラフィックに対して機能します。

レイヤー2から始まるパケットを作成する必要があるプログラムに取り組んでいます。Iptablesは、このプログラムによって送信されるレイヤー3パケットにSNATを適用していません。

レイヤー2からユーザースペースでパケットを送信し、それでもNATを適用する方法はありますか?

スーパーユーザー からこれを再投稿しました。何かあったら更新します。

2
Conor Patrick

パケットがイーサネットインターフェイスで直接送信される場合、パケットはカーネルのネットワークスタックのIP層を通過しません。つまり、iptablesもありません。

パケットを希望どおりに生成するようにプログラムを取得するか、ネットワークスタックのIP層を介してパケットを送信する必要があります。

ネットワークスタックを介してパケットを取得する方法はいくつかあります。

  • カーネルによってルーティングされてから同じインターフェイスに転送されるように、自分のマシンのMACアドレスに送信します。
  • 物理インターフェイスではなく、仮想ネットワークインターフェイスを介して送信します。
  • イーサネット層の代わりにIP層のソケットを使用してください。
2
kasperd

Raw Socketsはnetfilterスタックをバイパスするため、iptablesはこれらのパケットに影響を与えません。

0
Kyle Brandt