サーバの負荷分散作業にともない、
いままで面倒で避けていたiptablesによるポートフォワーディングを勉強せざるを得なくなって、とりあえず忘れないようにメモ。
構成は以下のとおり。
[vyattaルータ] (192.168.10.1) | ― | [Webサーバ] eth0 – eth1 (192.168.10.2) – (192.168.50.1) | ― | [DBサーバ] (192.168.50.2) |
| | ||||
[専用処理サーバ] (192.168.10.3) |
Webサーバと専用処理サーバは、ルータで同じネットワーク内で繋がっています。
ですが、WebサーバとDBサーバはクロスケーブルで直に繋がっているというちょっと面倒くさい構成です。
この時、専用処理サーバからDBサーバのMySQLにアクセスしたい場合の設定です。
Webサーバにポート4649でアクセスしてきたら、そのパケットをDBサーバにポート3306に変換して受け流すという風にしました。
この際に大事、というか煮詰ってしまったのが「DNAT」と「SNAT」の2点。
DNATが送信先のIPアドレスを変換する処理で、
SNATが送信元のIPアドレスを変換する処理のこと。
今回の場合で言えば、
専用処理サーバはwebサーバにポート4649でアクセスするので、
送信先IPは192.168.10.2で、送信元IPは192.168.10.3、ポートは4649となる。
このパケットをWebサーバ内のiptablesで、
送信先IPを192.168.50.2にしてポートを3306に(1)、
送信元IPを192.168.50.1に変換(2)してやればいいわけです。
上の(1)がDNAT、(2)がSNATにあたります。
この通りの動作をさせるための設定がこんな感じです。
#■ ポートフォワーディング設定
#DNAT
iptables -t nat -A PREROUTING -p tcp --dst 192.168.10.2 --dport 4649 -j DNAT --to-destination 192.168.50.2:3306
#SNAT
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.50.2 --dport 3306 -j SNAT --to-source 192.168.50.1
PREROUTINGは、パケットがサーバに入ってきた時に実行されるタイミングという意味で、
POSTROUTINGは、パケットがサーバから出て行く時に実行されるタイミング、と考えておけばおk。