Systemd で Sonicwall NetExtener を使う

Sonicwall の SSL VPN クライアント を Systemd 経由で接続、切断ができるようにしました。

## Unitファイルを作成

File: `$HOME/.config/systemd/user/netextender.service`

```systemd
[Unit]
Description=SonicWall NetExtender VPN Client

[Service]
Type=forking
ExecStart=%h/bin/netext start
ExecStop=%h/bin/netext start

[Install]
WantedBy=default.target
```

## 開始スクリプトを作成

File: `$HOME/bin/netext`

```shell
#!/bin/bash
CONF=$HOME/.vpn

function start() {
  # Start netExtender
  /usr/sbin/netExtender <$CONF &
  exit 0
}

function stop() {
  PID=$(pgrep netExtender)
  if [ -z "$PID" ]; then
    echo "netExtender not running."
    exit 2
  fi

  # send SIGTERM Signal
  kill -s SIGTERM $PID > /dev/null 2>&1

  while :; do
    pgrep netExtender > /dev/null
    if [ $? -ne 0 ]; then
      echo "netExtender stopped"
      break
    fi
    sleep 1
  done
  exit 0
}

case $1 in
"start")        prepare_start && start; break;;
"stop")         stop; break;;
esac

```

## 接続情報

テキストファイルに次の接続情報を記述します。
1. VPNサーバー:ポート
2. ユーザ名
3. パスワード
4. ドメイン


`$HOME/.vpn` に接続情報を記述します。

```
$ cat <<EOF > ~/vpn
vpn.example.com:4433
takeume2
hogehoge
LocalDomain
EOF
```

パーミッションを設定します。

```
$ chmod 0600 ~/vpn
```

Systemd をリロードして反映します。

```
$ systemctl --user daemon-reload
```


## 使い方

* `systemctl --user status netextender` : ステータス確認
* `systemctl --user stop netextender`   : 切断
* `systemctl --user start netextender`  : 接続する

### 接続する

```
$ systemctl --user stop netextender
$ systemctl --user status netextender
● netextender.service - SonicWall NetExtender VPN Client
   Loaded: loaded (/home/takeume2/.config/systemd/user/netextender.service; indirect; vendor preset: enabled)
   Active: active (running) since Fri 2020-10-30 23:28:11 JST; 46min ago
  Process: 9393 ExecStart=/home/takeume2/bin/netext  (code=exited, status=0/SUCCESS)
 Main PID: 9394 (netExtender)
   CGroup: /user.slice/user-1000.slice/user@1000.service/netextender.slice/netextender.service
           ├─9394 /usr/sbin/netExtender
           ├─9399 pppd call sslvpn mtu 1280 mru 1280
           └─9466 /usr/sbin/nxMonitor

10月 30 23:28:10 lemur6 systemd[3608]: Client IP Address: 10.254.128.12
10月 30 23:28:10 lemur6 systemd[3608]: You now have access to the following 1 remote networks:
10月 30 23:28:10 lemur6 systemd[3608]:     10.0.0.0/255.0.0.0
10月 30 23:28:10 lemur6 systemd[3608]: NetExtender connected successfully. Type "Ctrl-c" to disconnect...
10月 30 23:28:11 lemur6 systemd[3608]: Started netExtender VPN Client
```


### 切断する

```
$ systemctl --user stop netextender
$ systemctl --user status netextender
● netextender.service - SonicWall NetExtender VPN Client
   Loaded: loaded (/home/takeume2/.config/systemd/user/netextender.service; indirect; vendor preset: enabled)
   Active: inactive (dead) since Sat 2020-10-31 00:19:30 JST; 16s ago
  Process: 9393 ExecStart=/home/takeume2/bin/netext (code=exited, status=0/SUCCESS)
 Main PID: 9394 (code=exited, status=0/SUCCESS)

10月 31 00:19:24 lemur6 pppd[9399]: Terminating on signal 15
10月 31 00:19:30 lemur6 pppd[9399]: Connection terminated.
10月 31 00:19:30 lemur6 pppd[9399]: Modem hangup
10月 31 00:19:30 lemur6 pppd[9399]: Exit.
10月 31 00:19:30 lemur6 nete[9393]: SSL VPN logging out...
10月 31 00:19:30 lemur6 nete[9393]: SSL VPN connection is terminated.
10月 31 00:19:30 lemur6 nete[9393]: Exiting NetExtender client
10月 31 00:19:30 lemur6 systemd[3608]: Stopped netExtender VPN Client

```

## 自分用メモ
* `~/.netExtender.log` にログが出力されるので Systemd の User モードにした。
* 自動起動しても Network Unreachable になる。Systemd User モードの場合の、依存関係がよくわからない。
* 実行用ユーザを作って systemd から起動したほうが良さげ。