port番号を変える理由

MySQL等、内部通信しか許可していないが、オフィスからはグローバル経由で接続したいとする。念のためport番号をデフォルトから変更することでできるだけMySQLがそのサーバで動作していることを同オフィス内の他者に知られないようにしたい。

port番号をデフォルトから変更することでnmap -sT IPアドレスでスキャンしたときにMySQLが検知されない。またportを変えているのでランダムに3306 portへMySQL接続を試されることもない。

単純にMySQLのport番号をmy.cnfで変更するだけだと、内部通信側も影響を受けてしまうため、プロセス自体は3306で動かし続け、内部通信はそれに接続する。

これを実現するために、iptablesでportをDNATする設定方法について書く。

DNATでグローバルIPからプライベートIPに転送する

リクエストを受けるとPREROUTINGで処理され、他のサーバに転送されないのであればINPUTチェインに移る。DNATやREDIRECTを使うと、変換された後のIPとportでINPUTルールが評価される。

そのため3306をINPUTで許可する必要がある。

3306を許可してしまうとそのまま接続できてしまうので、今回のportを変えて開放したいという要件に合わない。3306自体は外部から接続できないようにする必要がある。

これを実現するために、DNATでグローバルIPからプライベートIPに転送することで、INPUTで-d プライベートIP -s オフィスIP限定で3306を許可する。

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
略
# 3306はdestinationがプライベートIPであれば許可
-A INPUT -d プライベートIP -s オフィスIP -m multiport -p tcp --dports 3306 -j ACCEPT
略
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# global-ip:13306 -> private-ip:3306
-A PREROUTING -p tcp --dport 13306 -j DNAT --to-destination プライベートIP:3306
COMMIT

外部からのdestinationがプライベートIPというのは本来ありえないので、このINPUTルールはPREROUTINGでDNATされたときだけしか合致しない。

ちなみにDNATではなくREDIRECTではportの変更だけでグローバルIPからプライベートIPへの転送ができず、INPUTルールで上記の特殊な条件付けができないため、DNATを採用する必要がある。