Raspberry Pi を触ってみている。普通のPCとほとんど扱い変わらんから楽。以下設定等のメモ。
Raspbianのインストール。
インストール時だけモニタとキーボードが必要。後はSSHで。
とりあえずssh接続できる様に /etc/ssh/sshd_config を設定。
公開鍵認証でログインできる様に。パスワードログインを無効化。
無線LAN化
無線LANアダプタとして PLANEX の GW-USNANO2A を購入。
によってWifiの接続を設定。しかしsshからつながらず…
パワーマネジメントを切るとやっとつながるようになった
また、eth0のipを固定する設定は消しておいた。使わないし。
しかしまだネットにつながらない(どうやらDNSが引けてないっぽい)のでDNSを設定した。
最終的に /etc/network/interfaces はこんな感じになった。ここで、Raspberry Piのアドレスが 192.168.0.5 、ルータのアドレスが 192.168.0.1 とする。
auto lo iface lo inet loopback auto eth0 allow-hotplug eth0 iface eth0 inet manual metric 1 auto wlan0 allow-hotplug wlan0 iface wlan0 inet static metric 0 address 192.168.0.5 netmask 255.255.255.0 gateway 192.168.0.1 dns-nameservers 192.168.0.1 wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp auto wlan1 allow-hotplug wlan1 iface wlan1 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
どこかに無駄があるかもしれないがとりあえず動いているのでよしとする…。
SSHポートフォワーディングでネットワーク外部からアクセスできるように
SSHポートフォワーディングを使うとポート解放できないローカルネットワークにあるサーバに対しても、外部に公開されたサーバを踏み台として外部からアクセスできる様になるらしい。
- 外部(からの)アクセスに便利なsshポートフォワーディング - 右往左往ブログ
- 楽しいトンネルの掘り方(オプション: -L, -R, -f, -N -g) — 京大マイコンクラブ (KMC)
- SSHポートフォワード(トンネリング)を使って、遠隔地からLAN内のコンピュータにログインする - ククログ(2014-09-12)
この用途には -R オプションを利用する。
外部公開サーバを用意する。ここでは仮に example.com と書く。
外部公開サーバの hoge アカウントに ssh 接続できる様にセットアップしているとした場合、
外部公開サーバの 10080 番ポートをローカル(Raspberry Pi)の 80 番ポートにマッピングするためには
ssh -R 10080:127.0.0.1:80 hoge@example.com
などとすればよい。 オプション -f -N を付けるとバックグラウンドで実行してくれる様になる。
ssh -f -N -R 10080:127.0.0.1:80 hoge@example.com
この状態で外部公開サーバの 10080 番ポートにアクセスするとローカルの 80 番ポートにつながれるはず。
自動再接続
このままでは接続が切れるとそれっきりなので、再接続してくれるようにしたい。これは autossh を使うとできるらしい。
使い方は簡単で、 ssh コマンドの代りに autossh にするといいとのこと。
autossh -f -N -R 10080:127.0.0.1:80 hoge@example.com
(-f -N コマンドを付けた場合、うまく ssh の接続を張ってくれない場合もあった…公開鍵認証でパスフレーズを設定していたことが原因かもしれない)
起動時に自動接続
起動時に自動で接続する様にすれば、常にポートフォワーディングが行われる様になる。
を参考にした。
自動で接続しようとするとパスフレーズなしの鍵を作ることになるので、実際には何もすることのできない様なユーザ autossh にログインさせることになる。
ローカル側(Raspberry Pi)
ユーザ作成
sudo useradd -m -s /bin/false autossh
鍵作成
sudo su -s /bin/bash autossh ssh-keygen
ここで、鍵作成時にパスフレーズは空にしておく。1行目については、アカウント autossh にはシェルが設定されてないので指定する必要がある、ということらしい。
公開鍵(デフォルトでは /home/autossh/.ssh/id_rsa.pub )をリモート側(外部公開サーバ)にscpかなんかで転送する。
リモート側(外部公開サーバ)
ユーザ作成
sudo useradd -m -s /bin/false autossh
鍵の設定。ローカル側から転送したキー(id_rsa.pub)の入っているフォルダに移動して
sudo mkdir /home/autossh/.ssh sudo chmod 700 /home/autossh/.ssh sudo chown autossh:autossh /home/autossh/.ssh cat id_rsa.pub >> authorized_keys sudo mv authorized_keys /home/autossh/.ssh/ sudo chmod 600 /home/autossh/.ssh/authorized_keys sudo chown autossh:autossh /home/autossh/.ssh/authorized_keys rm id_rsa.pub
とか何とか(やっていることは普通にsshの公開鍵認証の鍵の設定をしているだけ)
そうすると、ローカル側から
sudo su -s /bin/sh autossh -c 'autossh -M 0 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 10080:127.0.0.1:80 autossh@example.com'
などとして繋がることを確認する。
後は、OSの起動時に
su -s /bin/sh autossh -c 'autossh -M 0 -q -f -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 10080:127.0.0.1:80 autossh@example.com'
が実行されるようにすればよい。
OS起動時に実行される様にするために、まず起動スクリプト(insserv用に INIT INFO も)を書く。
/etc/init.d/autossh を次のような内容で作成し、実行属性を付ける。
#!/bin/sh ### BEGIN INIT INFO # Provides: autossh # Required-Start: $local_fs # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: autossh tunnel ### END INIT INFO start(){ echo -n "starting autossh...\n" su -s /bin/sh autossh -c 'autossh -M 0 -q -f -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 10080:127.0.0.1:80 autossh@example.com' return 0 } stop(){ echo -n "stopping autossh...\n" killall autossh return 0 } case $1 in start) start ;; stop) stop ;; esac
- 起動スクリプトの書き方 | 変なヤバいもんログ
- Raspberry Pi • View topic - inssserv: warning: script 'mathkernel' missing LSB tags
を参考にした。
OS起動時の自動実行には insserv を使い
sudo insserv autossh
とする。
これでRaspberry Piを起動すれば
example.com:10080
にアクセスすると、Raspberry Piの80番ポートにつながるはず。
セキュリティ的には穴あけてるみたいなもんだから使い方には気をつけないといけなさそう。
再び無線LANアダプタ
なぜか自分の環境だと、ネットワークからRaspberry Piにアクセスしたときに無線LANが突然動作しなくなることがしばしばあった。なんなのだろうか。
とりあえず
sudo /etc/init.d/networking restart
すると一先ず直るのだが。
他にもWifiが突然落ちて困ってる人もいる様だ。
raspbian - Falls off network ("Destination host unreachable") - Raspberry Pi Stack Exchange
原因を探り中。
(2015/08/10 追記)
高負荷だと落ちるのかもしれない? ClamAVを無効にしたら(これは何かの勘違いで必要だと思ってインストールしたのだったはず)とりあえずは落ちないようになった。
それよりも、ポートフォワーディングでつながったりつながらなかったりすることがあった。設定を変える必要があるのかも?
(2015/08/17 追記)
いつの間にか安定してつながるようにはなったのだが、逆にローカルからはつながらないという事態に。なんなのだろう…。