前提
- APIのテスト用サーバがEC2に立っている
- テスト用サーバなので一般公開したくない
- 固定IPがない
- DNSも設定してない
- とりあえずSSHは可能
固定IPがあるのであれば,そのIPからのHTTP/HTTPSアクセスを許可すれば用は足りるので終了.
PC(Mac)からのアクセスであれば,SSHのポートフォワードで何とかなります1.が,スマホ(とりあえずiPhone)からだと難しそうです.
というわけで,iPhoneからPC経由でテスト用サーバにアクセスする方法を探してみました.
方針
- Mac経由でアクセスするんだからリバースプロキシ立てられれば良い気がする
- IPでのアクセスだとダルいし適当な名前でアクセスしたい
設定
hosts
127.0.0.1 api-test.hoge.com
SSH
ローカルポートフォワードして,localhost:8080
でAPIサーバへアクセスできるようにしておきます.
ssh -L8080:localhost:80 ec2-user@xxx.xxx.xxx.xxx
リバースプロキシ
/etc/apache2/other/
以下に設定を作成すると勝手に読んでくれます.
ProxyPass / http://api-test.hoge.com:8080/
ProxyPassReverse / http://api-test.hoge.com:8080/
あとは
sudo apachectl restart
この時点で,同一ネットワークに存在する他のマシンから http://<<MacのIP>>
でアクセスできるようになります.
名前解決
MacのIPを10.0.1.116とします.
リバースプロキシが動いているMac上では api-test.hoge.com -> 127.0.0.1 に解決されれば良いですが,他のマシンにおいては api-test.hoge.com -> 10.0.1.116 と解決されてほしいです.
そこで,dnsmasqを使います.(homebrewでインストールされたものとする)
address=/hoge.com/10.0.1.116
no-hosts
no-hosts
の設定を入れないと/etc/hosts
を見てしまうようです.
Mac上で確認
uraura@L-03-001$ dig @localhost api-test.hoge.com
; <<>> DiG 9.8.3-P1 <<>> @localhost api-test.hoge.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28564
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;api-test.hoge.com. IN A
;; ANSWER SECTION:
api-test.hoge.com. 0 IN A 10.0.1.116
;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sat Nov 28 10:18:24 2015
;; MSG SIZE rcvd: 51
別のマシンから確認
uraura@rosemary$ dig @10.0.1.116 api-test.hoge.com
; <<>> DiG 9.8.3-P1 <<>> @10.0.1.116 api-test.hoge.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22754
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;api-test.hoge.com. IN A
;; ANSWER SECTION:
api-test.hoge.com. 0 IN A 10.0.1.116
;; Query time: 24 msec
;; SERVER: 10.0.1.116#53(10.0.1.116)
;; WHEN: Sat Nov 28 10:21:10 2015
;; MSG SIZE rcvd: 51
これで同一ネットワーク上のiPhoneからでもapi-test.hoge.comでアクセス可能になってるはずです.
iPhoneから接続
iPhoneのブラウザから http://api-test.hoge.com へアクセスしてみます.

(´・ω・`)
ネームサーバの指定を忘れてました.というわけで,Wifiの設定からDNSの設定を追加

- ローカルポートフォワードの場合はポート番号が余計に必要になる
- ダイナミックポートフォワードの場合はsocksプロキシの設定が必要になる
-
ただし,以下の追加設定が必要 ↩