yumetodoの旅とプログラミングとかの記録

旅や登山の記録やプログラミング関連の話とかフリーソフト紹介とか

つまりSystemdな環境の東京理科大学学生はいかにしてVPNに接続することができるのか

結論

まず、大学のマニュアルに従いanyconnect-tus-predeploy-linux-3.1.01065-k9.tar.gzを手に入れる(バージョンは違うかも)

$ tar zxvf anyconnect-tus-predeploy-linux-3.1.01065-k9.tar.gz
$ cd anyconnect-3.1.01065/vpn
$ sudo ./vpn_install.sh
$ sudo pacman -S pangox-compat networkmanager-openvpn networkmanager-openconnect

./vpn_install.shからエラーメッセージが出るが、SysVinit周りなので無視する。

/etc/systemd/systemvpnagentd.serviceという名前で

[Unit]
Description=vpnagentd
Requires=network.target

[Service]
Type=simple
ExecStart=/opt/cisco/annyconnect/bin/vpnagentd
ExecStop=/usr/bin/pkill vpnagentd
RemainAfterExit=yes

[Install]
WantedBy=graphical.target

を作成し

$ sudo systemctl daemon-reload
$ sudo systemctl enable vpnagentd.service
$ sudo systemctl start vpnagentd.service

以上。

背景

以前にこのブログで

yumetodo.hateblo.jp

という記事を書いた。東京理科大学の学生である私がいかにしてUbuntu 16.04から大学のVPNを利用できるようにしたのかという話だ。

先日@Akcuohbe氏のPCのセットアップを手伝っていた際にManjaro Linuxを入れたのだが、上の記事の手順がほぼそのまま適用できると考えていたがそうではなかった。悪戦苦闘しどうにかできるようになった。

知らなかったのだが、Ubuntu 16.04は確かにsystemdが利用できるが、昔ながらのSysVinitが生き残っているようだ。互換機能があるため上記記事を書いたときはCisco AnyconnectがSystemdに対応していると勘違いしていた。

大学のVPNアクセスに必要なCisco Anyconnectは(少なくとも大学が配っているバージョンのものは)SysVinitのみに対応していて、Systemdに対応していない。

Cisco Anyconnectにはvpnagentdというプログラムが有り、これがバックグラウンドで起動していることが重要らしい。

奮闘の内容

もう少しざっくりした話は

Archlinuxに東京理科大学のVPN接続するための道具を導入 - Qiita

を参照。

まだCisco AnyconnectがSystemdに対応していると勘違いしていたころ

TwitterのDMでやり取りしていた。

  1. インストールできないとの報告を受ける(GUI操作で/opt/cisco/anyconnect/bin/vpnuiを起動しようとして何も起きない動画を添付される)
  2. sudo pacman -S networkmanager-openconnectすることと、端末から/opt/cisco/anyconnect/bin/vpnuiを起動することを要請
  3. pacmanのことは華麗にスルーされ、端末から/opt/cisco/anyconnect/bin/vpnuiを起動したときに

    /opt/cisco/anyconnect/bin/vpnui: error while loading shared libraries: libpangox-1.0.so.0: cannot open shared object file: no such file or directory

    と言われた

  4. sudo pacman -S pangox-compatすることを要請
  5. 今度は端末から/opt/cisco/anyconnect/bin/vpnuiを起動したときに何も言わずに死ぬように
  6. yaourt -S lib32-pangox-compatすることを要請
  7. これを華麗にスルー
  8. 再起動してsudo systemctl status vpnagentd.serviceすることを要請
  9. ところが

    Unit vpnagentd.service could not be found.

    と言われる

  10. おかしい。オフトンに居たのでSystemdのサービス列挙方法調べてその中にそれっぽいの居ないか試すように要請して寝る
  11. 起きてみたらどうしたらいいかわからなかったらしい。
原因究明

埒が明かないので実際にあって操作することに。

/opt/cisco/anyconnect/bin/vpnuiを起動しようとすると確かに一瞬だけGUIが出て即座に死ぬこと確認。

  1. networkmanager-openvpn, networkmanager-openconnectpacmanから入れてみるもだめ。
  2. networkmanager-openvpn-gtk2をyaourtから入れようとしてみる
    1. gpg署名検証エラーで怒られる
    2. gpgコマンドから--serch-keysで出てくるのに--recv-keysできない問題に当たる
    3. 仕方ないので公開鍵を手動で取ってきてpacman-key --addする
    4. yaourtでビルドが通ったが、インストールフェーズでnetworkmanager-openvpnと競合するとの通知がきて取りやめ
  3. ls /opt/cisco/anyconnect/binしたときにvpn, vpnui, vpnagentdがいた。
    1. /opt/cisco/anyconnect/bin/vpnをターミナルから立ち上げると、メッセージをメモし忘れたがエージェントが居ないとか云々言われた気がする。
    2. あれ、これvpnagentdが立ち上がってない・・・?
    3. vpnagentdを立ち上げてからvpnコマンド立ち上げたらそのメッセージが消えた
    4. これだっ!自動起動の設定がコケてたんだ!
systemdのserviceを書こう

Ubuntu16.04でマウスのホイールの回転量を調整する - QiitaでSystemdのサービスを書いたことがあったのでこれを参考に書き進める

  1. Fedora Quick Docs | Fedora Quick Docs | Understanding and administering Systemd#creating-new-systemd-servicesのサンプルのExecStart=/usr/bin/sleep infinityに騙されてExecStart=/opt/cisco/anyconnect/bin/vpnagentd infinityとしてしまう(節子、それsleepコマンドの引数や!)
  2. Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめもを見てWants+AfterじゃなくてRequiresを使うように: 少なくともサービスが立ち上がるようにはなったがvpnagentdが立ち上がらない
  3. なんかしばらくするとサービス落ちる問題
  4. ユーザーサービスにしたらうまくいくのでは?: システムサービスじゃないとioctlがコケる
  5. ようやくserviceのタイムアウトのせい?と気がつく: [Service]>RemainAfterExit=yesが必要だった
  6. うまく行ったと思ったが、OS終了時にあきらかにこのサービスの終了待ちのタイムアウトが・・・
  7. ExecStopが必要
  8. 完全解決!