連休です
暇です
こんな時は、VPNサービスでも構築します
ということで、OCI上にVPNサーバーを構築して、VPNサービスを展開してみましょう。
ホスト通しの接続(Site to Site)ではなくて、Windows11クライアント等から、いっぱい接続されてしまうサーバーを構築します。
で、今回は、素のWindows11で、VPN接続を実現する為に、libreswanを使います。
セキュリティ強度を上げて、業務用途でも使えるぐらいにしてみたいと思います。
しっかり、クライアント管理も行って、やばい人は、Banするようにしてみました。
まず、Publicサブネットをさくっと作って下さい。
で、Ubuntu 22.04 を、Public IP 付きで、 作成しましょう。 A1.FlexでもOk
そいつのNSGは、以下です。
イングレス | ソースCIDR:0.0.0.0/0 | UDP | 500,4500 |
エグレス | 宛先CIDR:0.0.0.0/0 | UDP | 500,4500 |
後、VPN越しに接続が必要なとこは、エグレスを開けて下さい。
それと、イングレス TCP 22 は、開けてね。
まず、カーネルパラメーターです。
/etc/sysctl.d/50-libreswan.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.rp_filter = 0
次、必要なアプリをインストールします。
apt install libreswan iptables iptables-persistent rsyslog
Libreswanのコンフィグです。
サンプルでは、
サーバーIP:10.6.0.206
グローバルFQDN:vpnsv.live-on.top
クライアント払い出しIP:10.99.99.2-10.99.99.250
DNS:10.6.0.180,8.8.8.8
です。
/etc/ipsec.d/oci-ipsec.conf
conn ikev2-cp
# The server's actual IP goes here - not elastic IPs
left=10.6.0.206
leftcert=vpnsv.live-on.top
leftid=@vpnsv.live-on.top
leftsendcert=always
leftsubnet=0.0.0.0/0
leftrsasigkey=%cert
# Clients
right=%any
# your addresspool to use - you might need NAT rules if providing full internet to clients
rightaddresspool=10.99.99.2-10.99.99.250
rightca=%same
rightrsasigkey=%cert
# DNS servers for clients to use
modecfgdns=10.6.0.180,8.8.8.8
narrowing=yes
# recommended dpd/liveness to cleanup vanished clients
dpddelay=30
dpdtimeout=120
dpdaction=clear
ikev2=insist
rekey=no
# ikev2 fragmentation support requires libreswan 3.14 or newer
fragmentation=yes
ike=aes256-sha256-modp2048
esp=aes256-sha256,aes256-sha1
include /etc/ipsec.d/allowed-ikev2-cp.conf
こっちのファイルは、許可したクライアント(CN)を記述します。
/etc/ipsec.d/allowed-ikev2-cp.conf
conn allowed-ikev2-cp-1
also=ikev2-cp
rightid="CN=hogehoge.net, O=livetop"
auto=add
conn allowed-ikev2-cp-2
also=ikev2-cp
rightid="CN=hogehoge2.net, O=livetop"
auto=add
パーミッションを修正しないとダメ
chmod 600 /etc/ipsec.d/oci-ipsec.conf
chmod 600 /etc/ipsec.d/allowed-ikev2-cp.conf
こっから面倒くさい 証明書作成です
基本、パスワードは、空で良いです。
まずは、CAとサーバー証明書です。
期限は、12か月としています。
証明書作成
mkdir ${HOME}/certsig
certutil -N -d sql:${HOME}/certsig
サーバー証明書
certutil -S -c "livetop CA" -n "vpnsv.live-on.top" -s "O=livetop,CN=vpnsv.live-on.top" -k rsa -g 4096 -v 12 -d sql:${HOME}/certsig -t ",," -1 -6 -8 "vpnsv.live-on.top"
Generating key.
0
2
8
Is this a critical extension [y/N]? N
0
1
8
Is this a critical extension [y/N]? N
p12形式へエクスポート
pk12util -o l2tpsv.p12 -n "vpnsv.live-on.top" -d sql:${HOME}/certsig/
作成したp12形式証明書をpluto DBへインポートする。
ipsec import l2tpsv.p12
クライアント証明書です
こいつは、1つを共有しても良いんですが、接続してくる人を識別したいなら、1つづつ作って配布しましょうね。
サンプルでは、クライアント名(CN)を hogehoge.net としています。
certutil -S -c "livetop CA" -n "hogehoge.net" -s "O=livetop,CN=hogehoge.net" -k rsa -g 4096 -v 12 -d sql:${HOME}/certsig -t ",," -1 -6 -8 "hogehoge.net"
Generating key.
0
2
8
Is this a critical extension [y/N]? N
0
1
8
Is this a critical extension [y/N]? N
p12形式へエクスポート
pk12util -o hogehoge.p12 -n "hogehoge.net" -d sql:${HOME}/certsig/
クライアント証明書 p12形式(hogehoge.p12)を Windowsにインポート(ダブルクリックで良しです)します。 自動で配置させれば良い感じのとこに収まります。但し、保存場所は、現在のユーザーでなくて、ローカルコンピューターを選択してね。
仕上げに、暗号強度に問題があるので、Windowsのレジストリを修正しましょうね。グループポリシーなんかで、修正させれば良いかと
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Rasman\Parameters\NegotiateDH2048_AES256 [DWORD 32bit] 1
最後に、firewallを設定します。
払い出した 10.99.99.2-10.99.99.250 に対して IPマスカレード設定をすることで、内部を自由に接続させてあげましょう。
いやなら、iptablesや OCIのNSG で、制限するのも有りです。
iptables -F
iptables -X
iptables -t nat -A POSTROUTING -s 10.99.99.2/24 -o enp0s6 -j MASQUERADE
保存
netfilter-persistent save
さーて、Windows11 の設定ですね。
ネットワークとインターネットのとこに、VPNがあるので選択します。
VPN接続を追加します。
サーバー名:vpnsv.live-on.top
VPNの種類:IKEv2
サインイン情報の種類:証明書
保存して、詳細オプションで、その他のVPNプロパティを修正しましょう。
セキュリティ-> 認証 -> コンピューターの証明書を使う <- 選択する。
これで良いかと思います。
基本的には、こんな感じですね。
設定変更したら、再起動しましょう。
systemctl restart ipsec
動作確認
ipsec status
ログ閲覧
journalctl -u ipsec
接続記録確認
cat /var/log/auth.log
全部やり直しは、管理してるデータベースを削除します。
systemctl stop ipsec
rm /var/lib/ipsec/nss/*.db
指定ユーザーの期限が切れたら、クライアント証明書を作り直して配布すれば継続します。
やばいユーザーに配布してしまったら、/etc/ipsec.d/allowed-ikev2-cp.conf から、やばいユーザー(CN)を削除すれば拒否します。
/etc/ipsec.d/allowed-ikev2-cp.conf を修正したら、systemctl restart ipsec しましょう。