【Centos7】SoftEther Client 構築手順【L2TP/IPsec】

SoftEtherを利用してVPN Clientを構築する手順です
環境は Centos7.3 1611 を利用です

マシンの中に 仮想NIC を作って、VPN Server と通信できるようにします

構築イメージ
　－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
　｜
　｜ VPN-Hub1 (10.10.10.110)：VpnHub1（仮想DHCP)
　｜　↑↓　↑↓　
　｜　↑↓　VPN-Nic1 (10.10.10.111)：tap_tap1
　｜　↑↓
　｜　↑↓　　物理NIC（192.168.56.101）：待ち受けポート：44444
　｜　↑↓
　－－↑↓－－－－－－－－－－－－－－－－[CentOS7 SoftEther Server]
　　　↑↓
　　　↑↓　　 (10.10.10.0/24)
　　　↑↓
　－－↑↓－－－－－－－－－－－－－－－－－－－－[SoftEther Client]
　｜　↑↓
　｜　↑↓　　物理NIC（192.168.56.222）
　｜　↑↓
　｜ Vpn-Nic  (10.10.10.222)：vpn_tap1
　｜
　－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
※ この記事は SoftEther Client の構築手順です


# SoftEther インストール

## コンパイル環境

```
# mkdir -p /usr/local/src/yum/22.softether_client
# cd       /usr/local/src/yum/22.softether_client
# yum --enablerepo=epel          \
      --downloadonly             \
      --downloaddir=./           \
      install                    \
      gcc                        \
      gcc-c++                    \
      glibc                      \
      make                       \
      binutils                   \
      zlib                       \
      openssl                    \
      readline                   \
      ncurses                    \
      zlib-devel                 \
      openssl-devel              \
      readline-devel             \
      ncurses-devel              \
      psmisc                     \

# yum localinstall *.rpm
```

## SoftEther - Clientのダウンロード
　最新版は確認：http://jp.softether-download.com/files/softether/

```
# wget  --proxy-user=user      \
      --proxy-password=pass  \
      -e HTTP_PROXY=proxy.com:8080   \
      http://jp.softether-download.com/files/softether/v4.22-9634-beta-2016.11.27-tree/Linux/SoftEther_VPN_Client/64bit_-_Intel_x64_or_AMD64/softether-vpnclient-v4.22-9634-beta-2016.11.27-linux-x64-64bit.tar.gz

  ※  http://jp.softether-download.com/files/softether/v4.29-9680-rtm-2019.02.28-tree/Linux/SoftEther_VPN_Client/64bit_-_Intel_x64_or_AMD64/softether-vpnclient-v4.29-9680-rtm-2019.02.28-linux-x64-64bit.tar.gz


# ls -l
      -rw-r--r-- 1 root   root    6275136 11月 27  2016 softether-vpnclient-v4.22-9634-beta-2016.11.27-linux-x64-64bit.tar.gz

      -rw-r--r-- 1 root root 6249551  2月 28 19:41 softether-vpnclient-v4.29-9680-rtm-2019.02.28-linux-x64-64bit.tar.gz

```

※ 2019/3/12 追記　バージョンが 4.22から4.29に変わっています


## SoftEther Client 展開＆コンパイル

```
# tar xvfz softether-vpnclient-v4.22-9634-beta-2016.11.27-linux-x64-64bit.tar.gz
# cd vpnclient/
# make
```

## SoftEther Client インストール

```
# cd ..
# mv vpnclient   /usr/local/
# cd /usr/local/vpnclient/
```

## SoftEther Client セキュリティ設定

```
# chmod 600  *
# chmod 700 . vpncmd vpnclient code lib
```


## SoftEther Client の仮想NICにIPアドレスを設定するシェル

