Macminiサーバーの画面共有のためにグローバルIPを擬似的に固定する(DDNS)

Mac miniサーバー運用していると外出先から遠隔操作する場面もたまにあって、そういう時は5900番のポートを解放しておいてVNCアプリからグローバルIPにアクセスするスタイルを取っている。
ただこのグローバルIPが結構曲者で、業務用回線でオプションつけたりしない限りは不定期でコロコロ変わる。気付いたらいつものIPでアクセス出来ないみたいなことが頻繁にあるので、iPhoneのショートカットで毎朝グローバルIPをチェックするのはほぼ必須みたいな感じに。

とはいえサーバーMacminiの環境なら比較的容易に解決可能で、固定されたアドレスに接続するだけで確実に遠隔操作可能な状態までは持って行けた。今回はその方法を残しておく記事。
方法論だけ知りたければ基礎知識はスルーしてよし。(たぶんね)

さっくり基礎知識

仕組みを理解して構築するには、ネットワーク関係の知識が多少必要。とはいえわたしもそれほど知っているわけではないので、必要最低限の単語を軽めに述べておくにとどめる。

ネットワークの構成

自宅にあるMacminiを外出先から遠隔で操作する時、接続する端末から「アドレス」「ポート」を指定して接続する。
この過程には「ローカルネットワーク(LAN)・ローカルIP」「グローバルネットワーク(LAN外)・グローバルIP」といった要素が絡んでくる。それらの関係性を表した簡易的な図が下記。

フリーボードはこういう図を簡単に書けるので便利

グローバルIPは家の住所、ローカルIPは部屋番号と解釈すると分かりやすい。
ポートは役職/役割に振られた番号。今回は画面共有で、Macの画面共有は5900番。
家の中(LAN内)であれば部屋番号(ローカルIP)だけで識別できるため、「192.168.0.2で画面共有」とすればMacminiに繋がる。しかし外出先からだと、「どこの家の192.168.0.2の部屋なのか分からない」ためアクセス出来ない(厳密には現在いるネットワーク内のそのIPにアクセスしようとするため、少なくとも自宅のMacminiは見つけられない)

ポート開放は外出先からアクセスするときのため、その家での役割を果たす部屋を定めること。今回の場合Macminiが画面共有をするので、Macmini(図だと192.168.0.2)の5900番ポートを開放する。
これで家の住所(グローバルIP)に向かって画面共有(5900番ポート)へアクセスすることで、外出先からMacminiへと画面共有で繋がるようになる。外の人間に部屋番言わせようとしてもなんのこっちゃなので、分かりやすく「この家で画面共有してる部屋」で伝わるようにしなきゃいけない(=ポート開放が必要)。
そしてこの「外から来たアクセスに対して適切な部屋を案内する」という門番のような役割は、全てルーターが担う。よってポート開放にはルーター側の設定が必要、ということになる。

自宅内(=LAN内)からアクセスするなら、ルーターが割り振ったローカルIPアドレスを使えば解決する。しかし外出先(=LAN外)からのアクセスには、プロバイダが勝手に割り振り勝手に変更してしまうグローバルIPアドレスを用いる必要がある。
そしてグローバルIPアドレスに頼っていると、ふとした時にアドレスが変わってアクセス出来なくなる恐れがあるという話。プロバイダがその家の住所コロコロ変えやがるから、住所決め打ちしてるとちょくちょく転居していつの間にかいなくなってるんですわ。

DDNSとは

一旦DNSについての詳細説明はなしで(大して知らんし)。
DDNSはDynamic DNSの略で、今回の用途で言うなら「定期的に住所を教えておく相手」といったところ。役所?

DDNSは無料で簡単に取得できるので、自宅のサーバー機から取得したDDNSに定期的にグローバルIPアドレスを教えるよう設定すればOK。DDNSすら自前で構築する人もいるけど、大体はそこまで必要ない。
DDNSには固有のアドレス=住所がありこれは変動しないので、あとはDDNSのアドレスに対して接続すれば自動で現在のグローバルIPアドレスへと接続できる。
要するに自動で転居届出させれば、役所の住所教えておいて役所に聞きに行かせることで確実に今の住所が分かる=固定のアドレスに接続するだけで確実に繋がるというわけ。

