夏休みも終わりに近づいて参りました。
みなさん 自由研究は、進んでいますか。
是非、お薦めしたいのが、OCIと自宅をVPNで接続する自由研究等いかがでしょうか。
ということで、前回は、ER-Xで構築したVPNですが、ER-Xも、入手困難となってしまいました。
これは、やばいということで、汎用的なPCで、構築するノウハウを得ておこうと思い、研究しておきました。
で、使用する機材は、Raspberry PI 4 Model B となります。
※この前、手に入れたLuckfox pico MAXで試したのですが、Kernelが対応していないようで面倒だから断念しました。
使用するOSは、OCIということで、OracleLinux 8.10 となります。
※9.4を試したのですが、ネットワークがストールして使い物にならなかったです。
VPNを張っておけば、OCIのグローバルIPと自分家のサーバーとかを連携出来ますしね。
早速、行ってみよう
今回は、静的ルーティングで実装します。
BGPは、研究中...
1.
OCIで、サイト間VPNを作成する。
これは、VCN作ったり、サブネット作ったり、色々としてから、DRGを作成してアタッチすることになります。
この辺りは、頑張って構築しておいて下さい。
後、顧客構内機器(CPE)を作っておいて下さい。
顧客構内機器とは、自分のとこのルーターのグローバルIPのことです。
CPEベンダーは、Libreswan でも選択しといて下さい。
※前提としてグローバルIPを取得しており、UDP 4500,500 を、OracleLinuxにポートマップしておいて下さい。NAT前提です。
2.
ネットワーキングメニュー - 顧客接続性から、サイト間VPNを選択します。
IPSec接続の作成 を押下します。
静的ルーティングを選択します。
オンプレミス・ネットワークへのルート:192.168.0.0/24
トンネルは、冗長性を考慮して2つ作ることが義務となっています。
トンネル1
IKE:Version2
IPv4トンネル内インタフェース - CPE:10.99.96.1/30
IPV4トンネル内インタフェース - Oracle:10.99.96.2/30
トンネル2
IKE:Version2
IPv4トンネル内インタフェース - CPE:10.99.97.1/30
IPV4トンネル内インタフェース - Oracle:10.99.97.2/30
作成完了すると、各トンネルの共有シークレットが発行されるので、これを記録しておきましょう。
それと、各トンネルのエンドポイントIPv4アドレス(Oracle VPN Public IP)を記録しましょうね。
前回、NATルーター内なので、識別子の変更が必要だったのですが、今回は、不要です。
3.
OracleLinux を 整えましょう。
取説は、ここ
RaspberryPI4に適当にインストール(ダウンロードして、ラズパイイメージャでMicroSDに焼く)して起動しておいて下さい。
初期ユーザー:root
パスワード:oracle
SDカード容量を最大限に生かす
growpart /dev/mmcblk0 3
btrfs filesystem resize max /
適当に、vimとtarとsudoぐらいをインストールしておいて下さい。※vscode使いの人は、tar入れないとダメですよ
dnf install vim tar sudo
固定IPにしないと面倒ですから、固定IPにしておきましょう。
GUIが無いから出来ないとか言わないように
CUIでも、良い感じのインターフェースがあります。
nmtui コマンドを実行してみて下さい。
日本語環境がほしいですか。
dnf install glibc-langpack-ja
localectl set-locale LANG=ja_JP.utf8
localectl set-keymap jp106
timedatectl set-timezone Asia/Tokyo
.bashrcの最後に LANG=ja_JP.utf8 を追加して下さいね。
これで、実用的な環境になりましたが、SELinuxなんて いらねー なんて方は、無効化しましょう
※VPN接続時のスクリプト実行を妨げるので、無効化しました。
grubby --update-kernel ALL --args selinux=0
最後に、sysctlの修正です。これを追記して下さい。
/etc/sysctl.d/50-libreswan.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 0
最後に再起動で
reboot
4.
IPSecを使って VPN を構築するのですが、使用するパッケージは、libreswanです。
なので、必要なパッケージをぶっこみます。
dnf install libreswan iptables
こっからは、LibreSwanの定義ファイル作成ですよ。
自分のグローバルIPを 130.50.26.127 としておきます。
オンプレ側のOracleLinuxのIPを 192.168.0.2 としておきます。
OCI側へのルート先(VCN)は、10.8.0.0/16 としておきます。
/etc/ipsec.d/oci-ipsec.conf
conn oracle-tunnel-1
left=192.168.0.2
leftid=130.50.26.127
right=168.130.51.125 # OCI VPN Public IP 1
authby=secret
leftsubnet=192.168.0.0/24
rightsubnet=10.8.0.0/16
auto=start
dpdaction=restart
dpddelay=30
dpdtimeout=120
pfs=yes
mark=5/0xffffffff
vti-interface=vti1
vti-routing=yes
ikev2=insist
ike=aes_cbc256-sha2_384;modp1536
phase2alg=aes_gcm256;modp1536
encapsulation=yes
ikelifetime=28800s
salifetime=3600s
leftupdown=/etc/ipsec.d/oci-updown.sh
conn oracle-tunnel-2
left=192.168.0.2
leftid=130.50.26.127
right=168.132.142.25 # OCI VPN Public IP 2
authby=secret
leftsubnet=192.168.0.0/24
rightsubnet=10.8.0.0/16
auto=start
dpdaction=restart
dpddelay=30
dpdtimeout=120
pfs=yes
mark=6/0xffffffff
vti-interface=vti2
vti-routing=yes
ikev2=insist
ike=aes_cbc256-sha2_384;modp1536
phase2alg=aes_gcm256;modp1536
encapsulation=yes
ikelifetime=28800s
salifetime=3600s
leftupdown=/etc/ipsec.d/oci-updown.sh
PSK共有シークレット定義
各トンネルの謎の秘密の暗号文字列を張り付けます。
/etc/ipsec.d/oci-ipsec.secrets
130.50.26.127 168.130.51.125: PSK "ii3UuTgLEghogeN1xCy64HuzvcUhogeTXSOSFxPJhogeXm5pDEcehogeOyuuukkG"
130.50.26.127 168.132.142.25: PSK "hogebd6VoraclUkXAhogedJQvEzone4KBK1234FENWsCuukkRseCpowerD5keZZ"
パーミッションを修正しなとダメ
chmod 600 /etc/ipsec.d/oci-ipsec.conf
chmod 600 /etc/ipsec.d/oci-ipsec.secrets
VPNルートスクリプトをカスタムしないとダメ
cp /usr/libexec/ipsec/_updown.xfrm /etc/ipsec.d/oci-updown.sh
/etc/ipsec.d/oci-updown.sh を修正する
~~
addvti() {
if [ -n "${VTI_IFACE}" ]; then
if [ -z "${CONNMARK_IN}" -o -z "${CONNMARK_OUT}" ]; then
echo "vti-interface option ignored because no mark was configured"
else
if [ "${VTI_ROUTING}" = yes ]; then
# Tuomo should improve this with using ${PLUTO_MY_CLIENT_NET}
# echo "setting up vti routing"
r=add
ip route list | grep -q "${PLUTO_PEER_CLIENT%/*}" && r=change
if [ "${r}" = change ]; then
# resolve LAN conflict by forcing host route for default gw
gw="$(ip ro li | grep ^default | awk '{ print $3;}')"
gwdev="$(ip ro li | grep ^default | awk '{ print $5;}')"
# echo "ip route add ${gw} dev ${gwdev}"
ip route add ${gw} dev ${gwdev} >/dev/null ||:
fi
srcip=""
if [ -n "${PLUTO_MY_SOURCEIP}" ]; then
srcip=" src ${PLUTO_MY_SOURCEIP}"
fi
# echo "ip route ${r} ${PLUTO_PEER_CLIENT} dev ${VTI_IFACE} ${srcip}"
#ip route ${r} ${PLUTO_PEER_CLIENT} dev ${VTI_IFACE} ${srcip}
#決め打ちだ
if [ "${r}" = change ]; then
ip route change ${PLUTO_PEER_CLIENT} mtu 1500 nexthop dev vti1 nexthop dev vti2 ${srcip}
else
ip route ${r} ${PLUTO_PEER_CLIENT} mtu 1500 dev ${VTI_IFACE} ${srcip}
fi
echo "done ip route"
fi
fi
fi
}
~~
※決め打ちのとこの PLUTO_PEER_CLIENT ですが、もっといっぱい指定したい場合、複数行ベタ書きで良いかと思います。その場合、delvti関数の ip route del も複数行にしないとダメでしょうね。
※MTUですが、調整したい場合、confに記載せずに、スクリプトに埋め込んでしまって下さい。
5.
いよいよ、準備が出来ました。
テイクオフです
の前に確認です。
ipsec verify
Checking that pluto is running だけ、FAILED してるかと思います。
ipsecの起動設定
systemctl enable ipsec
systemctl restart ipsec
動作確認
ipsec status
こんな感じの出力があったら OK です。
000 Total IPsec connections: loaded 2, active 2
何か問題があっから以下のコマンドで確認してみましょう
ipsec addconn --autoall
ルートの確認
ip route
開始
ipsec start
停止
ipsec stop
気になる速度は、
Up 9.5Mbytes/s 76Mぐらい
Down 18Mbytes/s 144Mぐらい