VyOSで、IPsecの無通信断を自動でいい感じに回復させる

# 背景
VyOSでIPsecを使っている場合、無通信時間が続くと勝手にIPsecが切れてしまい手動でresetしないと復旧しない。
IKEのdead-peer-detectionコマンドが効かない問題もあって、手動運用に頼らない方法でIPsecトンネルを回復させる方法を供養する

# 環境
どこぞのIaaSで動かしている環境
```shell
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ならおｋ

# 設定
## shell scriptの展開
```shell:/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名から取ってくるのが吉
```shell
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すると
```shell
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ブロック目を取り出す
```shell
admin@hogetan:~$ sh vpn ipsec sa | egrep 'down' | awk '{print $1}'
peer-198.51.100.1-tunnel-2
```

余計な文字列が邪魔なので `-` 区切りで2ブロック目のアドレスを取り出す
```shell
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'
```

# 終わり
めでたく自動化完了