手順

↑に書いたことから必要なものは、

  • DDNSサービス
  • DDNSにグローバルIPを通知する環境

のふたつ。後者は基本的にサーバー稼働中のMacminiの中に用意出来、通知する方法はDDNSサービスによって異なる。

今回はDDNS Nowを使用。検索で一番上にヒットしたので。

1:DDNSサービスの登録

登録自体はめちゃ簡単。接続先アドレスとして使いたい文字列を打って、パスワードを設定すれば終わり。

ログインするとホスト名・ユーザー名が確認できるほか、IPアドレスを直接通知することもできる。
ただそんなことしていては意味がないので、自宅のMacminiから自動通知してくれるように設定しておく。

2:DDNSへのIPアドレスの通知設定

マニュアルにあるうち、今回はcronを用いて設定する。
cronはLinux版タスクスケジューラみたいなもので、実はmacOSでも標準で使用可能。ただしApple的にはlaunchd推奨とのこと。
こういったLinuxの手法が割と通用するのは地味にmacOSの利点。

cron自体は標準で常時稼働しているので、cronの実行タスクに追記することになる。
そのままではログの記録が出来ず動かないので、cronにフルディスクアクセス権が必要。

cronの準備

システム設定→プライバシーとセキュリティ→フルディスクアクセス、左下の+を押すとファイル選択画面が出るのでCmd+Shift+G。
ファイルパスを直接入力できるようになるので、cronの実体がある「/usr/sbin/cron」を指定してReturn。

自動でcronが選択されるので、そのまま開けばOK。これでcronにフルディスクアクセスの権限が付与される。

また今回実行させる処理はwgetコマンドを使用するので、これも忘れず入れておく。
どうせ入ってるやろと進めると意外と入ってなくて後で泣きます(1敗)。
Homebrewで簡単にインストール出来るので、ターミナル入って「brew install wget」でOK。そもそもHomebrewが入ってないなら、先に公式のコマンドをターミナルにぽんしておく。

crontabで設定

あとはDDNS Nowのマニュアルに書いてある通り。

cronの設定ファイルを開くとvimと呼ばれるコマンド版テキストエディットみたいなのが開くけど、ふつーにコピペも使えるし難しくはないはず。今回はIPv6は触っていないので、真ん中の文面だけ設定すればOK。
テキストエディット辺りでユーザ名とパスワード書き込んでvimにコピペ、Escを押すと入力モードから抜けるので、その状態で「:wq」と入力してReturn。:wqは上書き保存して終了の意(保存せず終了は:q)。
保存したらもう勝手にぐるぐる実行されるようになる。試しに2分くらい待ってからDDNS Nowにログインすると反映されているのが分かるはず。

ちなみに「0-59 * * * *」で繰り返すタイミングを指定する、*は指定なし。
合計5つのパラメータで、左から順に分・時・日・月・曜日の意味。今回は0-59分でそのほかの指定なし(=1分ごと)。リモート操作程度の運用であれば1時間おきとかにしても特に困らないかもしれない。HTTPサーバーとかだと1分にしておかないと流石にやばいかも。

そしてVPNへ

DDNSを設定しておくと、VPN環境にも手を伸ばせるようになる。MacminiをVPNサーバーとして動かしておけば、外出先からLANに自在に入り込めるようになるので出来ることが増える。

DDNSだけを用いたリモートアクセスと違い、VPNはLANに入り込むのでIPアドレス等の見え方もLAN内にいる時と同じになる。そのため画面共有の設定を自宅用外出用と2パターン用意する必要がなくなったりして快適(だと思うだけ)。

ただmacOS内蔵のVPNサーバーであるvpndはなんか使えなくなってるみたいで、現状ではラズパイ等Linux用の手法を転用するのが無難だと思われる。SoftEther辺りは非推奨ながらmacOSにも対応しているとのことなので、一通り調べ終わったら適当に試してみる予定。

カテゴリー: Apple, Mac, ガジェット タグ: パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です