はじめに
ふとしたことで自宅サーバの特定ポートをさくらVPS経由で公開したい衝動に駆られたので、iptablesで設定してみました。
前提環境
さくらVPS側:Ubuntu16.04(カスタムOS)
自宅サーバ側:debian9(Stretch)
※双方のサーバはVPNで接続されています。
参考サイト
Kerosoft:Modus Operandi『iptablesで特定のポートを別のホストへ転送する方法』
Linux Advanced Routing & Traffic Control HOWTO『MSS クランプによって Path MTU Discovery 問題を回避する』
iptables.rulesの編集
NATテーブル
/etc/iptables/iptables.rules
*nat
# 外からの特定ポートのパケットを自宅サーバに転送
-A PREROUTING -m tcp -p tcp --dst [公開しているIP] --dport [ポート番号] -j DNAT --to-destination [自宅サーバのIP]:[ポート番号]
# 自宅サーバ宛パケットの送信元アドレスをさくらVPSのVPN側IPに付け替える。
-A POSTROUTING -m tcp -p tcp --dst [自宅サーバのIP] --dport [ポート番号] -j SNAT --to-source [さくらVPSのVPN側IP]
COMMIT
FILTERテーブル
指定したポートのみ許可しているため、転送するポートの通信を許可する設定をFILTERテーブルに追加する必要がある。
/etc/iptables/iptables.rules
*filter
# NATのPREROUTINGを通って変換されたアドレスに対して許可
-A FORWARD -m tcp -p tcp --dst [自宅サーバのIP] --dport [ポート番号] -j ACCEPT
# 戻りのパケットも許可する。(TCPのフラグで判断)
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# MTUが違うネットワーク間の適切なMSSを計算する(念のため)
-A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
設定反映
iptables.rulesの編集が終わったら、設定を反映させる。
# iptables-restore < /etc/iptables/iptables.rules