PFを使用したアドレス変換の例
仕事で必要になりそうなんで、予備実験の後ちょびっと書いてみた備忘録
要件
- 異なるネットワークに属するホストA、ホストB間で通信したい。
- 通信は両方のネットワークに接続されたゲートウェイで中継する。
- ホストA、ホストBのルーティング設定などをいじりたくないため;
- Host Aは同一ネットワーク内に属するゲートウェイのL側(下図参照)と通信しているように見せかけたい。
- 同様に、Host BからはゲートウェイのR側と通信しているように見せかけ、実際にはHost Aと通信するようにしたい。
- 使用プロトコルはHTTP及びFTPを想定。
- Host A及びBではproxyの存在などを意識せず、透過的に通信できるようにしたい。
- プロトコルとして、アクティブモードのFTPを使用することが予想される。
- そのため、Host A, Host BのどちらからでもTCPのセッションを開始できるようにする必要がある。
システム構成
下図のとおり
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とする。
ソリューション
実行結果
- HTTPに関しては、問題なく実行できた
- FTPは、ログインまでは可能であったが、ディレクトリの一覧やファイルの送受信は不能。
- FTPではデータコネクションを張るときにPORTコマンドを相手に送るが、このパラメータに生のIPアドレスが含まれているため、それに対して直接接続を張ろうとする。このため、うまく行かない
→ FTPに関してだけは ftp-proxy(8)を使用する必要がある。
感想とか
- PFでは、フィルタリングルールはlast matchだが、nat ruleはfirst matchらしい
- FTPマンドクセ