*PFを使用したアドレス変換の例 [#b37f2bd1]
仕事で必要になりそうなんで、予備実験の後ちょびっと書いてみた備忘録
**要件 [#jbb214ed]
-異なるネットワークに属するホストA、ホストB間で通信したい。
-通信は両方のネットワークに接続されたゲートウェイで中継する。
-ホストA、ホストBのルーティング設定などをいじりたくないため;
--Host Aは同一ネットワーク内に属するゲートウェイのL側(下図参照)と通信しているように見せかけたい。
--同様に、Host BからはゲートウェイのR側と通信しているように見せかけ、実際にはHost Aと通信するようにしたい。
-使用プロトコルはHTTP及びFTPを想定。
--Host A及びBではproxyの存在などを意識せず、透過的に通信できるようにしたい。
-プロトコルとして、アクティブモードのFTPを使用することが予想される。
--そのため、Host A, Host BのどちらからでもTCPのセッションを開始できるようにする必要がある。
**システム構成 [#a831289f]
下図のとおり
    addr_A                    addr_B
 +------+        +-------+        +------+
 |Host A|------->|GateWay|------->|Host B|
 |      |<-------|       |<-------|      |
 +------+        +-------+        +------+
              if_L    if_R
            addr_L  addr_R
 
            ネットワーク構成図
(表記)
-Host A, Host BのIPアドレスをそれぞれ、addr_A, addr_Bとする
-GatewayのHost A側のネットワークインターフェース名をif_L、そのIPアドレスをaddr_L。
同様に、Host B側のネットワークインターフェース名をif_R、そのIPアドレスをaddr_Rとする。
**ソリューション [#eb93ba23]
-A->B方向の変換
--始点 addr_A, 終点 addr_L のパケットを if_L にて Host Bに向けなおす。/etc/pf.confの記述行は以下のようになる;
 rdr pass on if_L from addr_A to addr_L -> addr_B
''pass''は、フィルタリングルールをバイパスするための指定
--rdrによって向け直されたパケットは始点アドレスがaddr_Aのままなので、
Host Bからの復路のパケットの終点アドレスがaddr_Aとなり、このままでは戻りパケットがHost Aに到達しない。~
よって往路のパケットがif_Rを通過する時に、始点アドレスを書き換える。
 binat pass on if_R from addr_A to addr_B -> if_R
binatを使用するのは、アドレス変換に伴いポートが変ってしまわないための意味もある。

-B->A方向の変換
--B->A方向にもセッションを張れるようにするためには、
A->Bで挙げた例と対称な記述を付け加える。
 rdr pass on if_R from addr_B to addr_R -> addr_A
 binat pass on if_L from addr_B to addr_A -> if_L
**実行結果 [#b58ffbbe]
-HTTPに関しては、問題なく実行できた
-FTPは、ログインまでは可能であったが、ディレクトリの一覧やファイルの送受信は不能。
--FTPではデータコネクションを張るときにPORTコマンドを相手に送るが、このパラメータに生のIPアドレスが含まれているため、それに対して直接接続を張ろうとする。このため、うまく行かない~
→ FTPに関してだけは ftp-proxy(8)を使用する必要がある。
**感想 [#nfc5ac4c]
FTPマンドクセ
**感想とか [#nfc5ac4c]
-PFでは、フィルタリングルールはlast matchだが、nat ruleはfirst matchらしい
-FTPマンドクセ

Front page   Edit Diff History Attach Copy Rename Reload   New Page list Search Recent changes   Help   RSS of recent changes