ssh-agent

GNU screen で ssh-agentを使うとおかしくなる問題から色々やってみた

新しくウィンドウを開くとssh-agentのソケット名が変わったりパスワードを入力するのが難しかったり期限切れにできなかったりと、色々大変である。

^A c でウィンドウ開いてssh host、直接screen ssh hostなどで、生存期間内ならパスフレーズなし、期限切れならそこで入力、としたい。

とりあえずssh-agentを使う方法とgpg-agentを使う方法があり、それぞれにsystemdを使う方法と.bashrcなどで自力でやる方法があったが、結局ssh-agentにした。

openssh-client=1:8.2p1-4
systemd=245.5-2

ssh-agent

生存期間を指定すると毎度ssh-addを動かさないといけなくなる。
色々悩んだ結果、sshのラッパー書くことにした。

#!/bin/sh
ssh-add -l > /dev/null || ssh-add -t 600
/usr/bin/ssh @$

ssh-agentをどこで起動するか、だが openssh-client パッケージにssh-agent.serviceがあるので利用する。
systemctl enable --user ssh-agent.service
すると、[Install]がないためenableにできない。
なので
systemctl edit --user ssh-agent.service

[Install]
WantedBy=default.target

を追加する。(新規ファイル)
その後
systemctl enable --user ssh-agent.service
で追加。新しくユーザーセッションが始まれば起動される。

あとは、SSH_AUTH_SOCKを固定にするため、.bashrcで指定する。

...
[ -z ”$PS1” ] && return
...
export SSH_AUTH_SOCK=/run/user/$(id -u)/openssh_agent
if [[ ! $TERM =~ screen*|dumb ]]; then
~/bin/ssh -V 2> /dev/null
screen -RR -D
fi

これで普通にログインするとssh-add用のパスワードを聞いてきた後、screenが立ち上がり、既にセッションがあればアタッチする。(-RDDオプション)
欠点はscreen動かしたくない時(コンソールとか)にも動いてしまうこと。
生存期間が過ぎていればパスワード入力時にctrl-Cで止めることは可能。

loginctl

テストしているとssh-agentがいっぱい動いたりキャッシュがあったりなかったりでよくわからなくなってくる。
そこで、
sudo loginctl terminate-user username
とすると、usernameのプロセスがまとめて消える。
(もちろんログアウトされる)

gpg-agent

gpg-agentはsudoのように認証後しばらく保持して、10分後に使うときは再度パスワードの入力を求める、などができるんだけど、このパスワード入力がpinentryを使用するのだが、これに問題がある。
どこに表示するか、をGPG_TTYに登録する必要があるのだが、screen上で
screen ssh server
などとやると新しい窓が開いてsshしようとするのだが、GPG_TTYが前の窓のままなので戻ってパスワードを入力する必要があったりする。
かつこのパスワード入力はCtrl-Cとか押すとその後表示がおかしくなったりそもそも中止できなかったり、どの窓で入力待ちをしているのかわからなくなったりで非常に使いづらい。
一応、やったことを残しておく。

...
[ -z ”$PS1” ] && return
...
if [ -x /usr/bin/gpg-agent ]; then
export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye
export SSH_AUTH_SOCK=”$(gpgconf --list-dirs agent-ssh-socket)”
fi
pinentry-program /usr/bin/pinentry-tty
enable-ssh-support
default-cache-ttl       600
max-cache-ttl-ssh       1800

5月11日追記
~/bin/ssh みたいなことをしなくても、
~/.ssh/config に
AddKeysToAgent yesと書けばよかったみたい。
有効期限はssh-agentに-t 有効期限でいいようだ。

ssh-agent.serviceは、システムの物を再利用するより新しく作った方が良さげ。

[Unit]
Description=OpenSSH Agent
Documentation=man:ssh-agent(1)
Wants=dbus.socket
After=dbus.socket

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/openssh_agent
ExecStart=/usr/bin/ssh-agent -D -t 600 -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

4on6 tunnel

