背景
VyOSでIPsecを使っている場合、無通信時間が続くと勝手にIPsecが切れてしまい手動でresetしないと復旧しない。
IKEのdead-peer-detectionコマンドが効かない問題もあって、手動運用に頼らない方法でIPsecトンネルを回復させる方法を供養する
環境
どこぞのIaaSで動かしている環境
admin@hogetan:~$ sh version
Version: VyOS 1.2.5
Built by: Sentrium S.L.
Built on: Sun 12 Apr 2020 15:18 UTC
Build UUID: 1695c660-d785-4b16-a54b-66d6a02ea24f
Build Commit ID: 48cc9fc46569e6
Architecture: x86_64
Boot via: installed image
System type: KVM guest
多分task-schedulerコマンドが動くVyOSならおk
設定
shell scriptの展開
/config/scripts/vpnchecker.sh
#!/bin/bash
# VyOSコマンドで show vpn ipsec sa した結果からいい感じにpeer先を取り出して配列にするワンライナー
ip_list=`/bin/vbash -ic "sh vpn ipsec sa | egrep 'down' | awk '{print $1}' | cut -d'-' -f2"`
# 重複を排除する
ips=($(printf "%s\n" "${ip_list[@]}" | sort -u))
# 重複を排除した配列をforで回して、downなpeerだけ reset vpn ipsec-peer して復活させる
for ip in "${ips[@]}"
do
echo "$ip"
/bin/vbash -ic "reset vpn ipsec-peer $ip"
done
黒魔術メモ
show vpn ipsec sa
のサンプルは以下の通り。downしている部分はRemote addressがN/Aになるので、peer先アドレスは1ブロック目のpeer名から取ってくるのが吉
admin@hogetan:~$ sh vpn ipsec sa
Connection State Up Bytes In/Out Remote address Remote ID Proposal
--------------------------- ------- ----------- -------------- ---------------- ----------- ---------------------------------------------------------
peer-192.0.2.1-tunnel-2 up 109 minutes N/A 192.0.2.1 N/A 3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
peer-198.51.100.1-tunnel-1 up 3 minutes N/A 198.51.100.1 N/A AES_CBC_256/HMAC_SHA2_512_256/PRF_HMAC_SHA2_512/MODP_2048
peer-198.51.100.1-tunnel-2 down N/A N/A N/A N/A N/A
peer-192.0.2.1-tunnel-1 up 109 minutes 5K/9K 192.0.2.1 N/A 3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
peer-192.0.2.1-tunnel-5 up 109 minutes 5K/8K 192.0.2.1 N/A 3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
peer-192.0.2.1-tunnel-4 up 109 minutes 2K/4K 192.0.2.1 N/A 3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
peer-192.0.2.1-tunnel-3 up 109 minutes 78K/128K 192.0.2.1 N/A 3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
peer-192.0.2.1-tunnel-6 up 109 minutes 6K/11K 192.0.2.1 N/A 3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
downだけgrepすると
admin@hogetan:~$ sh vpn ipsec sa | egrep 'down'
peer-198.51.100.1-tunnel-2 down N/A N/A N/A N/A N/A
peerのアドレスがほしいのでawkで1ブロック目を取り出す
admin@hogetan:~$ sh vpn ipsec sa | egrep 'down' | awk '{print $1}'
peer-198.51.100.1-tunnel-2
余計な文字列が邪魔なので -
区切りで2ブロック目のアドレスを取り出す
admin@hogetan:~$ sh vpn ipsec sa | egrep 'down' | awk '{print $1}' | cut -d'-' -f2
198.51.100.1
これでdownしているIPsecのPeerアドレスが取れる
task schedulerの設定
5分毎にvpnchecker.shを動作させるようにする
admin@hogetan:~$ configure
admin@hogetan# set system task-scheduler task vpncheck executable path '/config/scripts/vpnchecker.sh'
admin@hogetan# set system task-scheduler task vpncheck interval '5m'
終わり
めでたく自動化完了