LoginSignup
2

More than 1 year has passed since last update.

はじめてのラズパイ③~SoftEtherVPN接続・切断~

Last updated at Posted at 2021-04-17

ラズパイでSoftEtherVPNを構築しました。
はじめて行うので間違っている点ありましたらご指摘ください:tea:

前回

↓文字化けちゃってますね...

TODO

  • VPN接続
  • VPN切断

前提

技術
OS Ubuntu Server 20.10
サーバ raspberry pi 4B(RAM 4GB)(arm64)
クライアント macOS Big Sur 11.2.2

Catalinaでも動作確認が取れました。
初期設定を終えた状態で作成してください。

手順

iPhoneでテザリングして進めています。
お手持ちのスマホなどで検証してみてください。

1. VPN接続

% brew install --cask tuntap
% cd /usr/local/vpnclient
% sudo ./vpnclient start
% sudo ./vpncmd
### 略 ###
1. Management of VPN Server or VPN Bridge 
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3: 2

接続先の VPN Client が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
何も入力せずに Enter を押すと、localhost (このコンピュータ) に接続します。
接続先のホスト名または IP アドレス: localhost

VPN Client "localhost" に接続しました。

VPN Client>AccountConnect AC_SAMPLE
AccountConnect コマンド - 接続設定を使用して VPN Server へ接続を開始
コマンドは正常に終了しました。
VPN Client>AccountStatusGet AC_SAMPLE
AccountStatusGet コマンド - 接続設定の現在の状態の取得
接続設定の名前: AC_SAMPLE

項目                          |値
------------------------------+------------------------------------------------------------------------
接続設定名                      |AC_SAMPLE
セッション接続状態               |接続完了 (セッション確立済み)
VLAN ID                       |-
サーバー名                      |sample-dns.softether.net
ポート番号                      |TCP ポート 443
サーバー製品名                   |SoftEther VPN Server (32 bit)
### 略 ###

ここまででVPN接続が完了しました。
以降は、

  • tap0にIP割当
  • ルーティング追加
  • 既存デフォルトゲートウェイ削除
  • 新規デフォルトゲートウェイ追加

を行います。

% sudo ipconfig set tap0 DHCP
# 数秒待つこと
% ifconfig tap0
tap0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether  xx:xx:xx:xx:xx:xx 
    inet 192.168.3.10 netmask 0xffffff00 broadcast 192.168.3.255
    media: autoselect
    status: active
    open (pid 33333)
% netstat -nr | grep -E 'default(.)*en0' | awk '{print $2}'
192.168.3.1
# GlobalIP
% route -n get sample-dns.softether.net | grep 'route to:' | awk '{print $3}'
60.xxx.xxx.xxx
% sudo /sbin/route add -net 192.168.3.1 60.xxx.xxx.xxx 255.255.255.255
add net 60.xxx.xxx.xxx: gateway 172.20.10.xxx
% sudo route -n delete default
delete net default
% sudo route add default 192.168.3.1
add net default: gateway 192.168.3.1
% netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags        Netif Expire
default            192.168.3.1        UGSc          tap0       
default            192.168.3.1        UGScI         tap0       
60.xxx.xxx.xxx/32  172.99.xx.xx        UGSc           en0
# ↓ローカルPCのIP
192.168.3.10/32    link#18            UCS           tap0      !

上記が完了すると、ラズパイ本体にSSH等して作業可能になります。
IPが変わったのでVPN接続できていることが確認できますね:tea:

2. VPN切断

接続と逆の手順で切断を行います。

% pwd
/usr/local/vpnclient
% sudo ./vpncmd
### 略 ###
1. Management of VPN Server or VPN Bridge 
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3: 2

接続先の VPN Client が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
何も入力せずに Enter を押すと、localhost (このコンピュータ) に接続します。
接続先のホスト名または IP アドレス: localhost

VPN Client "localhost" に接続しました。

VPN Client>AccountDisConnect AC_SAMPLE
AccountDisconnect コマンド - 接続中の接続設定の切断
コマンドは正常に終了しました。

以降は、

  • vpnclient停止
  • 新規デフォルトゲートウェイ削除
  • 既存(旧)デフォルトゲートウェイ追加
% pwd
/usr/local/vpnclient
% sudo ./vpnclient stop
Stopping the SoftEther VPN Client service ...
SoftEther VPN Client service has been stopped.
# GlobalIP
% route -n get sample-dns.softether.net | grep 'route to:' | awk '{print $3}'
60.xxx.xxx.xxx
% netstat -nr | grep -E "60.xxx.xxx.xxx(.)*en0" | awk '{print $2}'
172.20.10.xxx
% sudo /sbin/route -n delete -net 60.xxx.xxx.xxx 172.20.10.xxx 255.255.255.255
delete net 60.xxx.xxx.xxx: gateway 172.20.10.xxx
% sudo route add default 
add net default: gateway 172.20.10.xxx

おまけ

sleepは適宜長めにとるのもありですね!

vpn_set.sh
#!/bin/sh -e

VPNPATH=/usr/local/vpnclient
VPNCLIENT=${VPNPATH}/vpnclient
VPNCMD=${VPNPATH}/vpncmd
SERVER="`route -n get sample-dns.softether.net | grep 'route to:' | awk '{print $3}'`"
NEW_DEFROUTE="192.168.3.1"
NET_MASK="255.255.255.255"
VPNNAME="AC_SAMPLE"
VPNUP=`ps -ef | grep vpnclient | grep -v grep | wc -l`

case "$1" in
  start)
    if [ $VPNUP = 0 ]; then
      sudo -S ${VPNCLIENT} start
      sudo ${VPNCMD} << EOF
2
localhost
AccountConnect ${VPNNAME}
AccountStatusGet ${VPNNAME}
EOF

      # DHCPによるIPアドレスの取得
      sudo ipconfig set tap0 DHCP
      sleep 3
      CURRENT_DEFROUTE=`netstat -nr | grep -E 'default(.)*en0' | awk '{print $2}'`
      # 静的ルーティング追加
      sudo /sbin/route add -net $SERVER $CURRENT_DEFROUTE $NET_MASK
      # 既存デフォルトゲートウェイ削除
      sudo route -n delete default
      sleep 10
      sudo route add default $NEW_DEFROUTE
    else
      echo "VPN Client has already started."
      exit 1
    fi
    ;;
  stop)
    if [ $VPNUP = 0 ]; then
      echo "VPN client has already stoped."
      exit 1
    else
      ${VPNCMD} << EOF
2
localhost
AccountDisconnect ${VPNNAME}
AccountStatusGet ${VPNNAME}
EOF

      sudo -S ${VPNCLIENT} stop
      sleep 1
      NEW_DEFROUTE=`netstat -nr | grep -E "${SERVER}(.)*en0" | awk '{print $2}'`
      sudo /sbin/route -n delete -net $SERVER $NEW_DEFROUTE $NET_MASK
      sleep 1
      sudo route add default $NEW_DEFROUTE
    fi
    ;;
  restart)
    $0 stop
    sleep 3
    $0 start
    ;;
  *)
    echo "Usage: vpn.sh {start|stop|restart}"
    exit 1
    ;;
esac

感想

tap0に動的IPが振られない状態(APIPA)になり数週間悩みました。
だれかの助けになって最速で構築できることを願います!!!
今後もラズパイシリーズとして続けて行けていきます:smile:
(k8sとかやってみたい...)

参考文献

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2