```bash:/usr/local/vpnclient/setting_ip.sh
#!/bin/bash

# case Static IP
TAP_IF="vpn_tap1"

# 30sec Loop
for i in {1..30}
do
    sleep 1
    ip tap | grep --quiet ${TAP_IF}
    STATUS=$?
    if [ "${STATUS}" == "0" ]
    then
        ip address add dev ${TAP_IF} 10.10.10.222/24
        # - 旧方式 ifcfg  ${TAP_IF}  add  10.10.10.222/24
        break;
    fi
done
exit 0
```

```
# chmod 700 /usr/local/vpnclient/setting_ip.sh
```

　※ ifcfg 方式から ip 方式へ変更（2024.01.09）


## SoftEther Client の自動起動設定

　サービスの起動時に、仮想NIC (vpn_tap1) に固定IPアドレスを付与する

```/usr/lib/systemd/system/vpnclient.service
      [Unit]
      Description=SoftEther VPN Client
      After=network.target
       
      [Service]
      Type=forking
      ExecStart=/usr/local/vpnclient/vpnclient start
      ExecStartPost=/usr/local/vpnclient/setting_ip.sh
      ExecStop=/usr/local/vpnclient/vpnclient stop
       
      [Install]
      WantedBy=multi-user.target


```


```
# systemctl  daemon-reload
# systemctl  enable  vpnclient
```

# SoftEther Client の設定


## □ VPN Client へ接続

まだいろいろ設定していないので、サービス(systemctl)としてではなく直接 vpnclient を起動する


```
# cd /usr/local/vpnclient
# ./vpnclient  start
# ./vpncmd  localhost  /CLIENT
```


## □ VPN Client の管理者パスワードの設定

```
>PasswordSet
>Quit
```

## □ VPN Client の管理者パスワードの設定確認
 起動時にパスワード入力を必要とする

```
# ./vpncmd  localhost  /CLIENT
```

## □ VPN Client のヘルプ確認

