NC에서 듣고 있어요localhost:2500
▶ nc -l 2500
_
다른 터미널에서 이 청취 측에 연결하려고 합니다.
▶ nc -zv localhost 2500
nc: connectx to localhost port 2500 (tcp) failed: Connection refused
Connection to localhost port 2500 [tcp/rtsserv] succeeded!
첫 번째 시도가 실패한 것처럼 보이는 이유는 무엇입니까?
또한 어떤 이유로(명백히 성공) 연결 시도가 완료되면 청취 프로세스가 종료된다는 사실도 확인했습니다. 왜 이런 일이 발생하는지 잘 모르겠습니다.
답변1
netcat에는 다양한 구현이 있습니다.
첫 번째 질문은 IPv6와 관련된 것으로 보이기 때문에 레거시 구현이 아니라 IPv6을 처리할 수 있는 보다 현대적인 구현을 사용하고 있다고 가정합니다. 여기서는 OpenBSD 변형 nc
(Debian 11의 경우 버전 1.217, 1.217-3) 을 사용하고 있습니다 .
문제 1: 이중 연결
nc -l 2500
IPv4에서 듣기nc -zv localhost 2500
먼저 IPv6 localhost에 연결을 시도했지만::1
실패하고 IPv4 localhost127.0.0.1
:success 로 다시 시도했습니다.
내 netcat은 더 많은 정보를 제공합니다:
$ nc -zv localhost 2500 nc: connect to localhost (::1) port 2500 (tcp) failed: Connection refused Connection to localhost (127.0.0.1) 2500 port [tcp/*] succeeded!
다음을 통해 이를 방지할 수 있습니다.
클라이언트 명령에서 localhost 대신 127.0.0.1을 상태로 설정하거나
-4
IPv4만 시도하는 옵션을 사용하십시오.또는 듀얼 스택 기본 설정의 해상도를 변경하세요.로컬 호스트IPv6보다 IPv4를 우선시합니다. glibc 기반 시스템(예: 대부분의 Linux)에서는 다음을 추가하여 수행할 수 있습니다
/etc/gai.conf
.precedence ::1/128 5
또는
-6
IPv6가 사용될 설명을 통해 서버 명령에 선언하십시오. 실제로 IPv6 소켓은 기본적으로 이중 모드 IPv4+IPv6으로 설정될 가능성이 높습니다.RFC 3493.
두 번째 질문: 서버 명령이 종료됩니다.
제로 패턴 스캔인터넷 고양이TCP는 단지 연결을 설정하고 종료합니다. 즉, 제로 데이터를 전송하지만 여전히 연결을 설정하고 닫습니다. 따라서 역할을 완료하는 서버 명령은 기본적으로 종료됩니다(이것은 OpenBSD 변형의 동작입니다. 예를 들어 원본/레거시 변형은 이를 수행하지 않지만 IPv6도 사용하지 않습니다).
청취 소켓을 유지하고 첫 번째 연결이 수신될 때 중지되지 않도록 서버 명령에 필수 옵션을 추가하십시오. OpenBSD 버전의 경우
-k
"다중 연결을 위해 인바운드 소켓을 열어두기" 옵션이 있습니다 .nc -k -l 2500
알아채다다른 구현이 있습니다~의인터넷 고양이각각 고유한 뉘앙스가 있습니다. 어느 것을 사용해야 할지에 대한 내 조언은 다음과 같습니다: 없음, 사용socat
대신에 더 많은 기능이 있습니다.