cBlog

Tips for you.

IPv4 over IPv6 (MAP-E)でポート開放して外出先から自宅のMacにSSH

スポンサーリンク

タイトルのことをやってみました。よく知りませんが、DS-Lite(transix)の場合はMAP-E(v6プラス、IPv6オプション、OCNバーチャルコネクト)に比べて困難です。

 

自宅のグローバルIPアドレスを知る

IPアドレスを知るために、ifconfig.coというWebサービスを使うことにします。curlで叩くとグローバルIPアドレスを返してくれます。

curl ifconfig.co

一般にIPアドレスが固定とは言えないので、自宅のMacのlaunchdを使い、定期的にIPアドレスを取得してiCloud Driveで確認できるようにしておきます。

ip_to_icloud(.sh)

#!/bin/bash

OUT="/Users/user/Library/Mobile Documents/com~apple~CloudDocs/ip address.txt"

rm -f "${OUT}"
curl -4 ifconfig.co >"${OUT}"

こんな感じのスクリプトを(とりあえず)1時間に1回実行するようにします。iCloud Driveはすぐに更新が反映されないのでrmで一回消しています。

余談ですが、次期macOS CatalinaではiCloud Drive関係の実体パスが変更されるらしいので将来改修が必要ですね。

local.IPToiCloud.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>local.IPToiCloud</string>
        <key>ProgramArguments</key>
        <array>
            <string>/Users/user/launchd_scripts/ip_to_icloud</string>
        </array>
        <key>RunAtLoad</key>
 12     <true/>
        <key>StartInterval</key>
        <integer>3600</integer>
    </dict>
</plist>

このplistファイルを~/Library/LaunchAgents/に置き、以下のコマンドで登録します。

launchctl load ~/Library/LaunchAgents/local.IPToiCloud.plist

StartInterval秒経過後、iCloud Driveのルートにip address.txtが出来ているはずです。これで、いつでもどこでもiPhoneで自宅のIPアドレスが確認できます。

[追記 2021/06/05] Catalina以降でもiCloud Driveのパスは変更されなかったので記述を削除。Labelを慣習に従い逆DNS表記に変更。RunAtLoad追加により即時実行されるように変更し、記述を変更。

 

参考

qiita.com

 

ポート変換を設定する

ルーターで、自宅のIPアドレスのxxxxx番ポートとサーバ用MacのローカルIPアドレス(例:192.168.1.2)がつながるよう設定します。

MAP-Eでは、開放できるポート番号が決まっています。手計算するか、以下のサイトで調べられます。

http://ipv4.web.fc2.com/map-e.html

最近のファームウェアを搭載したバッファローのルーター(以下等)では利用可能ポート番号一覧が設定画面に表示されるので便利です。

yaritakunai.hatenablog.com

この中から利用するポート番号xxxxxを決めますが、49152番以降が自由に使用できるとされているので推奨です。

バッファローの場合、以下のような感じです。

ポート変換の設定欄

  • Internet側IPアドレス:エアステーションのInternet側IPアドレス
  • プロトコル:TCP/UDP、任意のTCPポート、xxxxx
  • LAN側IPアドレス:192.168.1.2
  • LAN側ポート:(SSHの場合、デフォルトは)22

なお、私の環境(ぷらら@ドコモ光、OCNバーチャルコネクト)では自宅のIPアドレスもポートも固定のようです。

 

SSHしてコマンドを実行する

これで外からSSHできるようになったはずです。ここではiPhoneの「ショートカット」Appでトライしてみます。

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

iPhoneからSSH経由でスクリプトを実行できるし、グラフィカルにプログラミングみたいなことができて楽しいです。

ショートカット Appでdate コマンドを実行している様子

 

方法

1. ショートカット Appを起動し、「ショートカットを作成」をタップします。

2. 検索ボックスをタップし、スクリプティング > SSH経由でスクリプトを実行と選択します。

3. 以下のように入力します。

  • ホスト:ip address.txtにあるIPアドレス
  • ポート:上で設定したxxxxx
  • ユーザ:ログインするMacのユーザ名
  • パスワード:ユーザのパスワード

4. LAN内にいる場合はWi-Fiをオフにして、スクリプト欄に適当なコマンドを入力してテスト。以下のように適宜、環境変数も設定します。

export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/user/bin
export LANG=ja_JP.UTF-8
date

(dateくらいならデフォルトのPATHで動きますが)

ホスト欄に自動でIPアドレスが読み込まれるようにするのも面白いかもしれません。その場合、ショートカット AppではiCloud Driveの「Shortcuts」フォルダしか扱えないので、ip address.txtは「Shortcuts」フォルダの実体である以下に出力されるようにする必要があるでしょう。

/Users/user/Library/Mobile Documents/iCloud~is~workflow~my~workflows/Documents/

Siriで何かさせるのも面白そうですね。