웹사이트 검색

Netcat을 사용하여 TCP 및 UDP 연결을 설정하고 테스트하는 방법


소개

Linux는 대부분의 배포판에서 즉시 사용할 수 있는 성숙하고 유용한 명령줄 유틸리티가 많이 있는 것으로 알려져 있습니다. 종종 시스템 관리자는 추가 소프트웨어를 설치하지 않고도 기본 제공 도구를 사용하여 많은 작업을 수행할 수 있습니다.

이 안내서에서는 netcat 유틸리티를 사용하는 방법에 대해 설명합니다. 이 다목적 명령은 네트워크 연결을 통해 데이터를 모니터링, 테스트 및 전송하는 데 도움이 될 수 있습니다.

Netcat은 거의 모든 최신 Linux 배포판에서 사용할 수 있습니다. 우분투는 netcat의 BSD 변종과 함께 제공되며 이것이 우리가 이 가이드에서 사용할 것입니다. 다른 버전은 다르게 작동하거나 다른 옵션을 제공할 수 있습니다.

일반 구문

기본적으로 netcat은 원격 호스트에 대한 TCP 연결을 시작하여 작동합니다.

가장 기본적인 구문은 다음과 같습니다.

  1. netcat [options] host port

이렇게 하면 지정된 포트 번호에서 정의된 호스트에 대한 TCP 연결을 시작하려고 시도합니다. 이는 이전 Linux telnet 명령과 유사하게 작동합니다. 연결이 완전히 암호화되지 않았음을 명심하십시오.

TCP 연결을 시작하는 대신 UDP 패킷을 보내려면 -u 옵션을 사용할 수 있습니다.

  1. netcat -u host port

첫 번째와 마지막 사이에 대시를 넣어 포트 범위를 지정할 수 있습니다.

  1. netcat host startport-endport

이것은 일반적으로 일부 추가 플래그와 함께 사용됩니다.

대부분의 시스템에서 netcat 또는 nc를 상호 교환하여 사용할 수 있습니다. 동일한 명령의 별칭입니다.

포트 스캐닝에 Netcat을 사용하는 방법

netcat의 가장 일반적인 용도 중 하나는 포트 스캐너입니다.

netcat이 작업에 가장 정교한 도구는 아니지만(대부분의 경우 nmap이 더 나은 선택임) 간단한 포트 스캔을 수행하여 열린 포트를 쉽게 식별할 수 있습니다.

연결을 시작하려고 시도하는 대신 스캔을 수행하는 -z 옵션과 함께 위에서 수행한 것처럼 스캔할 포트 범위를 지정하여 이를 수행합니다.

예를 들어 다음 명령을 실행하여 최대 1000개의 모든 포트를 스캔할 수 있습니다.

  1. netcat -z -v domain.com 1-1000

-z 옵션과 함께 -v 옵션도 지정하여 netcat에 더 자세한 정보를 제공하도록 지시했습니다.

출력은 다음과 같습니다.

Output
nc: connect to domain.com port 1 (tcp) failed: Connection refused nc: connect to domain.com port 2 (tcp) failed: Connection refused nc: connect to domain.com port 3 (tcp) failed: Connection refused nc: connect to domain.com port 4 (tcp) failed: Connection refused nc: connect to domain.com port 5 (tcp) failed: Connection refused nc: connect to domain.com port 6 (tcp) failed: Connection refused nc: connect to domain.com port 7 (tcp) failed: Connection refused . . . Connection to domain.com 22 port [tcp/ssh] succeeded! . . .

보시다시피 이것은 많은 정보를 제공하며 스캔의 성공 여부를 각 포트에 대해 알려줍니다.

실제로 도메인 이름을 사용하는 경우 이 형식을 사용해야 합니다.

그러나 필요한 IP 주소를 알고 있으면 검색 속도가 훨씬 빨라집니다. 그런 다음 -n 플래그를 사용하여 DNS를 사용하여 IP 주소를 확인할 필요가 없도록 지정할 수 있습니다.

  1. netcat -z -n -v 198.51.100.0 1-1000

