クラウドにSoftEtherVPNサーバーを設置して、ファイアウオールでListnerポートを開ける前にクライアントから接続できないことを確認しようとしたら、あっさり接続できてしまった。デフォルトでは、NATトラバーサル機能が有効になっているため、管理ポートへの接続できない場合には、NATトラバーサル機能で接続してしまう。
adminip.txtのIP制限だけでいいという考えもあるが、ファイアウオールによる接続制限も有効にしたいので、サーバー側のNATトラバーサル機能を無効にする。
(繋がった時の状況)
状態としては、以下。ファイアウォールはL2Tp/IPSec用の設定となっている。
- サーバーはデフォルトで NATトラバーサル機能が有効
- ファイアウオールで、Listner ポートは開放していない
- サーバーのFirewallDでは、ssh,dhcpv6-client,ipsecが許可
- ニフクラのファイアウォールではssh,udp500,4500を許可※
- OUT側の制限は共になし
※ニフクラでは、自分で設定したもの以外にデフォルトルールが設定されている
https://cloud.nifty.com/spec/fw/default.htm
SoftEther VPNサーバー管理マネージャー で、接続先ホスト名「サーバーのホスト名」、ポート「Listnerのポート」を指定して接続すると繋がってしまう。NATトラバーサル機能で繋がっている。TCPコネクションを見ると、Listnerポートでは接続しておらず、プロセス内での接続が発生してるだけ。
# ss -np | grep vpnserver
tcp ESTAB 0 0 127.0.0.1:40000 127.0.0.1:45962 users:(("vpnserver",pid=3282,fd=81))
tcp ESTAB 0 0 127.0.0.1:45962 127.0.0.1:40000 users:(("vpnserver",pid=3282,fd=80))
接続先ホスト名「サーバーのホスト名/tcp」としてtcp接続に限定すると、期待通り接続に失敗する。
(NATトラバーサル機能について)
ファイアウオールがあっても穴を作って通しちゃうという素晴らしい(というか恐ろしい)機能なので、扱いが要注意。開発者さんの以下ブログを参照。
http://d.hatena.ne.jp/softether/20121128#p2
http://d.hatena.ne.jp/softether/20121128#p7
「日本国内の 約 95.7% のファイアウォール・NAT を「外から内に」通過することができます。」とあるのが非常に興味深い。この数値はどう測ったのだろうか。
クライアントではTCP接続できないと、「/tcp」の指定が無ければNATトラバーサルで接続する仕様になっているらしい。
https://ja.softether.org/4-docs/3-kb/VPNFAQ011
(NATトラバーサルの無効化方法)
管理ポートの接続は確実に制限したいのでサーバーのNATトラバーサル機能を無効にする。サーバー停止した状態で、コンフィグファイルを編集することで、サーバー側のNATトラバーサル機能を無効にできる。
cd /usr/local/vpnserver
cp -p vpn_server.config vpn_server.config.org
vi vpn_server.config
-------------------------------
:
declare ServerConfiguration
{
:
bool DisableNatTraversal true
:
-------------------------------
再起動すると、管理ListnerのTCPポートを閉じた状態では、クライアントから接続できないことが確認できた。