```
VPN Client> help
下記の 66 個のコマンドが使用できます:
 About                    - バージョン情報の表示
 AccountAnonymousSet      - 接続設定のユーザー認証の種類を匿名認証に設定
 AccountCertGet           - 接続設定に用いるクライアント証明書の取得
 AccountCertSet           - 接続設定のユーザー認証の種類をクライアント証明書認証に設定
 AccountCompressDisable   - 接続設定の通信時のデータ圧縮の無効化
 AccountCompressEnable    - 接続設定の通信時のデータ圧縮の有効化
 AccountConnect           - 接続設定を使用して VPN Server へ接続を開始
 AccountCreate            - 新しい接続設定の作成
 AccountDelete            - 接続設定の削除
 AccountDetailSet         - 接続設定の高度な通信設定の設定
 AccountDisconnect        - 接続中の接続設定の切断
 AccountEncryptDisable    - 接続設定の通信時の暗号化の無効化
 AccountEncryptEnable     - 接続設定の通信時の暗号化の有効化
 AccountExport            - 接続設定のエクスポート
 AccountGet               - 接続設定の設定の取得
 AccountImport            - 接続設定のインポート
 AccountList              - 接続設定一覧の取得
 AccountNicSet            - 接続設定で使用する仮想 LAN カードの設定
 AccountPasswordSet       - 接続設定のユーザー認証の種類をパスワード認証に設定
 AccountProxyHttp         - 接続設定の接続方法を HTTP プロキシサーバー経由接続に設定
 AccountProxyNone         - 接続設定の接続方法を直接 TCP/IP 接続に設定
 AccountProxySocks        - 接続設定の接続方法を SOCKS プロキシサーバー経由接続に設定
 AccountRename            - 接続設定の名前の変更
 AccountRetrySet          - 接続設定の接続失敗または切断時の再試行回数と間隔の設定
 AccountSecureCertSet     - 接続設定のユーザー認証の種類をスマートカード認証に設定
 AccountServerCertDelete  - 接続設定のサーバー固有証明書の削除
 AccountServerCertDisable - 接続設定のサーバー証明書の検証オプションの無効化
 AccountServerCertEnable  - 接続設定のサーバー証明書の検証オプションの有効化
 AccountServerCertGet     - 接続設定のサーバー固有証明書の取得
 AccountServerCertSet     - 接続設定のサーバー固有証明書の設定
 AccountSet               - 接続設定の接続先の設定
 AccountStartupRemove     - 接続設定のスタートアップ接続を解除
 AccountStartupSet        - 接続設定をスタートアップ接続に設定
 AccountStatusGet         - 接続設定の現在の状態の取得
 AccountStatusHide        - VPN Server への接続中に接続状況やエラー画面を表示しないように設定
 AccountStatusShow        - VPN Server への接続中に接続状況やエラー画面を表示するように設定
 AccountUsernameSet       - 接続設定の接続に使用するユーザー名の設定
 CertAdd                  - 信頼する証明機関の証明書の追加
 CertDelete               - 信頼する証明機関の証明書の削除
 CertGet                  - 信頼する証明機関の証明書の取得
 CertList                 - 信頼する証明機関の証明書一覧の取得
 Check                    - SoftEther VPN の動作が可能かどうかチェックする
 KeepDisable              - インターネット接続の維持機能の無効化
 KeepEnable               - インターネット接続の維持機能の有効化
 KeepGet                  - インターネット接続の維持機能の取得
 KeepSet                  - インターネット接続の維持機能の設定
 MakeCert                 - 新しい X.509 証明書と秘密鍵の作成 (1024 bit)
 MakeCert2048             - 新しい X.509 証明書と秘密鍵の作成 (2048 bit)
 NicCreate                - 新規仮想 LAN カードの作成
 NicDelete                - 仮想 LAN カードの削除
 NicDisable               - 仮想 LAN カードの無効化
 NicEnable                - 仮想 LAN カードの有効化
 NicGetSetting            - 仮想 LAN カードの設定の取得
 NicList                  - 仮想 LAN カード一覧の取得
 NicSetSetting            - 仮想 LAN カードの設定の変更
 NicUpgrade               - 仮想 LAN カードのデバイスドライバのアップグレード
 PasswordGet              - VPN Client サービスに接続するためのパスワードの設定の取得
 PasswordSet              - VPN Client サービスに接続するためのパスワードの設定
 RemoteDisable            - VPN Client サービスのリモート管理の禁止
 RemoteEnable             - VPN Client サービスのリモート管理の許可
 SecureGet                - 使用するスマートカードの種類の ID の取得
 SecureList               - 使用できるスマートカードの種類の一覧の取得
 SecureSelect             - 使用するスマートカードの種類の選択
 TrafficClient            - 通信スループット測定ツールクライアントの実行
 TrafficServer            - 通信スループット測定ツールサーバーの実行
 VersionGet               - VPN Client サービスのバージョン情報の取得

それぞれのコマンドの使用方法については、"コマンド名 ?" と入力するとヘルプが表示されます。
コマンドは正常に終了しました。

```

## □ VPN Client サービスのリモート管理の禁止

　リモートから接続可能にしとくと怖いので・・

```
>RemoteDisable
```

## □ インターネット接続の維持機能の無効化

```
>KeepDisable
>KeepGet
      現在の状態           |無効
```

## □ 新規仮想NIC の作成

```
>NicCreate  tap1
>NicList
      仮想 LAN カード名|tap1
      状態             |有効 (使用可能)
      MAC アドレス     |00AC71755582
      バージョン       |Version 4.22 Build 9634   (Japanese)
```

## □ サーバ接続用VPNアカウント作成(設定)

　クライアント管理の「アカウント」と、サーバ側で作成した「ユーザ」は別物
　サーバ側で設定した「ユーザ」で接続するための「アカウント」を設定です

```
>AccountCreate  USER1  /SERVER:192.168.56.101:44444  /HUB:VpnHub1  /USERNAME:HubUser1   /NICNAME:tap1
>AccountList
      接続設定名         |USER1
      状態               |オフライン
      接続先 VPN サーバー|192.168.56.101:44444 (直接 TCP/IP 接続)
      仮想 HUB 名        |VpnHub1
      仮想 LAN カード名  |tap1
```

