web-dev-qa-db-ja.com

MacOS 10.14以降でIPマスカレードを行う方法は?

Linuxと同等のMacosコマンドを探しています。

Sudo iptables -t nat -A POSTROUTING -o en0 -j MASQUERADE

これを実行したい理由は、デフォルトルートを持つVPNを使用しているためですが、特定のアプリがVPNではなく物理アップリンクを経由するようにしたいのです。

pfctlを使用して、次のことを行いました。

pass out route-to (en0 192.168.4.1) group skipvpn flags any

ここで、192.168.4.1はゲートウェイのIPであり、これはskipvpnグループ内のアプリからのすべてのパケットを(トンネルではなく)en0インターフェースにルーティングしているように見えます。 tcpdumpを使用してこれを確認します

ただし、再ルーティングされたすべてのパケットの「ソースIP」には、VPNのソースIP(10.0.0.0/8 range-ip)が残っているため、当然のことながら問題が発生します(つまり、返されるパケットがパケットを見つけることができません)。帰り道..)

その結果、私はこれを使用してソースipsをnatしようとしました。

nat on en0 from any to any -> en0

しかし、これは機能します[〜#〜] not [〜#〜]動作しているように見えますが、ソースIPはまだ壊れており、en0インターフェイスのソースIPに対応していません。

これらの再ルーティングされたパケットに対してソースIPが正しく設定されていることを確認するにはどうすればよいですか?

2
horseyguy

— MacOSのPfはこれを行いません。理由は次のとおりです:

そのマニュアルを見ると、NATが発生しているbeforeフィルタリングであることがわかります。 。ただし、NATルールは、フィルタリングルールのようにすべての種類のホールマークをサポートしているわけではありません。つまり、NATの実行中にソケットの所有権を確認する方法はありません。NATたとえば、送信元IPまたは宛先IPでのルールの適用可能性。ただし、所有権ではありません。

もう1つ言及するのは、NAT Pfの通常のルートルックアップの処理中です。これは、_nat on en0_がで動作しないことを意味します。すべて—パケットは、その時点でカーネルのルーティングテーブルに従ってルーティングされます。あなたの場合、パケットは、VPNインターフェイスであるデフォルトルートのインターフェイスを介して送信されるようにディスパッチされます。また、送信元IPとしてVPNインターフェイスのアドレスを使用します—これは驚くべきことではありません。通常のルートルックアップの場合ですが、明らかに計画に沿って機能していません。

矛盾を要約すると、簡単に:

  • そうしないとNAT _route-to_が適用されたときにソースIPが間違っています
  • NATルールは、ソースIPを非VPNインターフェイスのIPに変更するときに、デフォルトルートインターフェイス(VPN)に設定する必要があります。例:nat on vpn0 … -> (en0)
  • しかし、OTOHはカスタムNAT(所有権による)を持つことはできません。とにかくNAT)を行うと、VPN経由で送信されるはずのトラフィックのソースが間違ってしまいます。 IP。

P. S. Mac OSのPfの実際の状態は さらに悪い です。 NATが実行された後、所有権の照合はフィルタリングルールでも機能しません。

2
poige