Oracle Cloud Infrastructure (OCI) でSoftEtherを立ち上げてIPsecでVPN接続

f:id:atauky:20190507003936p:plain

VPN接続をしたい

yourpalm.jubenoum.com

などで述べていたとおり、出先での公衆無線LAN接続時にセキュリティを少しでも確保すべく、VPN接続を試みてきました。

歴代の方式を振り返りますと、

  • さくらのVPS上CentOS6.4にL2TP、IPsecのサーバを立てる
  • AWSでインスタンス(Ubuntu)をたててSoftEtherをインストール
  • AWS Lightsail上のUbuntuにSoftEtherをインストール

と進んできました。

LightsailはAWSで提供されるVPSサービスで3.50USDからサーバを使えます。ElasticIPの割当、1TB転送も含めてこのお値段なので、VPN接続を起動しておくにはリーズナブルでしばらくこれで運用していました。

料金 - Amazon Lightsail | AWS

次にやるなら永久無料枠のあるGCP(Google Cloud Platform)かなあと思っていたのですが、OCI(Oracle Cloud Infrastructure)は通信量が破格に安くAlways Free枠でインスタンスを起動できるのでこちらでやってみようと思ってみた次第です。

AWSと比べて低コストのCloud Infrastructure | Oracle 日本

AWSとOCIでの設定比較

VPNの接続をするに際して、クラウドサービス上で通す通信の設定をどうするかというのは一つポイントになります。 AWSでの設定になれている身としてOCIでの設定でつまずいたポイントは以下の2点です。

  • AWSはAND条件、OCIはOR条件
  • AWSはインスタンスでパケットフィルタしていない、OCIはしている

AWSはAND条件、OCIはOR条件

これだけではなんのことやらだと思いますが、ざっくり以下のような要領になっています。

サービス AWS OCI
仮想ネットワーク VPC(Virtual Private Cloud) 仮想クラウド・ネットワーク
A.サブネットレベルでの通信制御 ネットワークアクセスコントロールリスト(ACL) セキュリティリスト
B.インスタンスに割り当てる通信制御 セキュリティグループ ネットワーク・セキュリティ・グループ(NSG)
A.B.の通信制御の方法 A.B.両方で許可されていれば通信可能(AND条件) A.B.どちらかで許可されていれば通信可能(OR条件)

AWSのACLは「全部許可」が初期設定になっています。セキュリティグループでSSH(TCP 22番ポート宛)が許可されているのでそれでSSHの通信ができるという設定になっています。

OCIは両方とも「SSHのみ許可」されています。OR条件なので、他の通信を通したいときにはNSGのみ許可するのが良いと考えます。

OCIはインスタンスでパケットフィルタが機能している

一番ハマったのがこちらです。上の設定をしてインスタンスまでUDPのパケットが届いているのに、サーバが反応していない…となって、パケットフィルタの可能性を思いつき、iptablesコマンドを叩いたものであります。

Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp spt:123
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host

うん、SSHしか通らないですね…

AWSは思想的にセキュリティグループまででフィルタするという考えのようです。実質セキュリティグループが個々のインスタンスのファイアウォールとして機能していますから納得がいきます。

OCIはさらに強固に、インスタンスも含めてセキュリティを担保するという考えのようです。

設定

OCIのアカウントを取得する手順などは今回は考えません。また、画面なども今後ころころ変わっていくことが想定されるので主に考え方を記載していきます。

インスタンスの起動

OCIのコンソールでの作業です。 なるべくAlways Freeの枠内としたいので、

  • イメージは「Canonical Ubuntu 18.04」
  • シェイプは「VM.Standard.E2.1.Micro」

を選択しています。SSHアクセスのための秘密鍵保存を忘れずに。 初回起動時には、ネットワーキンググループは自動で作成してもらいます。

NSG(ネットワークセキュリティグループ)の設定

