古いホスト宛てのすべてのトラフィックを新しいホストにリダイレクトするにはどうすればよいでしょうか?

古いホスト宛てのすべてのトラフィックを新しいホストにリダイレクトするにはどうすればよいでしょうか?

多数のサービス1.2.3.4を からに移行します5.6.7.8

新しいサービスが正しく構成されていることをテストするために、テスト ワークステーションから発信され、元のホスト宛てのすべてのトラフィックを (新しいホストに) リダイレクトします。

もちろん、そのようなリダイレクトはできたネットワーク自体内のルーターに実装することもできますが、安定性の理由から、各ワークステーションに直接実装することにしました (すべて OS X 10.10 Yosemite なので、v4.7 より前の OpenBSD pf を使用します)。

追加しました/etc/pf.anchors/com.apple:

rdr-anchor "910.TestServiceMove/*"
anchor "910.TestServiceMove/*"
load anchor "910.TestServiceMove" from "/etc/pf.anchors/910.TestServiceMove"

そして作成しました/etc/pf.anchors/910.TestServiceMove:

rdr pass log on lo0 from any to 1.2.3.4 -> 5.6.7.8
pass out log route-to lo0 from any to 1.2.3.4 keep state

ルールがロードされると、両方とも正しく動作するように見えます。

$ sudo tcpdump -v -n -e -ttt -i pflog0
tcpdump: 警告: pflog0: IPv4 アドレスが割り当てられていません
tcpdump: pflog0 をリッスン、リンク タイプ PFLOG (OpenBSD pflog ファイル)、キャプチャ サイズ 65535 バイト
00:00:00.000000 ルール 0.910.TestServiceMove.0/0(一致): en1 で渡される: (tos 0x0、ttl 64、id 40691、オフセット 0、フラグ [DF]、プロトコル TCP (6)、長さ 64)
    9.9.9.9.58029 > 1.2.3.4.22: フラグ [S]、cksum 0x291a (正しい)、seq 3399416413、win 65535、オプション [mss 1460、nop、wscale 5、nop、nop、TS val 2063366865 ecr 0、sackOK、eol]、長さ 0
00:00:00.000047 ルール 0/0(一致): lo0 の rdr in: (tos 0x0、ttl 64、id 40691、オフセット 0、フラグ [DF]、プロトコル TCP (6)、長さ 64、不正な cksum 896a (->b4da)!)
    9.9.9.9.58029 > 5.6.7.8.22: フラグ [S]、cksum 0xb284 (正しい)、seq 3399416413、win 65535、オプション [mss 1460、nop、wscale 5、nop、nop、TS val 2063366865 ecr 0、sackOK、eol]、長さ 0

しかし、TCP ハンドシェイクは完了しません (SYN-ACK は無視され、接続がタイムアウトするまで SYN が繰り返し送信されます)。

$ sudo tcpdump -v -n -e -ttt ホスト 5.6.7.8
tcpdump: データリンクタイプ PKTAP
tcpdump: pktap をリッスン、リンク タイプ PKTAP (パケット タップ)、キャプチャ サイズ 65535 バイト
00:00:00.000000 e8:80:2e:e7:67:bc > 84:80:2d:35:e5:43、イーサタイプ IPv4 (0x0800)、長さ 78: (tos 0x0、ttl 63、id 40691、オフセット 0、フラグ [DF]、プロトコル TCP (6)、長さ 64)
    9.9.9.9.58029 > 5.6.7.8.22: フラグ [S]、cksum 0xb284 (正しい)、seq 3399416413、win 65535、オプション [mss 1460、nop、wscale 5、nop、nop、TS val 2063366865 ecr 0、sackOK、eol]、長さ 0
00:00:00.015524 84:80:2d:35:e5:43 > e8:80:2e:e7:67:bc、イーサタイプ IPv4 (0x0800)、長さ 74: (tos 0x0、ttl 52、id 0、オフセット 0、フラグ [DF]、プロトコル TCP (6)、長さ 60)
    5.6.7.8.22 > 9.9.9.9.58029: フラグ [S.]、cksum 0x7ce4 (正しい)、seq 1901846890、ack 3399416414、win 14480、オプション [mss 1460、sackOK、TS val 523934721 ecr 2063366865、nop、wscale 7]、長さ 0
00:00:00.986946 e8:80:2e:e7:67:bc > 84:80:2d:35:e5:43、イーサタイプ IPv4 (0x0800)、長さ 78: (tos 0x0、ttl 63、id 25319、オフセット 0、フラグ [DF]、プロトコル TCP (6)、長さ 64)
    9.9.9.9.58029 > 5.6.7.8.22: フラグ [S]、cksum 0xae9c (正しい)、seq 3399416413、win 65535、オプション [mss 1460、nop、wscale 5、nop、nop、TS val 2063367865 ecr 0、sackOK、eol]、長さ 0
00:00:00.014938 84:80:2d:35:e5:43 > e8:80:2e:e7:67:bc、イーサタイプ IPv4 (0x0800)、長さ 74: (tos 0x0、ttl 52、id 0、オフセット 0、フラグ [DF]、プロトコル TCP (6)、長さ 60)
    5.6.7.8.22 > 9.9.9.9.58029: フラグ [S.]、cksum 0x78fa (正しい)、seq 1901846890、ack 3399416414、win 14480、オプション [mss 1460、sackOK、TS val 523935723 ecr 2063366865、nop、wscale 7]、長さ 0
00:00:00.397794 84:80:2d:35:e5:43 > e8:80:2e:e7:67:bc、イーサタイプ IPv4 (0x0800)、長さ 74: (tos 0x0、ttl 52、id 0、オフセット 0、フラグ [DF]、プロトコル TCP (6)、長さ 60)
    5.6.7.8.22 > 9.9.9.9.58029: フラグ [S.]、cksum 0x776c (正しい)、seq 1901846890、ack 3399416414、win 14480、オプション [mss 1460、sackOK、TS val 523936121 ecr 2063366865、nop、wscale 7]、長さ 0
00:00:00.588237 e8:80:2e:e7:67:bc > 84:80:2d:35:e5:43、イーサタイプ IPv4 (0x0800)、長さ 78: (tos 0x0、ttl 63、id 50201、オフセット 0、フラグ [DF]、プロトコル TCP (6)、長さ 64)
    9.9.9.9.58029 > 5.6.7.8.22: フラグ [S]、cksum 0xaab4 (正しい)、seq 3399416413、win 65535、オプション [mss 1460、nop、wscale 5、nop、nop、TS val 2063368865 ecr 0、sackOK、eol]、長さ 0

TCPスタックはSYNが送信されたホスト以外のホストから発信されたSYN-ACKを破棄していると思います。しかし、リダイレクトルールはトラフィックを書き換えるべきではないでしょうか?両方指示—実際、keep stateこの目的のために接続が追跡されるようにすべきではないでしょうか?

関連情報