네트워크 패킷에 해당하는 것은 무엇입니까? [폐쇄]

네트워크 패킷에 해당하는 것은 무엇입니까? [폐쇄]

이것은 아마도 매우 기본적인 질문일 것이다.

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네트워크 인터페이스, 전달하려는 포트 수 등에 따라 다릅니다.

관련 정보