포트 8001에서 수신된 패킷의 복사본을 포트 8002로 가져올 수 있어야 합니다. 다음을 시도했지만 --tee 정의되지 않은 오류가 발생합니다.
sudo iptables -t nat -A PREROUTING -p TCP -s 127.0.0.1 --sport 8001 -j DNAT --to-destination 127.0.0.1:8002 --tee
답변1
더 나아가갈렙iptables
답변, 더 이상 대상이 없는 최신 버전(v1.4.14)을 사용하는 경우 ROUTE
Debian Wheezy*에서 테스트한 다음과 같은 것이 필요합니다:
iptables -A PREROUTING -t mangle -p tcp ! -s 127.0.0.1 --dport 8001 -j TEE --gateway 127.0.0.1
iptables -A OUTPUT -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002
"netcat"( )을 사용하여 man nc
테스트합니다 . 터미널 창에 다음을 입력하고 키를 누릅니다 Enter
.
nc -l 8002
이 명령은 두 번째 터미널 창에 입력한 입력을 기다립니다.
두 번째 터미널 창에 다음을 입력하고 다음을 Enter
누릅니다 .
nc 127.0.0.1 8001
명령은 추가 입력을 기다립니다. 아무거나 입력하고 Enter
키를 누르세요. 두 번째 터미널 창에서 키를 누른 후 Enter
두 번째 터미널 창에 입력한 텍스트가 첫 번째 터미널 창에 나타나야 합니다. Ctrl
세션을 종료하려면 두 번째 창에서 -c를 누르세요 .
*이 구문은아니요RHEL/Centos(6.5 이하)에서 지원됨 :-( 따라서 socat
tee를 사용하고 원래 포트에서 들어오는 패킷을 두 개의 새 포트로 전달해야 합니다. 원래 수신 포트에서 수신 대기하는 프로세스가 있는 경우 수신 대기하도록 재구성해야 합니다. socat
현재 원래 포트의 리스너 와 마찬가지로 전달된 포트 중 하나 입니다.이 SE 게시물예를 들어 socat
포트 복제 구문이 있습니다.
답변2
이 --tee
플래그는 DNAT 체인의 일부가 아니라 ROUTE의 일부입니다. 선언한 후에만 사용할 수 있습니다 -j ROUTE
. 다음과 같이 iptables에서 이 주제에 대한 구체적인 도움말을 얻을 수 있습니다.
$ iptables -j ROUTE help
나는 귀하의 iptables 명령을 보고 있는데 그것은 나에게 어떤 의미도 없습니다. 질문에 "수신된 패킷"이라고 말할 때 패킷의 소스 포트와 소스 포트를 일치시키려는 이유는 무엇입니까?존재하다들어오는 트래픽을 두 개의 포트로 분할하려고 합니까, 아니면 한 포트의 출력을 다른 포트의 입력에 연결하려고 합니까?
전자의 경우에는 실제로 두 단계가 있습니다. tee를 사용하여 패킷 복사본을 가져오는 동시에 패킷을 손상시켜 포트 번호를 변경할 수는 없습니다. 먼저 자신에게 패킷 복사본을 보낸 다음 해당 복사본만 일치시키고 대상 포트를 수정하는 두 단계로 이를 시도할 수 있습니다.경고: 테스트되지 않았습니다. 다음 의사코드를 고려하세요.
$ sudo iptables -A PREROUTING -t mangle -p tcp -s !127.0.0.1/32 --dport 8001 -j ROUTE --gw 127.0.0.1 --tee
$ sudo iptables -A POSTROUTING -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002