labunix's blog

labunixのラボUnix

GNS3をアップグレードする。(+gpg鍵のトラブルシュート)

■GNS3をアップグレードする。(+gpg鍵のトラブルシュート)
 [topology.net]は読めばなんとなく構成が分かるので、
 [project-name.gns3]への書き換えは行わずにアップデートしてしまうことにした。

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 9.3 (stretch)
Release:	9.3
Codename:	stretch

■そもそも[contrib]から取得したバージョンで現在も2014年のパッケージが最新となっている。

$ apt-cache show gns3 | awk '/Section|Filename/'
Section: contrib/net
Filename: pool/contrib/g/gns3/gns3_0.8.7-2_all.deb

$ awk '/contrib/' /etc/apt/sources.list | \
    awk '{print $2"pool/"$5"/g/gns3"}' | xargs w3m -dump | awk '/all.deb/'
[ ]   gns3_0.7.4-1_all.deb               13-Apr-2011 06:05 3.7M  
[ ]   gns3_0.8.6-3~bpo70+1_all.deb       01-Jul-2014 17:29 5.0M  
[ ]   gns3_0.8.7-2_all.deb               28-Nov-2014 07:46 3.1M  

■アンインストール、インストール方式でアップグレード
 ユーザ権限でパケットキャプチャ出来るように構成。

$ sudo apt-get remove -y gns3 && sudo apt-get -y autoremove

$ echo 'deb http://ppa.launchpad.net/gns3/ppa/ubuntu xenial main
deb-src http://ppa.launchpad.net/gns3/ppa/ubuntu xenial main
' | sudo tee -a /etc/apt/sources.list.d/gns3.list
deb http://ppa.launchpad.net/gns3/ppa/ubuntu xenial main
deb-src http://ppa.launchpad.net/gns3/ppa/ubuntu xenial main

■gpg鍵をチェックしないでインストールする場合
 以後アップデート時に毎回気になるはずなのでお勧めはしない。

$ sudo apt-get update --allow-unauthenticated 
$ sudo apt-get install --allow-unauthenticated -y gns3-gui

■プロキシ経由でgpg鍵をチェックする場合

$ sudo apt-get install -y dirmngr; \
  sudo apt-get update 2>&1 | awk '/^W.*[A-Z0-9]$/{print $NF}' | \
    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 \
    --keyserver-option http-proxy=http://172.31.31.60:8080/ --recv-keys `xargs`
Executing: /tmp/apt-key-gpghome.fbdqq90MnN/gpg.1.sh --keyserver hkp://keyserver.ubuntu.com:80 \
  --keyserver-option http-proxy=http://172.31.31.60:8080/ --recv-keys 9A2FD067A2E3EF7B
gpg: 鍵9A2FD067A2E3EF7B: 公開鍵"Launchpad PPA for GNS3"をインポートしました
gpg:           処理数の合計: 1
gpg:             インポート: 1

$ sudo apt-key list | grep -A 4 '/etc/apt/trusted.gpg$'
Warning: apt-key output should not be parsed (stdout is not a terminal)
/etc/apt/trusted.gpg
--------------------
pub   rsa1024 2013-07-06 [SC]
      F88F 6D31 3016 3304 04F7  10FC 9A2F D067 A2E3 EF7B
uid           [  不明  ] Launchpad PPA for GNS3

■プロキシ経由でgpg鍵をチェックする方法で、
 同じURLを指しても以下のエラーで失敗することがある。
 原因は「キーサーバが利用可能ではありません」とあるが、
 成功時と比べるとソースとして接続先IPのログに至らないどころか、
 プロキシまで到達している形跡が無いところから恐らくメッセージと違うところでコケている。

$  gpg -vvv --debug-all --recv-keys --keyserver keyserver.ubuntu.com:80 --keyserver-option http-proxy=http://172.31.31.60:8080/ --recv-keys 9A2FD067A2E3EF7B
gpg: Note: no default option file '/home/labunix/.gnupg/gpg.conf'
gpg: using character set 'utf-8'
gpg: enabled debug flags: packet mpi crypto filter iobuf memory cache memstat trust hashing ipc clock lookup extprog
gpg: DBG: [not enabled in the source] start
gpg: no running Dirmngr - starting '/usr/bin/dirmngr'
gpg: waiting for the dirmngr to come up ... (5s)
gpg: DBG: chan_3 <- # Home: /home/labunix/.gnupg
gpg: DBG: chan_3 <- # Config: [none]
gpg: DBG: chan_3 <- OK Dirmngr 2.1.18 at your service
gpg: connection to the dirmngr established
gpg: DBG: chan_3 -> GETINFO version
gpg: DBG: chan_3 <- D 2.1.18
gpg: DBG: chan_3 <- OK
gpg: DBG: chan_3 -> OPTION http-proxy=http://172.31.31.60:8080/
gpg: DBG: chan_3 <- OK
gpg: DBG: chan_3 -> KEYSERVER --clear keyserver.ubuntu.com:80
gpg: DBG: chan_3 <- OK
gpg: DBG: chan_3 -> KS_GET -- 0x9A2FD067A2E3EF7B
...失敗時...
gpg: DBG: chan_3 <- ERR 167772346 キーサーバが利用可能ではありませ� <Dirmngr>
gpg: keyserver receive failed: キーサーバが利用可能ではありません
gpg: DBG: chan_3 -> BYE
gpg: DBG: [not enabled in the source] stop
gpg: random usage: poolsize=600 mixed=0 polls=0/0 added=0/0
              outmix=0 getlvl1=0/0 getlvl2=0/0
