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
を採用する必要がある。