이것은 아마도 매우 기본적인 질문일 것이다.
tee 명령처럼 작동하지만 TCP/UDP 패킷을 전달하는 명령이 Linux에 있는지 궁금합니다. 기본적으로 하나의 포트에서 수신 대기해야 하며 이 "티"와 같은 구성 요소 뒤에 구성된 다른 모든 호스트에 동일한 데이터/패킷을 "티"/전달해야 합니다.
명령이 아닌 경우 권장 설정은 무엇입니까?
netcat이나 socat이 이것을 할 수 있나요?
답변1
네트워크 통신은 일반적으로 양방향이지만 tee
쉘 파이프는 한 방향으로만 작동합니다.
zsh
그러나 데이터를 다시 보내지 않고 받기만 하는 일부 네트워크 서비스가 있는 경우 다음과 같이 +를 사용하여 TCP를 통해 이러한 모든 서비스에 동일한 바이트 스트림을 보낼 수 있습니다 socat
.
generate-stream > >(socat -u - tcp:host:8001) > >(socat -u - tcp:host:8002)
또는 프로세스 교체를 지원하지만 여러 운영 체제를 지원하지 않는 다른 셸을 사용하세요.
generate-stream | tee >(socat -u - tcp:host:8001) | socat -u - tcp:host:8002
이제 들어오는 연결을 수락하고 수신된 트래픽을 그런 식으로 전달하는 서비스에 연결하려면 tee
다음을 수행할 수 있습니다.
CODE='
cat > >(socat -u - tcp:host:8001) > >(socat -u - tcp:host:8002)
' socat -u tcp-listen:8000,fork,reuseaddr \
exec:'zsh -c eval\\ $CODE',nofork
여기에서는 TCP 포트 8000을 통해 단방향으로 트래픽을 수신하고 이를 TCP 포트 8001 및 8002를 통해 서버로 전달하는 서비스가 시작됩니다 host
.
필수는 아닙니다 . 이는 단지 표준 입력을 최적화 nofork
하는 최적화일 뿐입니다.zsh
예네트워크 소켓.
또는 없는 zsh
경우 bash
:
CODE='
tee >(socat -u - tcp:host:8001) | socat -u - tcp:host:8002
' socat -u tcp-listen:8000,fork,reuseaddr \
exec:'bash -c eval\\ \\\"$CODE\\\"',nofork
에 적용할 수 있습니다 socat
.
zsh
이를 위해 도우미 함수를 작성할 수 있습니다 . 예를 들면 다음과 같습니다.
ntee() (
src=$1; shift
export CODE=cat
for dst do
CODE+=" > >(socat -u - ${(qq)dst})"
done
socat -u "$src" exec:'zsh -c eval\\ $CODE',nofork
)
다음과 같이 사용하십시오.
ntee tcp-listen:8000,reuseaddr,fork \
tcp:host1:8001 \
udp-sendto:host2:8002 \
file:file.log,creat,append
예를 들어.
답변2
netcat 또는 socat 도구는 애플리케이션 계층 데이터 흐름을 처리하는 데 이상적입니다. 네트워크 패킷의 복사본을 Linux 시스템의 다른 대상으로 전달하려면 커널 수준을 확인해야 합니다 iptables
.
찾고 있는 티 기능은 TEE 확장을 사용하여 얻을 수 있습니다.iptables TEE 확장 문서
구성하려는 특정 규칙은 iptables
네트워크 인터페이스, 전달하려는 포트 수 등에 따라 다릅니다.