にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

Raspberry Pi であそぶ ~ インストールからSSHリモートポートフォワーディング

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ポートフォワーディングを使うとポート解放できないローカルネットワークにあるサーバに対しても、外部に公開されたサーバを踏み台として外部からアクセスできる様になるらしい。

この用途には -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

を参考にした。


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 追記)
いつの間にか安定してつながるようにはなったのだが、逆にローカルからはつながらないという事態に。なんなのだろう…。