見出し画像

外出先から家のファイルに安全にアクセスするシステムを作る

*この記事は、linuxやwslを使っている人(使える人)向けになります。

仕事では自分のノーパソを使っています。ここに仕事のファイルを保存するのはかなり抵抗がありました。電車やレストランなどでの盗難、置き忘れの危険があるからです。

家でVNCサーバを作り、外からリモートデスクトップでアクセスすることを一旦は考えました。これによりノーパソ側ではデータを持たないシンクライアント端末のようになるからです。昔で言うダム端末ですね。

しかし、VNCにすると画面転送がもたつきます。10年や20年も前と比べると、今は自宅のインターネット環境、携帯キャリアの速度も桁違いに速くなっています。

でも、やはり遅延はあるので仕事や作業に集中した時はストレスになります。

なにかいい方法はないか。特にSSHを使って安全に家にあるデータにアクセスできないか。

こうやって模索している時にsshfsというコマンドがあることを知りました。

SSHはSSLを使った暗号通信です。SSLの脆弱性は頻繁に報告されていますが、現状SSH以上に個人がフリーで安全に使える暗号化通信はないでしょう。

SSHはFTP over SSHのsftp、cp over SSHのscpと、かなり汎用的なオプションというかコマンドが用意されています。

その流れで、sshfsがありました。fsはfile systemの略です。このコマンドを使うことで、リモートサーバのディレクトリをローカル側にマウントできます。まさに求めていた方式です。

自宅ではsambaでマウント

ファイルを置くサーバはラズパイで構築しています。ボクは4Bのモデルを使っています。

こいつに500GBのSSDと、6TBのHDDを接続しています。それぞれ、/mnt/500GB、/mnt/6TBとしてマウントしています。

6TB HDDは今回は関係ないのですが、ボクは家で飼っているフェレットの動画を毎日かなり撮っていて、1日20-30GBになるのでその保存先で使っています。今回のsshfs用ディレクトリのバックアップとしても使っています。

sambaの設定は以下の通り。aptで入れたsambaですが、今はこんな数行で簡単にネットワークから見えます(昔はマウス投げたくなるぐらい面倒だった)。

Windows側ではネットワークドライブとして見えるので、仕事で使うフォルダをクイックアクセスにピンどめしています。これで家にいる時はローカルにファイルがあるのと同じ感覚で使えます。

外出先からはsshfsで安全にアクセス、ローカル側にマウント

ここからが今回のキモですね。

外出先から自宅のラズパイにアクセスするにはまず自宅のWAN側IPアドレスの情報が必要です。

今はdynamicDNSを使っているのですが、それ以前は簡単なシェルスクリプトを組んで、インターネットのホストに送っていました。この方法はインターネット側にレンタルサーバなど、なにかしらのサーバがあり、htmlを送信できることが前提になります。

書いていたシェルスクリプトはこんな感じ。dynamicDNSを使っている今も一応稼働させています。

ifconfig.ioというサービスがあります。どのIPからアクセスしているのかを教えてくれるのですが、curlでアクセスする時に-4というオプションをつけると、IPだけ表示してくれます。めっちゃありがたい。

それをhtmlに書き出して、インターネットのホストへ転送しています。この時scpを使っています。いちいちパスワードを入力してられないので、公開鍵方式にして、ノンパスワードで登録しています。

このファイルにブラウザでアクセスして、自宅のIPを見られるようにしています。一応basic認証をかけています今はdynamicDNSを使って、webサーバを立ち上げたので、IPを隠す意味もないんですけどね。

ログインするとIPだけ見えるシンプルなHTML。

このIPに対してsshfsでアクセスし、指定したリモートディレクトリをローカル側にマウントします。

ちなみにローカル側で使うのはwsl2です。ボクはubuntu20.04を使っています。

最初に/etc/fuser.confの「user_allow_other」のコメントを外しておきます。

叩くコマンドはこんな感じ。家でも使っていたので下のスクショはプライベートIPになっていますが、外出先ではここをグローバルIPに変更すればアクセスできます。

キモはオプションの「-o allow_other」。これを知らなくて、最初は「wsl2(ubuntu20.04)ではファイルが見えるけど、エクスプローラーでは見えない」という状況になっていました。見えないというか、エクスプローラーでアクセスするとエラーが出て表示できないという状況でした。

これを打破するのが、さっきの/etc/fuser.confの設定と、sshfsを叩く時の-oオプション。

