自宅にstrongSwanサーバーをセットアップし、別のネットワークから接続しようとしています。 Sun
がVPNサーバーであり、venus
がクライアントであるとしましょう。 Sun
とvenus
の両方がNATネットワークの背後にあります。Sun
は私のホームネットワークのゲートウェイではありません。ただし、ポート4500、500および50(UDP)はSun
に転送されます。
ipsec.conf(日)
# ipsec.conf - strongSwan IPsec configuration file
# basic configuration
config setup
charonstart=yes
plutostart=no
conn venus
left=%any
leftcert=sunCert.pem
right=%any
leftsubnet=10.135.1.0/24
rightid="C=IL, O=KrustyKrab, CN=venus"
keyexchange=ikev2
auto=add
type=tunnel
mobike=no
include /var/lib/strongswan/ipsec.conf.inc
ipsec.conf(ヴィーナス)
# ipsec.conf - strongSwan IPsec configuration file
# basic configuration
config setup
charonstart=yes
plutostart=no
conn krustykrab
left=%defaultroute
leftsourceip=%config
leftid="C=IL, O=KrustyKrab, CN=venus"
leftcert=venusCert.pem
right=x.x.x.x # My home public IP
rightsubnet=10.135.1.0/24
rightid="C=IL, O=KrustyKrab, CN=Sun"
keyexchange=ikev2
auto=start
type=tunnel
mobike=no
# include /var/lib/strongswan/ipsec.conf.inc
SunのプライベートIPは10.135.1.200で、VenusのプライベートIPは192.168.10.200です。接続しようとすると、次のようになります。
Sun(y.y.y.yは金星のパブリックIP):
13[NET] received packet: from y.y.y.y[500] to 10.135.1.200[500]
13[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) ]
13[IKE] y.y.y.y is initiating an IKE_SA
13[IKE] local Host is behind NAT, sending keep alives
13[IKE] remote Host is behind NAT
13[IKE] sending cert request for "C=IL, O=KrustyKrab, CN=KrustyKrab CA"
13[ENC] generating IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ N(MULT_AUTH) ]
13[NET] sending packet: from 10.135.1.200[500] to y.y.y.y[500]
14[IKE] sending keep alive
14[NET] sending packet: from 10.135.1.200[500] to y.y.y.y[500]
15[JOB] deleting half open IKE_SA after timeout
金星(x.x.x.xはSunのパブリックIP)
13[IKE] initiating IKE_SA krustykrab[1] to x.x.x.x
13[ENC] generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) ]
13[NET] sending packet: from 192.168.10.200[500] to x.x.x.x[500]
14[NET] received packet: from x.x.x.x[500] to 192.168.10.200[500]
14[ENC] parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ N(MULT_AUTH) ]
14[IKE] local Host is behind NAT, sending keep alives
14[IKE] remote Host is behind NAT
14[IKE] received cert request for "C=IL, O=KrustyKrab, CN=KrustyKrab CA"
14[IKE] sending cert request for "C=IL, O=KrustyKrab, CN=KrustyKrab CA"
14[IKE] authentication of 'C=IL, O=KrustyKrab, CN=venus' (myself) with RSA signature successful
14[IKE] sending end entity cert "C=IL, O=KrustyKrab, CN=venus"
14[IKE] establishing CHILD_SA krustykrab
14[ENC] generating IKE_AUTH request 1 [ IDi CERT N(INIT_CONTACT) CERTREQ IDr AUTH CP(ADDR DNS) SA TSi TSr N(MULT_AUTH) N(EAP_ONLY) ]
14[NET] sending packet: from 192.168.10.200[4500] to x.x.x.x[4500]
09[IKE] retransmit 1 of request with message ID 1
09[NET] sending packet: from 192.168.10.200[4500] to x.x.x.x[4500]
10[IKE] retransmit 2 of request with message ID 1
10[NET] sending packet: from 192.168.10.200[4500] to x.x.x.x[4500]
11[IKE] retransmit 3 of request with message ID 1
11[NET] sending packet: from 192.168.10.200[4500] to x.x.x.x[4500]
14[IKE] sending keep alive
14[NET] sending packet: from 192.168.10.200[4500] to x.x.x.x[4500]
15[IKE] retransmit 4 of request with message ID 1
15[NET] sending packet: from 192.168.10.200[4500] to x.x.x.x[4500]
10[IKE] sending keep alive
10[NET] sending packet: from 192.168.10.200[4500] to x.x.x.x[4500]
12[IKE] sending keep alive
12[NET] sending packet: from 192.168.10.200[4500] to x.x.x.x[4500]
11[IKE] retransmit 5 of request with message ID 1
11[NET] sending packet: from 192.168.10.200[4500] to x.x.x.x[4500]
金星のtcpdump:
16:57:42.389799 IP 192.168.10.200.500 > x.x.x.x.500: isakmp: parent_sa ikev2_init[I]
16:57:42.465073 IP x.x.x.x.500 > 192.168.10.200.500: isakmp: parent_sa ikev2_init[R]
16:57:42.712016 IP 192.168.10.200.4500 > x.x.x.x.4500: NONESP-encap: isakmp: child_sa ikev2_auth[I]
16:57:42.712057 IP 192.168.10.200 > x.x.x.x: ip-proto-17
16:57:46.712854 IP 192.168.10.200.4500 > x.x.x.x.4500: NONESP-encap: isakmp: child_sa ikev2_auth[I]
16:57:46.712911 IP 192.168.10.200 > x.x.x.x: ip-proto-17
16:57:53.913742 IP 192.168.10.200.4500 > x.x.x.x.4500: NONESP-encap: isakmp: child_sa ikev2_auth[I]
16:57:53.913799 IP 192.168.10.200 > x.x.x.x: ip-proto-17
16:58:02.458669 IP x.x.x.x.500 > 192.168.10.200.500: [|isakmp]
16:58:06.874834 IP 192.168.10.200.4500 > x.x.x.x.4500: NONESP-encap: isakmp: child_sa ikev2_auth[I]
16:58:06.874884 IP 192.168.10.200 > x.x.x.x: ip-proto-17
sunのtcpdump:
16:59:06.521762 IP y.y.y.y.500 > 10.135.1.200.500: isakmp: parent_sa ikev2_init[I]
16:59:06.556423 IP 10.135.1.200.500 > y.y.y.y.500: isakmp: parent_sa ikev2_init[R]
16:59:26.556324 IP 10.135.1.200.500 > y.y.y.y.500: [|isakmp]
PythonインタプリタをSun
で開いて入力したため、venus
はポート4500でパケットを取得しないようです。これは奇妙です。
In [1]: from socket import *
In [2]: x = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
In [3]: x.sendto('', ('x.x.x.x', 4500))
Out[3]: 0
そして、パケットが受信されました:
17:02:45.246769 IP y.y.y.y.44335 > 10.135.1.200.4500: [|isakmp]
私も設定してみました
port_nat_t = 6000
両側のcharon
セクションにありますが、ポート4500を使用しようとします
証明書と証明書リクエストによりIKE_AUTH
メッセージは非常に大きくなる可能性があるため、IPレイヤーでフラグメント化する必要があります(これらのフラグメントはtcpdump
キャプチャのvenus
で確認できます)。おそらく、NAT Sun
のボックスは、断片化されたパケットの再構築に問題があるか、単にそれらをドロップするだけです。
回避策として、2つのピアの証明書を両側にインストールして、もう一方のピアの証明書を含むファイルを指すようにrightcert
を適切に設定することができます。
それが終わったら、rightsendcert=never
両端で、証明書要求が送信されないようにします。 leftsendcert
のデフォルトはifasked
であるため、ピアは最終的に証明書を送信せず、メッセージサイズはIPフラグメントを回避するために十分に小さくなければなりません。
ちなみに、UDPポート50を開く必要はありません。NATトラバーサルを使用しない場合、IP プロトコル 50(ESP)を許可する必要がありますが、 NATが関係するESPパケットはUDPカプセル化されるため、UDPポート500および4500を開くだけで十分です。