私は1週間以上、セキュリティアソシエーションに適合するようにアウトバウンドパケットをNAT変換しようと取り組んできました。
これは私の(例の)シナリオです:
私はすべてのSAをFreeBSDボックスで稼働させていますが、pfまたはipfwのいずれかを使用してパケットをNATしようとしても機能しません。NATされたパケットはデフォルトルートインターフェイスを使用して流れ続け、取得しません。 ipsecトンネルに。
次に例を示しますSA使用:
$ ipsec status vpn
vpn{1}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cca608fa_i d74355dc_o vpn{1}: AES_CBC_256/HMAC_SHA2_256_128, 2688 bytes_i (32 pkts, 32s ago), 4992 bytes_o (32 pkts, 32s ago), rekeying in 43 minutes vpn{1}: 2.2.2.2/32 === 3.3.3.3/32
これはpf.conf
に関する私のnatルールです:
nat on enc0 from 1.1.1.0/24 to 2.2.2.2/32 -> 3.3.3.3
これは私のipsec0 interface status
です:
ipsec0: flags=8011<UP,POINTOPOINT,MULTICAST> metric 0 mtu 1400 inet 3.3.3.3/32 --> 2.2.2.2/32 netmask 0xffffffff options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL> reqid: 0 groups: ipsec
3.3.3.3から2.2.2.2にスムーズに到達できます。
これは、xn0(物理インターフェイス)での単純なパケットキャプチャです。
$ tcpdump -i xn0 -n -vvv Host 2.2.2.2
1.1.1.10 > 2.2.2.2: ICMP echo request, id 15745, seq 818, length 64
enc0にはトラフィックは見られません。
もう1つの試みは、sysctl
を介して設定することでした。
net.inet.ipsec.filtertunnel=1
しかし、このオプションが正確に何をするのか完全にはわかりません。
私は多くの人々がこの種のnatをうまく機能させるのに苦労しているのを見てきました。
数日苦労した後、私はこれを次の手順で行うことができ、他の人を助けるためにここに解決策を投稿します
ソースをnatしたいSAの一意のIDを取得します。例:
setkey -DP
SA一意のID:
3.3.3.3[any] 2.2.2.2[any] any
out ipsec
esp/tunnel/REALIPLOCAL-REALIPREMOTE/unique:1
created: Jul 22 22:29:34 2018 lastused: Jul 22 22:29:34 2018
lifetime: 9223372036854775807(s) validtime: 0(s)
spid=2715 seq=0 pid=13358 scope=global
refcnt=1
この場合:1
新しいポリシーを追加します。
setkey -v -c
spdadd -4 1.1.1.0/24 2.2.2.2/32 any -P out ipsec esp/tunnel/REALLOCALIP-REALREMOTEIP/unique:1;
これは、トンネル内でパケットをルーティングし、実際にインストールされているSA)と一致するようにパケットを変換するのに十分なはずです。
この一意のIDはインストール済みのSAと一致する必要があります。StrongSwanでSAインストールの順序を変更する場合は、このポリシーを変更して新しい一意のID。
Natルールはenc0インターフェイスに適用する必要があります。
参照:
https://github.com/opnsense/core/issues/44
幸運を。