반환된 메시지는 실제로 표준 오류로 전송됩니다(자세한 내용은 I/O 리디렉션 문서 참조). 표준 오류 메시지를 표준 출력으로 보낼 수 있으므로 결과를 더 쉽게 필터링할 수 있습니다.

2>&1 bash 구문을 사용하여 표준 오류를 표준 출력으로 리디렉션합니다. 그런 다음 grep을 사용하여 결과를 필터링합니다.

  1. netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep succeeded
Output
Connection to 198.51.100.0 22 port [tcp/*] succeeded!

여기에서 원격 컴퓨터의 1–1000 범위에서 열린 유일한 포트는 기존 SSH 포트인 포트 22임을 알 수 있습니다.

Netcat을 통해 통신하는 방법

Netcat은 TCP 및 UDP 패킷 전송으로 제한되지 않습니다. 또한 포트에서 연결 및 패킷을 수신 대기할 수 있습니다. 이를 통해 클라이언트-서버 관계에서 netcat의 두 인스턴스를 연결할 수 있습니다.

어떤 컴퓨터가 서버이고 어떤 컴퓨터가 클라이언트인지는 초기 구성 중에만 관련된 차이점입니다. 연결이 설정된 후 양방향 통신은 정확히 동일합니다.

한 시스템에서 연결을 위해 특정 포트를 수신하도록 netcat에 지시할 수 있습니다. -l 매개변수를 제공하고 포트를 선택하여 이를 수행할 수 있습니다.

  1. netcat -l 4444

이렇게 하면 netcat에게 포트 4444에서 TCP 연결을 수신하도록 지시합니다. 루트가 아닌 일반 사용자는 보안 조치로 1000 미만의 포트를 열 수 없습니다.

두 번째 서버에서 선택한 포트 번호의 첫 번째 시스템에 연결할 수 있습니다. 이전에 연결을 설정했던 것과 동일한 방식으로 이 작업을 수행합니다.

  1. netcat domain.com 4444

아무 일도 없었던 것처럼 보일 것입니다. 그러나 이제 연결의 양쪽에서 메시지를 보낼 수 있으며 양쪽에서 볼 수 있습니다.

메시지를 입력하고 ENTER를 누르십시오. 로컬 및 원격 화면 모두에 나타납니다. 이것은 반대 방향으로도 작동합니다.

메시지 전달을 마치면 CTRL-D를 눌러 TCP 연결을 닫을 수 있습니다.

Netcat을 통해 파일을 보내는 방법

이전 예제를 기반으로 더 유용한 작업을 수행할 수 있습니다.

일반 TCP 연결을 설정하고 있기 때문에 해당 연결을 통해 거의 모든 종류의 정보를 전송할 수 있습니다. 사용자가 입력한 채팅 메시지에 국한되지 않습니다. 이 지식을 사용하여 netcat을 파일 전송 프로그램으로 전환할 수 있습니다.

다시 한 번 연결을 수신할 연결의 한쪽 끝을 선택해야 합니다. 그러나 마지막 예에서와 같이 화면에 정보를 인쇄하는 대신 모든 정보를 파일에 바로 배치합니다.

  1. netcat -l 4444 > received_file

이 명령의 >netcat의 모든 출력을 지정된 파일 이름으로 리디렉션합니다.

두 번째 컴퓨터에서 다음을 입력하여 간단한 텍스트 파일을 만듭니다.

  1. echo "Hello, this is a file" > original_file

이제 이 파일을 수신 컴퓨터에 설정할 netcat 연결의 입력으로 사용할 수 있습니다. 파일은 대화식으로 입력한 것처럼 전송됩니다.

  1. netcat domain.com 4444 < original_file

연결을 기다리고 있던 컴퓨터에서 이제 다른 컴퓨터에서 입력한 파일의 내용이 포함된 received_file이라는 새 파일이 있는 것을 볼 수 있습니다.

  1. cat received_file
Output
Hello, this is a file

보시다시피 배관을 통해 이 연결을 쉽게 활용하여 모든 종류의 물건을 옮길 수 있습니다.

예를 들어 이름 없는 tarball을 즉석에서 생성하여 원격 시스템으로 전송하고 원격 디렉토리에 압축을 풀어 전체 디렉토리의 내용을 전송할 수 있습니다.

받는 쪽에서는 다음을 입력하여 압축을 풀고 추출해야 하는 파일이 올 것으로 예상할 수 있습니다.

  1. netcat -l 4444 | tar xzvf -

종료 대시(-)는 tar가 표준 입력에서 작동함을 의미하며 연결이 설정될 때 네트워크를 통해 netcat에서 파이프됩니다.

우리가 전송하려는 디렉토리 내용이 있는 쪽에서 tarball로 압축한 다음 netcat을 통해 원격 컴퓨터로 보낼 수 있습니다.

  1. tar -czf - * | netcat domain.com 4444

이번에는 tar 명령의 대시는 현재 디렉토리의 내용(* 와일드카드로 지정됨)을 tar 및 압축하고 결과를 표준 출력에 쓰는 것을 의미합니다.

그런 다음 이것은 TCP 연결에 직접 기록되고 다른 쪽 끝에서 수신되어 원격 컴퓨터의 현재 디렉터리로 압축이 풀립니다.

이것은 한 컴퓨터에서 다른 컴퓨터로 보다 복잡한 데이터를 전송하는 한 가지 예일 뿐입니다. 또 다른 일반적인 아이디어는 dd 명령을 사용하여 한쪽 디스크의 이미지를 만들고 원격 컴퓨터로 전송하는 것입니다. 여기서는 다루지 않겠습니다.

Netcat을 간단한 웹 서버로 사용하는 방법

우리는 통신하고 파일을 전송하기 위해 연결을 수신하도록 netcat을 구성했습니다. 동일한 개념을 사용하여 netcat을 매우 간단한 웹 서버로 운영할 수 있습니다. 이는 생성 중인 페이지를 테스트하는 데 유용할 수 있습니다.

먼저 한 서버에서 간단한 HTML 파일을 만들어 보겠습니다.

  1. nano index.html

다음은 파일에서 사용할 수 있는 간단한 HTML입니다.

<html>
        <head>
                <title>Test Page</title>
        </head>
        <body>
                <h1>Level 1 header</h1>
                <h2>Subheading</h2>
                <p>Normal text here</p>
        </body>
</html>

파일을 저장하고 닫습니다.

루트 권한이 없으면 기본 웹 포트인 포트 80에서 이 파일을 제공할 수 없습니다. 일반 사용자로 포트 8888을 선택할 수 있습니다.

이 페이지를 한 번만 제공하여 렌더링 방법을 확인하려는 경우 다음 명령을 실행할 수 있습니다.

  1. printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888

이제 브라우저에서 다음을 방문하여 콘텐츠에 액세스할 수 있습니다.

http://server_IP:8888

이렇게 하면 페이지가 제공되고 netcat 연결이 닫힙니다. 페이지를 새로 고치려고 하면 페이지가 사라집니다.

다음과 같이 무한 루프에서 마지막 명령을 래핑하여 netcat이 페이지를 무한정 제공하도록 할 수 있습니다.

  1. while true; do printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888; done

이렇게 하면 첫 번째 연결이 닫힌 후에도 연결을 계속 받을 수 있습니다.

서버에서 CTRL-C를 입력하여 루프를 중지할 수 있습니다.

이렇게 하면 페이지가 브라우저에서 렌더링되는 방식을 볼 수 있지만 더 많은 기능을 제공하지는 않습니다. 실제 웹 사이트를 제공하기 위해 이것을 사용해서는 안됩니다. 보안이 없으며 링크와 같은 단순한 것조차 제대로 작동하지 않습니다.

결론

이제 netcat이 어떤 용도로 사용될 수 있는지 꽤 잘 이해하셨을 것입니다. 문제를 진단하고 기본 수준 기능이 TCP/UDP 연결에서 올바르게 작동하는지 확인하는 데 유용할 수 있는 다목적 도구입니다.

netcat을 사용하면 서로 다른 컴퓨터 간에 매우 쉽게 통신하여 빠른 상호 작용을 할 수 있습니다. Netcat은 연결 형성의 복잡성을 제거하여 컴퓨터 간의 네트워크 상호 작용을 투명하게 만들려고 시도합니다.