自宅のネットワークに外からアクセスする方法を考える

先日、自宅の回線をIPoEにした(記事)。その時は「自宅のネットワークに外からアクセスする」問題は棚上げにしたが、今度はもう少し真面目に考えてみたい。

アクセスしたい物品

本題とは逸れるが、そもそもなぜ自宅のネットワークに外からアクセスしたいのか、筆者の場合の「外からアクセスしたい機器」を挙げておく。

Raspberry Pi

家に常時起動のラズパイがあると便利である。使い道は

  • SSHで入ってLinux環境として使ったり、
  • 他のマシンにWake on LANのマジックパケットを送って起動したり、
  • Port forwardingの踏み台にしたり、
  • 赤外線LEDを使って家電を制御したり、
  • VPNサーバーを立てたり、

などいろいろと考えられる。とりあえずSSHでログインできることが重要である。

筆者が持っているラズパイは初代Bと3 Bで、いずれもEthernetが100Mbpsである。なので、port forwardやVPNで重い通信を経由させるには向かない気がする(そもそも外出先の回線でそれだけの速度が出るのかという話だが)。

NAS

数十GB〜数TB級のファイルに外から、あるいはタブレット等からアクセスしたい場合、クラウドストレージは割高かもしれない。そういう場合に家にNASがあるといろいろと捗る。

(まあRAIDを組むのに同じ容量のHDDが複数台必要だったり、HDDの故障で不定期に数万円の出費が発生するんだけどね)

筆者が使っているような高機能なNASの場合は、単にファイル共有だけではなく、VPNサーバーやその他諸々が付いている。

使いたいプロトコルは、SMB(等のファイル共有)、VPN、などとなる。

デスクトップ機(Windows)

筆者宅にはWindowsの自作デスクトップ機(「デスクトップ」とは名ばかりで、実際には足下に設置されている)がある。外出先からこのデスクトップ機を操作できると便利かもしれない。

Windowsを遠隔で制御するためのプロトコルといったら、やはりリモートデスクトップだろう。(一部の低機能版Windowsはリモートデスクトップを受け付ける側にできないらしいが、筆者はプロなので関係ない)

その他、適当なSSHサーバーを動かすこともできる。(この際、ログイン先のシェルの候補としてはcmd.exe、PowerShell、MSYS2のbash、WSLのbashなどが考えられるが、実際どれが良いのだろうか?)

方針

IPv4でのアクセス

自宅の回線でIPoEを使ってIPv4インターネットに接続する場合は、グローバルなIPv4アドレスが割り当てられない。よって、IPv4インターネットから自宅へは直接アクセスすることができないということになる。

ネットワーク環境をいじってIPv4 PPPoEをセットアップすればグローバルなIPv4アドレスがもらえるかもしれないが、面倒そう(筆者の知識がない)なのですぐに使える方法ではない。

IPv6でのアクセス

自宅の機器にはグローバルなIPv6アドレスが割り当てられているので、そのアドレスがわかればIPv6インターネット経由で普通に接続できる。もちろん、ルーターの側でパケットフィルターの設定をいじる必要がある。

どうやって自宅の機器のグローバルIPv6アドレスを知るかという問題だが、

  • DDNSを使う
  • IPv6アドレスは半固定であり、どうせ滅多に変更されないので、変更された場合に手動で設定し直す

という方法が考えられる。後者の場合は、SSHなら .ssh/config を設定しておけばいちいちアドレスを直打ちしなくて済む。筆者は今の所後者を採用している(DDNSは使っていない)。

外出先でIPv6が使えるかという問題だが、最近のモバイル回線(LTE/5G)は普通にIPv6が使える。また、筆者の実家のフレッツ回線ではいつの間にか普通にIPv6が使えるようになっていた。よって、「外出先でモバイルルーターを使う」や「帰省中に実家から東京の自宅にアクセスする」という状況なら問題ない。

問題となる状況(外出先でIPv6が使えない状況)というのは、筆者の生活の場合はカフェやファミレスの公衆無線LANを使う場合だ。大学等のネットワークもIPv6が使えない可能性があるが、筆者はもう卒業してしまったので関係ない。

IPv6 over IPv4

IPoEではIPv6のネットワークを介してIPv4のパケットをやり取りするIPv4 over IPv6の技術を使うが、これの逆、IPv4のネットワークを介してIPv6のパケットをやり取りすることをIPv6 over IPv4という。具体的なIPv6 over IPv4の技術としてはTeredoや6to4というのがあるらしい。

ただ、IPv6が既にある程度普及してしまったせいか、IPv6 over IPv4の情報はググってもあまり出てこない。Macでは標準で6to4が使えるようだが、軽く調べた感じではこれは端末(Mac)の側にグローバルIPv4アドレスが割り当てられていないと使えないような感じなので、公衆無線LANでは使えなさそうだ。WindowsならTeredoというやつが使えるかもしれないが、筆者はWindowsのモバイル機を持ち合わせていない。

踏み台を使う

IPv6 over IPv4と似た話だが、SSHアクセスできてIPv4/IPv6の両方が使えるサーバーがあれば、それを踏み台にしてアクセスすることができる。

自宅にはグローバルIPv4アドレスは降ってこない前提なので、この踏み台サーバーはその辺のVPSやレンタルサーバーを使うことになる。

QNAP NASの場合

筆者が使っているQNAP NAS特有の事情もいくつか書いておく。

QNAPのDDNS

QNAPのNASを買うと <NASの名前>.myqnapcloud.com にDDNSを設定できる。

IPoEな環境で使うと、IPv6の方(AAAAレコード)にはNAS自身のグローバルIPv6アドレスが設定されるが、IPv4の方(Aレコード)にはVNEかどこかでIPv4インターネットに接続している地点のアドレスが設定されるようだ。

myQNAPcloud Link

QNAPはDDNS以外にも、踏み台となるサーバーを用意してくれている。QNAPを信用できるなら、これを使って https://qlink.to/<NASの名前> というURLで自宅のファイルにアクセスできる。

これを使うとIPv4の公衆無線LANからIPv6の自宅NASのファイルに簡単にアクセスできるわけだが、その際にデータがQNAPのサーバーを中継することになる。そのため「QNAPを信用できるなら」という条件がつく。

VPN

QNAPのNASはVPNのプロトコルとしてPPTP, OpenVPN, L2TP/IPsecのそれぞれに対応している(この辺は以前の記事にも書いた)。

PPTPはセキュアじゃないらしいので使わないとして、OpenVPNかL2TP/IPsecという話になる。両方試してみたが、筆者の環境はどちらもうまくいかなかった(具体的にどううまくいかなかったのかは忘れたが、 <NASの名前>.myqnapcloud.com にIPv4で接続しようとして失敗する事例があった)。

まとめ

その辺の公衆無線LANで普通にIPv6が使えるようになってほしい。