SoftEtherのDHCP配布ルーティングの簡単更新スクリプト

# SoftEtherでお手軽VPNした話をグダグダ（読み飛ばしてOK）
仕事とかでよくアクセス制限のために固定IPからしかアクセス出来ないようにする(される)ことがあるんだけど、通常はこれに自宅や会社の固定IPを設定してもらうことになる。でもそれだと外出時にトラブった時に対処が面倒くさいのよね。いや、まずは自宅に入ってそっからオフィスに入って更にそっから目的サーバにSSHでログイン、位なら大したこと無いんだけど。WEBで管理画面を見たいとかってことになるとトンネル掘るのが非常に面倒！ていうかやりたくない。
そんなわけで1年位前から外部にVPN用のネットワークを立てて、そこ経由でお仕事が出来るような環境を整えていてこれが非常に快適なんだわ。

実装としては、EIPを付けたEC2上にSoftEther立てて仕事関係のサーバは全部それを経由することでオフィスの物理的な引っ越しにも強い固定IPを確保。SoftEtherに各自のPCからVPN接続すれば外出先でのテザリングや自宅ワークとかがいとも簡単にできるようになるので非常に便利。

VPN用のSoftEther上の仮想HUBでSecureNAT＆DHCPを有効にしてあるんだけど、固定IPでアクセスしたいサーバが増えてくると個別PCでルーティングさせるのはアホなので接続時にDHCPで配布したいのよね、でもやっぱしアクセス先がいっぱいあるとルーティング管理が面倒になるし、何よりSoftEtherに設定追加してくだけだとどのIPが何用なのかのコメントが残せないので非常に不便。



# ルーティング更新スクリプト
てことで今日はDHCPで配布するルーティングの管理を少し楽にするスクリプトを紹介してみる。
↓こんな感じ。

```bash:se_update_route.sh
#!/bin/bash
SERVER="localhost:5555"
HUB_NAME="bastion"
HUB_PASSWORD="T./ljdsa99?8Vdr1"
DHCP_GW="192.168.130.1"
DHCP_START="192.168.130.100"
DHCP_END="192.168.130.200"
DHCP_MASK="255.255.255.0"
ROUTES=(
"10.0.0.0/24"   # VPC(MyOffice)
"10.102.0.0/16" # VPC(CompanyA)
"10.103.0.0/16" # VPC(CompanyB)
"201.32.31.0   255.255.255.128" # CompanyA Bitisle第1
"201.123.89.64 255.255.255.192" # CompanyA Bitisle第3(public)
"201.123.90.64 255.255.255.224" # CompanyA Bitisle第3(private)
"182.208.142.0 255.255.255.192" # CompanyB KDDI豊洲
"215.122.3.0   255.255.255.192" # CompanyC 高崎DC(public)
"111.22.117.15/32"   # MyOffice(フレッツ光)
"87.98.169.35/32"    # ProjectA
"151.2.199.132/32"   # ProjectB
"54.178.242.9/32"    # EIP(gw.example.jp)
"54.64.193.5/32"     # EIP(wiki.example.jp)
"54.87.92.162/32"    # EIP(superservice.example.com)
)
# PUSHROUTE構築（NETMASK表記もPREFIX表記もイケるよう吸収）
PUSHROUTE=""
for r in "${ROUTES[@]}"; do
  calc=$(ipcalc -nmp $r) || continue
  PUSHROUTE+=,$(. <(echo $calc); echo "$NETWORK/$NETMASK/$DHCP_GW")
done
PUSHROUTE=${PUSHROUTE#,}
# DhcpSet実行
/opt/softether/vpnserver/vpncmd \
  "$SERVER" /SERVER /HUB:"$HUB_NAME" /PASSWORD:"$HUB_PASSWORD" \
  /CMD DhcpSet \
    /START:"$DHCP_START" /END:"$DHCP_END" /MASK:"$DHCP_MASK" \
    /EXPIRE:7200 /GW:none /DNS:none /DNS2:none /DOMAIN:none /LOG:no \
    /PUSHROUTE:"$PUSHROUTE"
```

↑これを実行すると↓こんなかんじの超長ったらしいコマンドが実行されるという手筈となる。

```
/opt/softether/vpnserver/vpncmd localhost:5555 /SERVER /HUB:bastion /PASSWORD:T./ljdsa99?8Vdr1 /CMD DhcpSet /START:192.168.130.100 /END:192.168.130.200 /MASK:255.255.255.0 /EXPIRE:7200 /GW:none /DNS:none /DNS2:none /DOMAIN:none /LOG:no /PUSHROUTE:10.0.0.0/255.255.255.0/192.168.130.1,10.102.0.0/255.255.0.0/192.168.130.1,10.103.0.0/255.255.0.0/192.168.130.1,201.32.31.0/255.255.255.128/192.168.130.1,201.123.89.64/255.255.255.192/192.168.130.1,201.123.90.64/255.255.255.224/192.168.130.1,182.208.142.0/255.255.255.192/192.168.130.1,215.122.3.0/255.255.255.192/192.168.130.1,111.22.117.15/255.255.255.255/192.168.130.1,87.98.169.35/255.255.255.255/192.168.130.1,151.2.199.132/255.255.255.255/192.168.130.1,54.178.242.9/255.255.255.255/192.168.130.1,54.64.193.5/255.255.255.255/192.168.130.1,54.87.92.162/255.255.255.255/192.168.130.1
```

# 関連記事（そのうち書きたい記事メモ)

- SoftEther関連
    - EC2でSoftEther使ったVPN鯖立てる（CloudFormation＋Ansibleで簡単セットアップ）
    - SoftEther設定のWEB管理画面作った（一部機能だけだけど便利）
- SoftEther以外にも無限に応用可能ネタ
    - VPNへの接続元IPを簡単＆安全に管理（Twitter/Facebook/Github認証(IP/PASSを自前管理とか面倒いし)＋MFA(GoogleAuthenticatorとかAuthyのアレ)でセキュリティグループに期限付きでIP許可を追加するWEBアプリ作った）

※ほっとくと多分なかなか書かないと思うので読みたい！って思ったらせっついてくれたら出るかも。