gpg: secmem usage: 0/65536 bytes in 0 blocks

...成功時...
gpg: DBG: chan_3 <- S PROGRESS tick ? 0 0
gpg: DBG: chan_3 <- S SOURCE http://51.15.0.17:80
gpg: DBG: chan_3 <- D -----BEGIN PGP PUBLIC KEY BLOCK-----
...以下取得処理...

■回避方法:別の取得が成功したファイルを流用する。

gpg: keyserver receive failed: そのようなファイルやディレクトリはありません

$ scp /etc/apt/trusted.gpg vm-gns3:
$ ssh vm-gns3
$ sudo mv trusted.gpg /etc/apt/
$ sudo apt-key list | grep -A 4 '/etc/apt/trusted.gpg$'
Warning: apt-key output should not be parsed (stdout is not a terminal)
/etc/apt/trusted.gpg
--------------------
pub   rsa1024 2013-07-06 [SC]
      F88F 6D31 3016 3304 04F7  10FC 9A2F D067 A2E3 EF7B
uid           [ unknown] Launchpad PPA for GNS3

■回避方法で取得した成功時のファイルを削除する場合

$ sudo rm /etc/apt/trusted.gpg
$ sudo apt-get update 2>&1 | awk '/^W.*[A-Z0-9]$/{print $NF}'
9A2FD067A2E3EF7B
9A2FD067A2E3EF7B

■gpgコマンドで登録する場合
 プロキシログ上で「5xx」のサーバエラーとなっている場合は別のkeyserverを試すのもひとつの手。
 HKP(Howrowitz Key Protocol)はHTTP互換のはずだが、
 keyserverの指定を「hkp://」でプロトコル指定、「:80」でポート指定、
 「/」でディレクトリ指定をしたところ、失敗する確率が劇的に減りはするがゼロにはならないが、
 プロキシログまで到達していない場合はプロセスをpkillしてみると失敗してもリトライ時に成功するようになった。

$ ps -ef | grep gpg
labunix  19815   933  0 18:45 ?        00:00:00 /usr/bin/gpg-agent --supervised
labunix  19854 19724  0 19:05 pts/1    00:00:00 grep gpg

$ ps -ef | grep dirmngr
labunix  19807     1  0 18:44 ?        00:00:00 dirmngr --daemon --homedir /home/labunix/.gnupg
labunix  19856 19724  0 19:05 pts/1    00:00:00 grep dirmngr

$ pkill dirmngr;pkill gpg

$ gpg --list-keys 9A2FD067A2E3EF7B
gpg: keybox'/home/labunix/.gnupg/pubring.kbx'が作成されました
gpg: /home/labunix/.gnupg/trustdb.gpg: 信用データベースができました
gpg: error reading key: 公開鍵がありません

$ gpg --list-keys 9A2FD067A2E3EF7B
gpg: error reading key: 公開鍵がありません

$ gpg --keyserver hkp://keys.gnupg.net:80/ \
    --keyserver-option http-proxy=http://172.31.31.60:8080/ --recv-key 9A2FD067A2E3EF7B
gpg: 鍵9A2FD067A2E3EF7B: 公開鍵"Launchpad PPA for GNS3"をインポートしました
gpg:           処理数の合計: 1
gpg:             インポート: 1

$ gpg --list-keys 9A2FD067A2E3EF7B
pub   rsa1024 2013-07-06 [SC]
      F88F6D313016330404F710FC9A2FD067A2E3EF7B
uid           [  不明  ] Launchpad PPA for GNS3

$ apt-key list 9A2FD067A2E3EF7B
pub   rsa1024 2013-07-06 [SC]
      F88F 6D31 3016 3304 04F7  10FC 9A2F D067 A2E3 EF7B
uid           [  不明  ] Launchpad PPA for GNS3

■失敗時には稼働中のプロセスを停止する必要があるので、
 「recv-keys」を「search-keys」に変えてもデバッグログの出力は変わらない。
 今回のヒントはプロキシログへの到達性だったが、
 以下のデバッグログよりも通信ログや稼働中のプロセスを確認する方がトラブルシュートのヒントが見つかる。

$ gpg -vvv --debug-all --keyserver hkp://keyserver.ubuntu.com:80/ \
    --keyserver-option http-proxy=http://172.31.31.60:8080/ --recv-keys 9A2FD067A2E3EF7B
$ gpg -vvv --debug-all --keyserver hkp://keys.gnupg.net:80/ \
    --keyserver-option http-proxy=http://172.31.31.60:8080/ --recv-key 9A2FD067A2E3EF7B