## □ サーバ接続用VPNアカウントパスワード設定 ＆ 自動起動設定

　サーバ側で作成した「ユーザ」で接続するためのパスワードを設定します
　また、vpnclient が起動したときに自動的に接続に行くようにも設定しときます
　※ これやらないと毎回接続操作が必要です

```
>AccountPasswordSet USER1  /TYPE:standard
>AccountStartupSet  USER1
>AccountGet  USER1
      接続設定名                           |USER1
      接続先 VPN Server のホスト名         |192.168.56.101
      接続先 VPN Server のポート番号       |44444
      接続先 VPN Server の仮想 HUB 名      |VpnHub1
      経由するプロキシサーバーの種類       |直接 TCP/IP 接続
      サーバー証明書の検証                 |無効
      接続に使用するデバイス名             |tap1
      認証の種類                           |標準パスワード認証
      ユーザー名                           |HubUser1
```

## □ サーバ接続

　設定できたので接続してみます
　もし、「接続完了」にならなければ、ユーザ名、パスワード、HUB名、サーバアドレス、ポート等々を確認してみてくださいです
　サーバ側のログ( /usr/local/vpnserver/server_log/vpn_yyyymmdd.log ）も確認した方が良いかも

```
>AccountConnect USER1
>AccountList
      接続設定名         |USER1
      状態               |接続完了
      接続先 VPN サーバー|192.168.56.101:44444 (直接 TCP/IP 接続)
      仮想 HUB 名        |VpnHub1
      仮想 LAN カード名  |tap1
```

## □ 仮想NIC 確認

　仮想NIC が作成されていることの確認

```
>Quit
# ip tap
      vpn_tap1: tap
```

## □ サービス停止

```
# ./vpnclient  stop
```

## □ UDPホールパンチングの無効化
　
　設定ファイを直接編集
　※ 必要ないのでパンチしないよーにしときます

```
# cp  -p  vpn_client.config  vpn_client.config.org
# vi      vpn_client.config
      declare AccountDatabase
      {
        declare Account0
        {
          declare ClientOption
          {
            string AccountName USER1
            bool NoUdpAcceleration true
```

## □ サービス再起動（自動接続 ＆ 自動IP付与）

　サービスとして起動すると、ちゃんとIPアドレスを仮想NICに設定してくれることを確認

```
# systemctl start vpnclient
# ip  addr  show  vpn_tap1
      5: vpn_tap1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
          link/ether 00:ac:71:75:55:82 brd ff:ff:ff:ff:ff:ff
          inet 10.10.10.222/24 brd 10.10.10.255 scope global vpn_tap1
             valid_lft forever preferred_lft forever
```

## □ 自動接続ステータス確認（クライアント）

　アカウントがサービス起動時に自動的に接続に行っていることも確認

```
# ./vpncmd  localhost  /CLIENT
>AccountStatusGet  USER1
      接続設定名                    |USER1
      セッション接続状態            |接続完了 (セッション確立済み)
      サーバー名                    |192.168.56.101
      ポート番号                    |TCP ポート 44444

>Quit
```

## 通信確認（クライアント -> サーバ）

　ちゃんとサーバと接続されていることも確認

```
# ping -c 3  10.10.10.111
      PING 10.10.10.111 (10.10.10.111) 56(84) bytes of data.
      64 bytes from 10.10.10.111: icmp_seq=1 ttl=64 time=2.42 ms
      64 bytes from 10.10.10.111: icmp_seq=2 ttl=64 time=1.02 ms
      64 bytes from 10.10.10.111: icmp_seq=3 ttl=64 time=1.01 ms
      
      --- 10.10.10.111 ping statistics ---
      3 packets transmitted, 3 received, 0% packet loss, time 2003ms
      rtt min/avg/max/mdev = 1.010/1.489/2.428/0.664 ms
```


以上
クライアント側構築も完了
再起動した時にも自動的につながることとか確認してみてくださいです