OCIのコンソールでの作業です。 ネットワークセキュリティグループで以下の要領で通信を許可しました。SSH(宛先ポート22番)はデフォルトで設定が入っています。

方向 ステートレス ソース プロトコル ソースポート 宛先ポート
イングレス いいえ CIDR 0.0.0.0/0 TCP ALL 22
イングレス いいえ CIDR 0.0.0.0/0 TCP ALL 443
イングレス いいえ CIDR 0.0.0.0/0 TCP ALL 992
イングレス いいえ CIDR 0.0.0.0/0 TCP ALL 1194
イングレス いいえ CIDR 0.0.0.0/0 TCP ALL 5555
イングレス いいえ CIDR 0.0.0.0/0 UDP ALL 500
イングレス いいえ CIDR 0.0.0.0/0 UDP ALL 4500

VNICの設定

OCIのコンソールでの作業です。 ソース・宛先チェックを無効にします。

仮想ネットワーク・インタフェース・カード(VNIC)

デフォルトでは、すべてのVNICがネットワーク・トラフィックに対してソース/宛先チェックを実行します。VNICは、各ネットワーク・パケットのヘッダーにリストされているソースと宛先を確認します。VNICがソースまたは宛先でない場合、パケットはドロップされます。 VNICがトラフィックを転送する必要がある場合(たとえば、ネットワーク・アドレス変換(NAT)を実行する必要がある場合)、VNICでソース/宛先チェックを無効化する必要があります。

iptablesの設定

OSにログインしての作業です。 NSGと同じポートについて通信を許可します。 iptablesでコマンドを実行後、永続化する方法でやりました。

$ sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
$ sudo iptables -I INPUT -p tcp -m tcp --dport 992 -j ACCEPT
$ sudo iptables -I INPUT -p tcp -m tcp --dport 992 -j ACCEPT
$ sudo iptables -I INPUT -p tcp -m tcp --dport 1194 -j ACCEPT
$ sudo iptables -I INPUT -p tcp -m tcp --dport 5555 -j ACCEPT
$ sudo iptables -I INPUT -p udp -m udp --dport 500 -j ACCEPT
$ sudo iptables -I INPUT -p udp -m udp --dport 4500 -j ACCEPT
$ sudo /etc/init.d/netfilter-persistent save

SoftEtherのインストール

$ mkdir ~/src
$ cd ~/src
$ wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.29-9680-rtm/softether-vpnbridge-v4.29-9680-rtm-2019.02.28-linux-x64-64bit.tar.gz
$ tar zxvf softether-vpnserver-v4.29-9680-rtm-2019.02.28-linux-x64-64bit.tar.gz
$ cd vpnserver
$ yes 1 | make
$ chmod 600 *
$ chmod 700 vpncmd
$ chmod 700 vpnserver
$ cd ..
$ sudo cp -rp vpnserver /usr/local/
$ sudo chown -R root:root /usr/local/vpnserver/

サービス設定

/etc/systemd/system/vpnserver.service

[Unit]
Description=SoftEther VPN Server
After=network.target auditd.service
ConditionPathExists=!/usr/local/vpnserver/do_not_run

[Service]
Type=forking
EnvironmentFile=-/usr/local/vpnserver
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
KillMode=process
Restart=on-failure

# Hardening
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=full
ReadOnlyDirectories=/
ReadWriteDirectories=-/usr/local/vpnserver
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_SYS_NICE CAP_SYS_ADMIN CAP_SETUID

[Install]
WantedBy=multi-user.target
$  sudo systemctl daemon-reload
$  sudo systemctl enable vpnserver
$  sudo systemctl start vpnserver

停止するときは

$  sudo systemctl stop vpnserver

vpnserverの設定

WindowsPCからマネージャを使って設定を行います。 以下の作業を実施すればOK。詳細は割愛。

ja.softether.org


参考

SoftEther+VPN構築ガイド

SoftEther+VPN構築ガイド