이전 호스트로 향하는 모든 트래픽을 새 호스트로 어떻게 리디렉션할 수 있습니까?

이전 호스트로 향하는 모든 트래픽을 새 호스트로 어떻게 리디렉션할 수 있습니까?

우리는 여러 서비스를 에서 으로 이전하고 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], proto 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 입력: (tos 0x0, ttl 64, id 40691, 오프셋 0, 플래그 [DF], proto 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(Packet Tap), 캡처 크기 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], proto 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], proto 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 ,아니,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], proto 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], proto 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 ,아니,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], proto 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 206336686 5,아니요,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], proto 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이 목적을 위해 연결이 추적되는지 확인하면 안 됩니까?

관련 정보