NATトラバーサル機能の無効化

クラウドに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接続に限定すると、期待通り接続に失敗する。

SoftEther VPN サーバー管理マネージャ

(NATトラバーサル機能について)

https://ja.softether.org/4-docs/2-howto/6.VPN_Server_Behind_NAT_or_Firewall/1.Dynamic_DNS_and_NAT_Traversal#NAT_.E3.83.88.E3.83.A9.E3.83.90.E3.83.BC.E3.82.B5.E3.83.AB.E6.A9.9F.E8.83.BD

ファイアウオールがあっても穴を作って通しちゃうという素晴らしい(というか恐ろしい)機能なので、扱いが要注意。開発者さんの以下ブログを参照。

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ポートを閉じた状態では、クライアントから接続できないことが確認できた。

ニフクラで、CentOSサーバー設定

ニフクラで、CentOS(7.6)サーバー追加時に最初にやることのメモ 。ConoHaはサーバー側でファイアウォール設定だが、ニフクラは外部のファイアウォールを使うという違いがある。

「firewall-cmd」で確認すると、デーモンは実行していない。

# firewall-cmd --list-all
FirewallD is not running

# firewall-cmd --state
not running

# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

ファイアウォールは動作していないので、ニフクラのファイアウォールで設定する。それ以外は、ConoHaの時と同じ。

違いのある場所については以下。

1.サーバー追加時

サーバー設定で、ファイアウォールを追加する。ファイアウォールの設定は、「INルール追加」でプロトコル「SSH」で接続元種別「現在接続しているIPアドレス」とする。

2.サーバーの基本設定

2.0 パスワード設定

コンソールからログインする場合には、rootパスワードが必要となるので設定する。

https://cloud.nifty.com/cs/catalog/cloud_faq/catalog_120416000678_1.htm

2.3 SSHポート変更

「 2) ファイアウォールの設定変更」は、コントロールパネルの「ファイアウォール」から設定変更を行う。

ニフクラのファイアウォールだけでなく、内部のファイアウォールを有効にする場合の手順は、以下。

cd /usr/lib/firewalld/services/
cp -p ssh.xml ssh-????.xml
vi ssh-????.xml ※port="22"の22を変更したポート????に

cd /etc/firewalld/zones
vi public.xml  ※ssh.xmlをssh-????.xmlに変更

systemctl unmask firewalld
systemctl start firewalld
firewall-cmd --list-all ※確認
systemctl enable firewalld

Windows10でhosts設定

DNS変更する前に、新しいサーバーのテストをする場合に、hostsファイルを設定する時の手順。

(hostsファイルの場所)

C:\Windows\System32\drivers\etc

このファイルは、管理者でないと編集できないので、普通に開くとエラーになる。以下がMicroSoftのヘルプ(Vistaのままだが)。

https://support.microsoft.com/ja-jp/help/923947/you-cannot-modify-the-hosts-file-or-the-lmhosts-file-in-windows-vista

参考までに、自分がWindows10でやる時の手順。

1)スタートボタンをクリックし「コマンドプロンプト(管理者)」をクリックする。「ユーザーアカウント制御」のメッセージが出るので、「はい」をクリック。

2)コマンドプロンプロトで、ディレクトリを変更。

cd drivers\etc

3)ノートパッドでhostsを開く

notepad hosts

4)編集して、「ファイル」-「上書き保存」して終了。

notepad hosts

ブラウザで前のアドレスでアクセスしていた場合は、一旦ブラウザを閉じて開き直せば設定した新しいアドレスにアクセスするようになる。