上記のシェルスクリプトではすぐにエクスプローラーでアクセスするため、「explorer.exe .」で開いています。これによってSSH接続できたこと、マウントできたこと、エクスプローラーで開けることを全部確認できます。

ボクは/home/your_name/remoteにマウントしています。エクスプローラーで見ると、sambaでマウントしているのと同じ内容でちゃんと見えています。もちろんファイルの読み書きもできます。

ちなみにPCがスリープしたり、ネットワークが切れると自動でマウントは解除されますが、手動で解除するなら「fusermount -u dir」です。

DynamicDNSを使う

先日から、鳥撮りの写真公開用にラズパイをwebサーバとしても使い始めました。Noteでも記事を挙げた川島町のコハクチョウの写真です。

Noteだと写真が勝手に解像度を変更されたり、写真の編集が面倒だったり、Retinaディスプレイ対応にできない(srcsetが使えない)など問題が多々あります。

かと言って、最近はさほど頻繁には鳥撮りしていないので、それだけのためにレンタルサーバ+独自ドメインを契約して年間1万円ぐらい払うのももったいなく感じました。

フリーのブログサービスでRetina対応できるところを探していたのですが、やはり写真メインになるとかなり面倒です。

使い慣れたワードプレスだと、シェルスクリプト一発でRetina対応(srcset対応)できるので、自宅のラズパイをwebサーバにするかと構築しました。

外部公開するにあたって、フリーのDynamicDNSサービスをいろいろ探していたのですが、DDNS NowがコマンドでIPアドレスの更新に対応しているので、契約させてもらいました。もちろん無料です。

有名な更新ツール:DiCEはWindowsで使っている人が多いのですが、Linux対応版だとコマンドで使えるか分からなくて(DiCEを使ったことない)、DiCEしか対応していないDDNSは避けました。

コマンドはDDNS Nowのホームページでも説明されていますが、wget一行で済んでしまいます。これをcronに登録しておけば完了です。毎分アクセスは先方に負荷がかかって迷惑じゃないかなと思ったのですが、公式に書かれていたcronの設定が毎分だったので、ありがたく設定させていただきました。さきほど紹介した、IPアドレスを取得して、インターネット側サーバにHTMLをアップするスクリプトは10分置きです。

これでDDNS Now側のAレコードが設定されます。公式ページでも、IPが更新されていることを確認できます。

DDNSを契約したので、覚えやすいFQDNで外からアクセスできるようになりました。

sshfsの実行速度ですが、4G環境でもローカルにファイルを置いているのと体感的には変わらない速度です。

SSHを使う安心感

ボクは会社ですら、他人を信用していません。うちの会社はフリーアドレスなのですが、トイレに行く時でもスマホは身につけ、PCはスリープにします。

昼食などでオフィスを離れる時はノーパソごと持っていきます。

そんな人間なので、喫茶店、シェアオフィスなどで作業する時「万一ここで盗まれたら・・・」と常に不安でした。極論、暴漢に襲われてPCやリュックをまるごと奪われたら・・・という心配があります。

万一の可能性かもしれないけど、その万一が発生した時、会社や取引先に与える影響は計り知れません。自分が責任を取って会社を辞める・・・そんな単純な話で済むレベルではないはずです。機密情報がたくさん入ってますからね。

今までも、出張先のホテルからインターネットにアクセスする時は、必ずsshトンネルを張って、通信を暗号化していました。特に中国みたいに国レベルで人の通信を覗き見ている場所ではsshで暗号化(VPN化)は必須です。

あの国はtwitterもfacebookもyoutubeも見られませんが、sshトンネルを張ると中が見えないので、中国のホテルに泊まっている時もアクセスできるようになります。

今回はこれを一歩進め、ファイルそのものは自宅のサーバ(ラズパイ)に保存し、それを外出先からはsshでアクセスして、PCのローカル側にマウントすることで、PCに保存されたファイルのような使い勝手を実現できました。

もうSSHなしでは生きていけないです。

以前はnextcloudを使って、すべてのPCでデータを同期していました。しかし、sshfsの使い勝手が非常によく、かつ安全なのでデータはラズパイのみに集約し、nextcloudはやめました。各PCに散在していたデータもすべて削除しました。

ただ、これだと万一ラズパイに接続しているSSDが飛んだ時、自分の人生も飛びます。

そこで別目的で接続していた6TBのHDDに、1日に1回、rsyncでバックアップしています。

この環境で運用するようになってから、文字通り心の平和が訪れました。




この記事が気に入ったらサポートをしてみませんか?