Skip to content

Instantly share code, notes, and snippets.

@masebb
Last active February 25, 2025 02:50
Show Gist options
  • Save masebb/9e142fceda2a49547d81b81d87c1db9f to your computer and use it in GitHub Desktop.
Save masebb/9e142fceda2a49547d81b81d87c1db9f to your computer and use it in GitHub Desktop.
Linux版SoftEther VPN ClientでVPNサーバーに接続する際にDHCPによるアドレス割当とVPNサーバーとの通信用の静的ルートをいいかんじに設定してくれるbashスクリプト / A bash script that automatically sets Static Route to VPN Server and DHCP Address assignment for Linux SoftEther VPN Client
#!/bin/bash
#VPNクライアントのアドレス
CLIENTADDRESS="localhost"
#VPNアカウント名
ACCOUNTNAME="vpn"
#VPN接続で使う仮想NIC名
VPNVNICNAME="vpn_vpn"
if [ `id -u` -ne 0 ]; then
echo "Please run on root"
exit 1
fi
set -e
getNICDefaultGWIPaddr(){
ip route | grep '^default' | awk -v nic="$2" '/'$nic'/ {print $3}'
}
#IPv4アドレスの正規表現
IPv4REGEXP="/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/"
case "$1" in
"connect")
#インターネットに出れるNIC名が書いてない場合
if [ -z "$2" ]; then
echo "Please provide name of NIC that can connect to the internet."
echo "USEAGE ERROR : $0 {connect|disconnect} [NICName]"
exit 1
fi
#VPN接続試行
vpncmd $CLIENTADDRESS /CLIENT /CMD:AccountConnect ${ACCOUNTNAME}
echo "接続成功"
#アドレスが取得できるまで適当に待つ
sleep 10
#VPNサーバーのアドレスを抽出する(静的ルーティングをするため)
VPNSERVERADDR=$(vpncmd localhost /CLIENT /CMD:AccountStatusGet $ACCOUNTNAME | sed -n 16p | awk -F'[|]' '{print $2}')
echo "接続先 : $VPNSERVERADDR"
#VPNサーバーへのアドレスがIPv4の正規表現(xxx.xxx.xxx.xxx)に当てはまるか
if [[ "$VPNSERVERADDR" =~ $IPv4REGEXP ]]; then
#IPv4アドレスの場合
ip route add "$VPNSERVERADDR"/32 via $(getNICDefaultGWIPaddr $2) dev "$2"
else
#ドメイン名の場合(nslookupで名前解決をする)
ip route add $(nslookup -type=A $VPNSERVERADDR | grep Address | tail -n +2 | cut -f2 -d ' ')/32 via $(getNICDefaultGWIPaddr $2) dev "$2"
fi
dhclient $VPNVNICNAME -e IF_METRIC=1
echo "接続処理完了"
;;
"disconnect")
VPNSERVERADDR=$(vpncmd localhost /CLIENT /CMD:AccountStatusGet $ACCOUNTNAME | sed -n 16p | awk -F'[|]' '{print $2}')
vpncmd $CLIENTADDRESS /CLIENT /CMD:AccountDisconnect ${ACCOUNTNAME}
dhclient -r $VPNVNICNAME
if [[ "$VPNSERVERADDR" =~ $IPv4REGEXP ]]; then
#IPv4アドレスの場合
ip route del "$VPNSERVERADDR"/32
else
#ドメイン名の場合(nslookupで名前解決をする)
ip route del $(nslookup -type=A $VPNSERVERADDR | grep Address | tail -n +2 | cut -f2 -d ' ')/32
fi
echo "切断処理完了"
;;
*)
echo "USEAGE ERROR : $0 {start|stop} [NICName]"
exit 1
;;
esac
exit 0
@masebb
Copy link
Author

masebb commented Jan 30, 2022

動作確認環境

  • Ubuntu 20.04
  • SoftEther VPN Client Ver 4.38 Build 9760

使い方

vpncmdで事前にVPNサーバーを登録してあることを前提に進めます

$ ~ wget https://gist.github.com/masebb/9e142fceda2a49547d81b81d87c1db9f/raw/51b11c1a7ad69b01e2e9eef812a2ea2601222d8f/SoftEtherAutoConnect.bash
$ ~ nano SoftEtherAutoConnect.bash #4/6/8行目をいじってください
$ ~ sudo bash SoftEtherAutoConnect.bash start ${インターネットに出れるNICの名前}

$ ~ sudo bash SoftEtherAutoConnect.bash stop #停止(VPN接続の切断と静的ルートの削除、DHCPで降ったきたアドレスの開放)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment