SoftEther VPN クライアントが意図せず VPN サーバーと VPN 接続できてしまっていたので調べてみた。

前書き

ラズパイゼロに SoftEther VPN クライアント (VPN クライアント) をインストールして遊んでいる時に、まだ VPN 接続できないはずなのに SoftEther VPN サーバー (VPN サーバー) と VPN 接続できてしまっていたことに気がついた。

勉強になったのでこれについて書いておこうと思う。

VPN 接続できていると気がついたきっかけ

VPN 接続できたことを確認する方法の 1 つとして、VPN クライアント側の仮想 LAN カードに IP アドレスが設定されることが挙げられます。仮想 LAN カードの IP アドレスを固定設定するのではなく、DHCP サーバーからもらったアドレスを設定する場合を前提にしています。

仮想 LAN カードに意図した IP アドレスが設定されるということは VPN 接続が成立しているために、VPN サーバー側にある DHCP サーバーから IP アドレスがもらえていることを意味します。

今回ラズパイゼロを触っている時にこのことに気がついたわけです。

DHCP サーバーから IP を貰えるようにするために VPN サーバー側のルーターで DNAT の設定をしていなかったので VPN 接続が成立しないと考えていた時に起こった事象でした。「あれ、おかしいな」と思ったわけです。

あれこれ触った作業記録が残っている範囲でここまでの流れを記しておこう。

まず、VPN クライアントを起動させるところまでの記録から。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
        valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b8:27:eb:60:9b:da brd ff:ff:ff:ff:ff:ff
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0e:c6:c1:4d:e0 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.21/24 brd 172.16.1.255 scope global noprefixroute eth0
        valid_lft forever preferred_lft forever
    inet6 fe80::7a61:6aa0:5380:4a4c/64 scope link 
        valid_lft forever preferred_lft forever
$ cd /usr/local/vpnclient/
$ ps -ef | grep vpnc
nobi 842 819 0 08:28 pts/0 00:00:00 grep --color=auto vpnc
$ sudo ./vpnclient start
The SoftEther VPN Client service has been started.
$ ps -ef | grep vpnc
root 847 1 0 08:28 ? 00:00:00 /usr/local/vpnclient/vpnclient execsvc
root 848 847 20 08:28 ? 00:00:00 /usr/local/vpnclient/vpnclient execsvc
nobi 874 819 0 08:28 pts/0 00:00:00 grep --color=auto vpnc
$

sudo ./vpnclient start で、VPN クライアントを起動させる前に ip a コマンドで IP アドレスを確認しています。まだ VPN クライアントの仮想 LAN カードが表示されていない状態でした。

VPN クライアント起動後に ip a をしてみると以下のようになりました。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
        valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b8:27:eb:60:9b:da brd ff:ff:ff:ff:ff:ff
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0e:c6:c1:4d:e0 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.21/24 brd 172.16.1.255 scope global noprefixroute eth0
        valid_lft forever preferred_lft forever
    inet6 fe80::7a61:6aa0:5380:4a4c/64 scope link 
        valid_lft forever preferred_lft forever
5: vpn_rpz_vnic: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 5e:30:36:15:0c:f7 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::125c:33e6:cac:66db/64 scope link 
        valid_lft forever preferred_lft forever
    inet6 fe80::5c30:36ff:fe15:cf7/64 scope link 
        valid_lft forever preferred_lft forever
$

vpn_rpz_vnic というインターフェイスが登場しました。これこそが VPN クライアントに設定した仮想 LAN カードです。しかし、 IP アドレスが設定されていない状態にあります。

