Last active
February 25, 2025 02:50
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
動作確認環境
使い方
vpncmd
で事前にVPNサーバーを登録してあることを前提に進めます