#概要
「Firewall内のサーバ・プライベートネットワークにVPN接続」により、2つのprivate network(自宅と職場)をvpn常時接続した。その際に、相手方のprivate networkへのstatic routeを設定してあげる必要があり、/etc/network/if-up.d/でルーティング設定を行うと、問題なく設定されるが、networking.serviceがfailedとなってしまう。実行のタイミングの問題のようだが、コントロールできないため気持ち悪いのでsystemdで設定した。慣れれば?、systemdは便利。
#環境
- vpn接続したDebian server (stretch)
- private networkは、192.168.1.0/24と192.168.32.0/24
- 以下の例は、192.168.1.0/24側のサーバ設定。
- gatewayはvps上の仮想ルータに設定している(詳細はここでは述べません)。
#やっていること
192.168.1.0/24のマシンから192.168.32.0/24のマシンに接続するために、
sudo /sbin/route add -net 192.168.32.0/24 gw 192.168.1.200
を起動時にしているだけなんですが。。。vpnbridge.serviceが立ち上がってから自動的に実行するとなると、タイミングの問題があり、結構ハマりました。
#systemd unitの設定
/etc/systemd/system/static-route.service
[Unit]
Description=static route to target network
After=network.target network-online.target vpnbridge.service
[Service]
Type=oneshot
ExecStart=/root/static-route start
ExecStop=/root/static-route stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
- vpnbridgeが起動していなければ、ルーティングしても意味がないので、vpnbridge.serviceをAfterに設定。
- Type=oneshot, RemainAfterExit=yesとしないと、起動時にstopされます。daemonではないので、一回だけstartを実行してactiveとする必要があります。
- Execを/root/に置くのはどうかとも思いましたが、汎用性に劣るスクリプトなのでとりあえず。/usr/local/等に置くほどのものでもないので。
#static routingの起動・停止スクリプト
/root/static-route.conf例
NAME_TARGET='target_domain_name'
TARGET='192.168.32.0/24'
GATEWAY='192.168.1.200'
#!/bin/sh -e
# static routing to NAME_TARGET of TARGET
SCRIPT='static-route'
. /root/static-route.conf
help(){
echo "$SCRIPT start, stop: routing to $NAME_TARGET"
}
case $1 in
'start') CMD='add';;
'stop' ) CMD='delete';;
*) help; exit;;
esac
### routing to TARGET
ROUTE="/sbin/route ${CMD} -net ${TARGET} gw ${GATEWAY}"
echo $ROUTE
$ROUTE
- journalctlでの確認のために、echo $ROUTEで実行コマンドを記録していますが、コメントアウトしても可。
root@altair:~# journalctl -u static-route
-- Logs begin at Wed 2019-05-01 08:57:21 JST, end at Wed
5月 01 11:32:12 altair systemd[1]: Starting static route to target...
5月 01 11:32:12 altair static-route[2359]: /sbin/route add -net 192.168.32.0/24
5月 01 11:32:12 altair systemd[1]: Started static route to target.
今日から令和です。