RTX810とRTX1500でvpn使っていたが、速度的になんとかならんかということで構成を変えてみた。
RTX1500は100baseでRTX810は1000baseってところで既にボトルネックは分かっているんだが…
RTX1500にPPPoEもやらせていたが、どうせ使っている無線LANルーターにやらせることにした。
IPv6対応とかいいながら単にパススルーというのが気に入らなくてルーターやらせて無かったが(ぁ
これだけでもさりげに速くなっていて草。
そしてLinux鯖にv6ルータとVPNをやらせる。
対向マシンとの接続を活かしつつルーターの設定は疲れる… まあグローバル死ななきゃ何とかなるんだけど。

# ip tunnel add tun0 mode any encaplimit none ローカルv6 リモートv6
これでip6tnl0とtun0ができる。
ip6tnlが何者か分からんがとりあえず気にしないことにする。
# ip link set up tun0
# ip route add 192.168.リモートサブネット.0/24 dev tun0

これで一応相手のネットワークには繋がる
encaplimit noneが無いとダメとかmodeがip4ip6にしててv4ダメとか苦労した
ip -6 route add fd00:相手V6ローカルサブネット://64 dev tun0
とりあえず、tunデバイス自体にはアドレスは必要ない。V6リンクローカルは勝手に付くけど、デバイス名の指定だけでいいのでアドレスそのものを使うことはない
要は相手のサブネットへのルーティングでtun0を指定してやればいいだけ。
最初はipip6とかipipとか指定しなければならないと思いこんでいたが、両方使えるanyがあったらしい。
systemd.networkで記述するときにmanで見つけた。

[NetDev]
Name=tun0
Kind=ip6tnl

[Tunnel]
Mode=any
Local=ローカルv6>
Remote=リモートv6
EncapsulationLimit=none
[Match]
Name=tun0

[Route]
Destination=192.168.相手サブネット.0/24
Scope=link

[Route]
Destination=相手v6ローカルサブネット::/64
PreferredSource=ソースアドレス
[Match]
Name=eth0

[Network]
IPv6AcceptRA=true
Address=IPv4アドレス
Gateway=IPv4ルータアドレス
Address=IPv6アドレス
Tunnel=tun0

eth.networkにTunnel=tun0が無いせいでだいぶ悩んだ。
tun0@none と tun0@eth0 とデバイス名が違う。
ルーティングで悩んだのはスタティックルーティングをv4とv6両方とも書く方法だった。
なんかip route addを実行する.service書け、とかあって美しくないとか思っていたら
単に[Route]を2つ書けばいいだけだったらしい。
これでsystemd-networkdだけで行けるようになった

そして安心して再起動して帰ったら、家からつなぐときに WiFiだと繋がるがイーサネットだと繋がらないとか、イーサネットでもつながるマシンがあったりとかで、また次の一日がつぶれた orz

結局tun0.netdevの書き間違いで、
EncapsulationLimit=0
ではなく
EncapsulationLimit=none
だった。
これ、なぜかsystemctl restart systemd-networkd では反映されなくて、システム再起動しないと反映されなかったりしてこれまた時間がかかった。
ネットワーク関係だと再起動時にコケてリモート接続できなくなるのが怖くてディスプレイつながないと再起動したくなかったとかあって無駄に時間潰した orz

ip -6 route showの結果を見ていて気が付いたのだが、static route にsource addressが指定できるっぽい。
今まで鯖同士の通信で自動アドレス優先されてうがーだったのがましになるかも?
しかしsystemd.networkの書き方はSource=ではなくPreferredSource=という罠があった。

rtx1500を外すことになったので、radvdも復活させた。前に使っていた設定で大体行けたので楽だった。
昔意味が解らなかった物が今だと解るものも一杯ある。
仕様が増えて実装もされて昔問題だったものの解決法があったりして(当時気が付かなかっただけかも?)進歩しているなぁと…

しかしRAが出せる無線ルータってほんと少ないのな。
まあRA出せる有線ルータも高いのしかないのだが…

つーか、これ暗号化していないのでアレでナニなのでソレ。(謎)

マウス(トラックボール)

トラックボールの調子が悪くなってきたので新しいのを買ってきた。
ELECOM M-DT1DRBK
前は親指操作だったのを、人差し指操作に変更してみた。
前のもトラックボールに慣れるのに時間かかったけど、今回のも慣れるのに時間がかかりそうだ。

使いやすいかどうかは慣れてみないと何とも言えぬ。
操作する指が違うのはやはり混乱する。
ホイールも親指になるのがなかなか慣れないなぁ・・

トラックボールの良い所は何と言っても場所を取らない。
HMDとか付けて寝っ転がってても布団の中でマウス操作ができるw
キーボードはホームポジションさえ探せれば使えるんだがやはりトラックボールがお手軽である。

有線か無線にするか悩んだけど寝っ転がるために無線を選択(ぁ

リモコンとかケーブルとか2

結果を書いてなかった。

まずDPケーブル
映らない。
ケーブルのせいなのかハードのせいなのかソフトのせいなのかわからん。
認識すらされていないようなのでどうもケーブルのせいっぽいけど代わりがないので確認することもできぬ。

結局D-SUBでつなげたままである。

他にDPコネクタ持ってるカード無いかなーと思って探したらHDMI付きのがあったので刺そうと思ったら、ロープロファイルのため刺さらなかった orz
確かにPC買うときにロープロファイルかどうか確認しなかったけど、まさかこんなところで引っかかるとは・・・

今のままでもとりあえず問題なさげなのでこのまま行こうと思う。
ふらりと中古屋でロープロファイルなそれっぽいVGA見つけたら買うかもしれん。

で、リモコン
一応、必要な機能は使えた。ただ、ボタンが小さく、親に使わせるには少々難しいかもしれない。
とはいえ、普通に対応するリモコンが全然ないのでしょうがない。

騙し騙し使っていくかな

リモコンとかケーブルとか

今日の買い物メモ。基本的に中古屋。

先日新しくPCを購入した(中古)
ディスプレイケーブルがDP/D-Subの2択で、DP持ってなかった。
(というかDisplayPortの存在を初めて知った)
現在、D-Subで接続中。せめてDVIがあれば・・・
# ちなみにPC購入時、HDMIだろうと思って何とかなるだろうと思ったのが間違い。
# まあ、GeForce310なので性能的にはお察しなのだが・・・

中古屋で探したけどHDMI-miniDPケーブルとかDP-DVI変換とかあったんだが今回は見送り。
ケーブルは600円程度だったけど変換必要になるし、DP-DVI変換コネクタは1200円したので見送った。
どうせならケーブルが欲しい。
別の店で新品見たらHDMI-DPケーブル2m 2300円ぐらい、だった。結局amazonかな・・・

テレビのリモコンが死んでいたので互換を探す。
C-RN2が欲しかったがさすがに無い。
代わりにC-RN4というのがあったので試しに買ってみた(ジャンク108円)
結果としてテレビ部分は反応するがビデオ関係が動かない、というオチだった。捨て。
互換でC-RP2があるらしい。これもamazonかな・・・