B3S
menu close

サーバー関連

サーバーの内部だけで公開しているサービスへの、ポートを用いた転送と、サブドメインを用いた転送方法


はち

更新日:2021/08/11


こんにちは。最近PokemonGOばっかりやってる、はちです。
図鑑がやっと105種類埋まりました。まだまだ遠いですが全部集めるまでは頑張ります。
別に今日が8月8日だから投稿したわけではありません。

今回はPokemonGOの調べ物をしていた時に、ふと見た質問から。

◆動作環境
OS:Ubuntu 14.04LTS

特定ポートへのアクセスをローカルアドレスに転送したい

例えば、www.alt-plus.jp:9999へのアクセスを、サーバー上のみ公開している127.0.0.1:3000へ転送する方法です。

基本的にローカル環境のみで動くパッケージを外部に公開するときには、iptablesのポート転送を使うことで擬似的に公開することが出来ます。

#ethI/Fの転送設定をONにする
sudo sysctl -w net.ipv4.conf.eth0.route_localnet=1

#9999番へのアクセスを許可して、内部転送する
sudo iptables -A INPUT -i eth0 -p tcp --dport 9999 -j ACCEPT
sudo iptables -t nat -A PREROUTING -p tcp --dport 9999 -j DNAT --to-destination 127.0.0.1:3000



PREROUTING は入ってきたパケットを変換するルールです。
ちなみにですが、–to-destinationではなく、REDIRECTでも多分大丈夫です。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000



ポートへのアクセスの転送は比較的簡単です。
ただUFWなんかを使っていてiptablesの細かい設定をしていないと、設定が干渉しあったりする部分がある(優先の問題など)ので注意してください。私はこれでハマりました。

サブドメインへのアクセスをローカルアドレスに転送したい

ポート番号を開示するのは怖いので、サブドメイン「sub.alt-plu.jp」を切って、サブドメインへのアクセスが有った場合に、先ほどのローカルアドレスに転送する方法です。

これは1番手っ取り早いのは、Apacheやnginxのリバースプロキシを使うことです。

/etc/apache2/sites-available の中にサブドメイン設定用のファイルを作っておきます。
(例:sub.alt-plus.jp.conf)

<VirtualHost *:80>
	ServerName sub.alt-plus.jp
	ServerAdmin webmaster@sub.alt-plus.jp
	#DocumentRoot /var/www/sub.alt-plus.jp/
	ErrorLog /var/log/apache2/error.log
	CustomLog /var/log/apache2/access.log combined
	LogLevel warn
	ProxyRequests Off
	#ProxyPass /nonproxy !
	ProxyPass / http://localhost:3000/
	ProxyPassReverse / http://localhost:3000/
</VirtualHost>



これで、サブドメインへアクセスが有った時に、ポート3000番で内部公開しているサービスへ転送できます。

DocumentRootと、ProxyPassの部分はコメントアウトしていますが、コメントアウトを外すことで、そのディレクトリへのアクセスは、リバースプロキシの転送を回避して直接アクセスできるようになります。

つまり、「sub.alt-plus.jp/nonproxy/」へアクセスした場合は、ポート3000で内部公開しているサービスへは飛ばず、/var/www/sub.alt-plus.jp/nonproxy フォルダで公開しているページヘ飛びます。

こっちのほうがスマートで良いと思うんですが、DNSの設定やApacheの設定をしないといけないというのを考えるとテスト段階などはポート転送、サービスのカットオーバーなどはサブドメイン転送、など使い分けるのが良いかもしれませんね:)

おすすめ

いつぞやかの記事でも書いたのですが、Apahceに関する細かい設定や対策などは、この書籍を参考にしております。
これからApacheのことを勉強しようと思っている方も1度是非。