この時から数分後に VPN クライアントのログファイル (/usr/local/vpnclient/client_log/client_20230109.log を見た時に VPN 接続できていることに気が付きました。

$ sudo cat client_log/client_20230109.log
2023-01-09 08:28:12.533 ------------------------------------------------------
2023-01-09 08:28:12.533 SoftEther VPN Client Version 4.41 Build 9782 (English)
2023-01-09 08:28:12.533 Compiled 2022/11/17 16:36:25 by buildsan at crosswin with OpenSSL 3.0.7
2023-01-09 08:28:12.533 The SoftEther VPN Client Engine has been started.
2023-01-09 08:28:12.533 Loading configuration file...
2023-01-09 08:28:12.563 Monitoring the directory "/usr/local/vpnclient". If the amount of available free disk space becomes less than 100.00 MBytes, the backup files for log files and configurations that are saved on the sub-directories of this directory will be automatically deleted in the order of oldest first. The amount of free disk space that determines when to start deletion can be modified by changing the "AutoDeleteCheckDiskFreeSpaceMin" item in the configuration file.
2023-01-09 08:28:12.624 The configuration file has been loaded.
2023-01-09 08:28:12.645 Connection processing for VPN Connection Setting "vpn_to_home" has started.
2023-01-09 08:28:12.671 VPN Connection Setting "vpn_to_home": Connection operation starting (this is now 1 times).
2023-01-09 08:28:15.661 VPN Connection Setting "vpn_to_home": Now connected. Session name: "SID-RPZHOGE-14"
$

青字箇所の Now connected に気がついたというわけです。もいっかい ip a をやってみました。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
        valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b8:27:eb:60:9b:da brd ff:ff:ff:ff:ff:ff
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0e:c6:c1:4d:e0 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.21/24 brd 172.16.1.255 scope global noprefixroute eth0
        valid_lft forever preferred_lft forever
    inet6 fe80::7a61:6aa0:5380:4a4c/64 scope link 
        valid_lft forever preferred_lft forever
5: vpn_rpz_vnic: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 5e:30:36:15:0c:f7 brd ff:ff:ff:ff:ff:ff
    inet 10.2.0.3/24 brd 10.2.0.255 scope global dynamic noprefixroute vpn_rpz_vnic
        valid_lft 258969sec preferred_lft 226569sec
    inet6 fe80::125c:33e6:cac:66db/64 scope link 
        valid_lft forever preferred_lft forever
    inet6 fe80::5c30:36ff:fe15:cf7/64 scope link 
        valid_lft forever preferred_lft forever
$

仮想 LAN カードに 10.2.0.3 の IP が設定されました。この IP は VPN サーバー側にある DHCP サーバー (我が家のヤマハルーター) から配布されている IP のため、VPN 接続ができていることに気がついたというわけです。

VPN over UDP with NAT トラバーサルで VPN 接続が確立していた

VPN サーバー側のログファイル (/usr/local/vpnserver/vpn_20230109.log) を見てみると以下のようになっていました。

2023-01-09 17:28:15.449 On the TCP Listener (Port 0), a Client (IP address 49.242.xxx.yyy, Host name "yyy.xxx.242.49.ap.yournet.ne.jp", Port number 61997) has connected.
2023-01-09 17:28:15.449 For the client (IP address: 49.242.xxx.yyy, host name: "yyy.xxx.242.49.ap.yournet.ne.jp", port number: 61997), connection "CID-16" has been created.
2023-01-09 17:28:15.541 SSL communication for connection "CID-16" has been started. The encryption algorithm name is "TLS_AES_256_GCM_SHA384".
2023-01-09 17:28:15.613 [HUB "lenovohoge-vpn-vhub"] The connection "CID-16" (IP address: 49.242.xxx.yyy, Host name: yyy.xxx.242.49.ap.yournet.ne.jp, Port number: 61997, Client name: "SoftEther VPN Client", Version: 4.41, Build: 9782) is attempting to connect to the Virtual Hub. The auth type provided is "External server authentication" and the user name is "rpzhoge".
2023-01-09 17:28:15.613 [HUB "lenovohoge-vpn-vhub"] Connection "CID-16": Successfully authenticated as user "rpzhoge".
2023-01-09 17:28:15.613 [HUB "lenovohoge-vpn-vhub"] Connection "CID-16": The new session "SID-RPZHOGE-14" has been created. (IP address: 49.242.xxx.yyy, Port number: 61997, Physical underlying protocol: "VPN over UDP with NAT-T (IPv4)")
2023-01-09 17:28:15.613 [HUB "lenovohoge-vpn-vhub"] Session "SID-RPZHOGE-14": The parameter has been set. Max number of TCP connections: 2, Use of encryption: Yes, Use of compression: No, Use of Half duplex communication: No, Timeout: 20 seconds.
2023-01-09 17:28:15.613 [HUB "lenovohoge-vpn-vhub"] Session "SID-RPZHOGE-14": VPN Client details: (Client product name: "SoftEther VPN Client", Client version: 441, Client build number: 9782, Server product name: "SoftEther VPN Server (64 bit)", Server version: 439, Server build number: 9772, Client OS name: "Linux", Client OS version: "Unknown Linux Version", Client product ID: "--", Client host name: "raspberrypi", Client IP address: "0.0.0.0", Client port number: 33349, Server host name: "lenovohoge.softether.net", Server IP address: "126.114.aaa.bbb", Server port number: 5555, Proxy host name: "", Proxy IP address: "0.0.0.0", Proxy port number: 0, Virtual Hub name: "lenovohoge-vpn-vhub", Client unique ID: "134B184DF00633A91ECA8F26DE9DD75D")
2023-01-09 17:28:15.980 [HUB "lenovohoge-vpn-vhub"] Session "SID-LOCALBRIDGE-1": The DHCP server of host "00-A0-DE-84-B8-C7" (10.2.0.254) on this session allocated, for host "SID-RPZHOGE-14" on another session "5E-30-36-15-0C-F7", the new IP address 10.2.0.3.
2023-01-09 17:28:19.421 On the TCP Listener (Port 0), a Client (IP address 49.242.xxx.yyy, Host name "yyy.xxx.242.49.ap.yournet.ne.jp", Port number 63519) has connected.
2023-01-09 17:28:19.421 For the client (IP address: 49.242.xxx.yyy, host name: "yyy.xxx.242.49.ap.yournet.ne.jp", port number: 63519), connection "CID-17" has been created.

VPN over UDP with NAT-T のログが記録されていることから、その名の通り VPN クライアントが、NAT トラバーサルを使って VPN over UDP つまり、UDP で接続しようと試みた結果接続されたのではと考えられます。

この VPN over UDP with NAT-T については理解が難しく正確に把握できていない部分です。

SoftEther VPN の NAT トラバーサル機能について

公式サイトの情報は以下にあります。

ダイナミック DNS 機能および NAT トラバーサル機能

組み込みの NAT トラバーサル機能は、NAT やファイアウォール上に「パンチホール」を開けることで機能します。VPN Client または VPN Bridge が NAT の内側に設置されている VPN Server に対して接続しようとしたときは、接続要求パケットはその穴を通って到達します。穴は SoftEther VPN Server によって自動的に作成されるため、NAT 上で特別な設定は必要ありません。

公式サイトのこの説明部分が NAT トラバーサルの核な部分だと思いますが、「VPN サーバーが開けた穴」をどのように VPN クライアントが知ることができるのか、がわからない部分です。

VPN サーバーがパンチホールで開ける UDP のポート番号があらかじめ決まっているのかもしれません。そういう動作の場合、VPN クライアントはあらかじめ決まっているその UDP ポート番号に向けて接続を試みる、という動作なのかな。いつか時間があれば調べてみるかも。

VPNFAQ011. NAT トラバーサル機能を用いた通信が行なわれる条件

通常の TCP/IP を用いた接続と、NAT トラバーサル機能を用いた接続とは、同時に試行されます。ただし、途中のルータや NAT の負荷を軽減するため、通常の TCP/IP 接続が開始されてから 30 ミリ秒後に NAT トラバーサル接続が試行されます。これら 2 つの接続は並行して試行されます。
通常の TCP/IP を用いた接続の確立が先に成功した場合は、通常の TCP/IP を用いた接続が採用されます。

本投稿を書くきっかけとなった「意図せず VPN 接続ができてしまった原因」はココにあったと判断できます。通常の TCP/IP 接続と同時に NAT トラバーサルを使用した接続が同時に試行される動作のためですね。

ほほー、と思った。

おまけ

上記の公式サイトにある「通常の TCP/IP を用いた接続の確立が先に成功した場合は、通常の TCP/IP を用いた接続が採用されます。」の動作を確認してみたくなった。

これは、VPN サーバー側のルーター (我が家のヤマハルーター RTX810) で DNAT の設定をすれば確認可能だ。

RTX810 に以下の DNAT 設定を追加した。

nat descriptor masquerade static 1 3 172.16.2.2 tcp 5555

簡単に言うと、インターネット側から RTX810 宛に宛先ポート番号 tcp 5555 のパケットが届いたら VPN サーバーの IP である 172.16.2.2 に転送させる設定だ。

この設定を入れることで、先に通常の TCP/IP を用いた接続が先に確立することが想定され、NAT トラバーサルを用いた VPN 接続は確立しないことを確認します。

上記 DNAT 設定をした後、ラズパイゼロ側で VPN クライアントを起動させてみた。その後の VPN サーバー側のログ (/usr/local/vpnserver/server_log/vpn_20230109.log) は以下となった。

2023-01-09 20:14:58.395 On the TCP Listener (Port 5555), a Client (IP address 49.242.xxx.yyy, Host name “yyy.xxx.242.49.ap.yournet.ne.jp”, Port number 61925) has connected.
2023-01-09 20:14:58.395 For the client (IP address: 49.242.xxx.yyy, host name: “yyy.xxx.242.49.ap.yournet.ne.jp”, port number: 61925), connection “CID-23” has been created.
2023-01-09 20:14:58.691 SSL communication for connection “CID-23” has been started. The encryption algorithm name is “TLS_AES_256_GCM_SHA384”.
2023-01-09 20:14:58.804 [HUB “lenovohoge-vpn-vhub”] The connection “CID-23” (IP address: 49.242.xxx.yyy, Host name: yyy.xxx.242.49.ap.yournet.ne.jp, Port number: 61925, Client name: “SoftEther VPN Client”, Version: 4.41, Build: 9782) is attempting to connect to the Virtual Hub. The auth type provided is “External server authentication” and the user name is “rpzhoge”.
2023-01-09 20:14:58.804 [HUB “lenovohoge-vpn-vhub”] Connection “CID-23”: Successfully authenticated as user “rpzhoge”.
2023-01-09 20:14:58.804 [HUB “lenovohoge-vpn-vhub”] Connection “CID-23”: The new session “SID-RPZHOGE-16” has been created. (IP address: 49.242.xxx.yyy, Port number: 61925, Physical underlying protocol: “Standard TCP/IP (IPv4)“)
2023-01-09 20:14:58.804 [HUB “lenovohoge-vpn-vhub”] Session “SID-RPZHOGE-16”: The parameter has been set. Max number of TCP connections: 2, Use of encryption: Yes, Use of compression: No, Use of Half duplex communication: No, Timeout: 20 seconds.
2023-01-09 20:14:58.814 [HUB “lenovohoge-vpn-vhub”] Session “SID-RPZHOGE-16”: VPN Client details: (Client product name: “SoftEther VPN Client”, Client version: 441, Client build number: 9782, Server product name: “SoftEther VPN Server (64 bit)”, Server version: 439, Server build number: 9772, Client OS name: “Linux”, Client OS version: “Unknown Linux Version”, Client product ID: “–“, Client host name: “raspberrypi”, Client IP address: “172.16.1.21”, Client port number: 37260, Server host name: “lenovohoge.softether.net”, Server IP address: “126.114.aaa.bbb”, Server port number: 5555, Proxy host name: “”, Proxy IP address: “0.0.0.0”, Proxy port number: 0, Virtual Hub name: “lenovohoge-vpn-vhub”, Client unique ID: “75C256E3B7E0385D397254062C8DD1A3”)
2023-01-09 20:14:59.646 [HUB “lenovohoge-vpn-vhub”] Session “SID-LOCALBRIDGE-1”: The DHCP server of host “00-A0-DE-84-B8-C7” (10.2.0.254) on this session allocated, for host “SID-RPZHOGE-16” on another session “5E-30-36-15-0C-F7”, the new IP address 10.2.0.3.
2023-01-09 20:14:59.933 On the TCP Listener (Port 5555), a Client (IP address 49.242.xxx.yyy, Host name “yyy.xxx.242.49.ap.yournet.ne.jp”, Port number 63188) has connected.

VPN over UDP with NAT-T のログはなく、Standard TCP/IP と記録された。公式サイトに説明のある通りの動作結果となった。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください