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が正しく設定されていることを確認するにはどうすればよいですか?
— MacOSのPfはこれを行いません。理由は次のとおりです:
そのマニュアルを見ると、NATが発生しているbeforeフィルタリングであることがわかります。 。ただし、NATルールは、フィルタリングルールのようにすべての種類のホールマークをサポートしているわけではありません。つまり、NATの実行中にソケットの所有権を確認する方法はありません。NATたとえば、送信元IPまたは宛先IPでのルールの適用可能性。ただし、所有権ではありません。
もう1つ言及するのは、NAT Pfの通常のルートルックアップの処理中です。これは、_nat on en0
_がで動作しないことを意味します。すべて—パケットは、その時点でカーネルのルーティングテーブルに従ってルーティングされます。あなたの場合、パケットは、VPNインターフェイスであるデフォルトルートのインターフェイスを介して送信されるようにディスパッチされます。また、送信元IPとしてVPNインターフェイスのアドレスを使用します—これは驚くべきことではありません。通常のルートルックアップの場合ですが、明らかに計画に沿って機能していません。
矛盾を要約すると、簡単に:
route-to
_が適用されたときにソースIPが間違っていますnat on vpn0 … -> (en0)
P. S. Mac OSのPfの実際の状態は さらに悪い です。 NATが実行された後、所有権の照合はフィルタリングルールでも機能しません。