소개
사용 시 가장 큰 장점 중 하나는 Linux 제공하는 유용한 유틸리티가 매우 많다는 점입니다. 프로그램 내장 기능은 대개 대부분의 프로그래머가 작업을 수행하기에 충분합니다. 즉, 대부분의 경우 외부 프로그램이나 소프트웨어를 다운로드할 필요가 없습니다. 내장 도구만으로도 충분한 유용성을 제공합니다. 이러한 유용한 기능 중 하나가 바로 netcat 유틸리티입니다.
네트워킹 도구의 세계에서 netcat은 일종의 강력한 무기와도 같습니다. 여러 목적으로 사용할 수 있는 믿을 수 없을 정도로 다재다능한 명령입니다. 예를 들어, 이 단일 도구를 사용하여 시스템 연결을 통해 모든 종류의 파일과 데이터를 모니터링, 테스트 및 전송할 수 있습니다. 이 가이드에서는 다음에서 이러한 모든 작업을 수행하는 방법을 알아봅니다. VPS netcat을 사용하여.
Netcat 찾기
Netcat은 일반적으로 모든 최신 Linux 배포판에서 사용할 수 있습니다. 즉, 이미 설치되어 있을 가능성이 높으므로 굳이 따로 설치할 필요가 없습니다. 이 튜토리얼에서는 Ubuntu 12.04 VPS를 사용합니다. 다음을 통해 튜토리얼을 따라 자체 Ubuntu 서버를 설치할 수 있습니다. Ubuntu에는 보통 BSD 버전의 netcat 유틸리티가 기본으로 포함되어 있습니다. 다른 버전을 사용하는 경우 작동 방식이 약간 다를 수 있다는 점에 유의하세요.
기본 구문 살펴보기
먼저 netcat 유틸리티에서 작동하는 일반적인 구문에 대해 알아보겠습니다. netcat은 TCP 연결을 시작하여 작동할 수 있습니다. 연결은 원격 호스트로 시작되어야 합니다. 다음은 netcat의 기본 구문입니다:
|
1 |
netcat [options] host port |
이 명령은 원격 호스트에 대한 TCP 연결을 시작하려고 시도합니다. 연결할 호스트는 명령에 지정한 포트 번호에 따라 달라집니다. 연결은 암호화되지 않습니다. 보시다시피 이 명령은 telnet 명령이 작동하는 방식과 유사하게 작동합니다.
반면에 UDP 연결을 시작할 수도 있습니다. TCP 대신 UDP 패킷을 보내려면 -u 옵션을 사용해야 합니다. 다음과 같이 표시됩니다:
|
1 |
netcat -u host port |
원하는 경우 포트 범위를 지정할 수도 있습니다. 이렇게 하려면 첫 번째 포트와 마지막 포트 사이에 대시(-)를 넣어야 합니다. 다음은 예시입니다:
|
1 |
netcat host startport-endport |
여기에 플래그를 더 추가할 수도 있습니다. 또 한 가지 주의할 점은 netcat과 nc를 혼용하여 사용할 수 있다는 것입니다. 두 명령 모두 동일한 명령을 실행하므로 서로의 별칭(alias)입니다.
포트 스캐닝에 Netcat 사용하기
우선, netcat의 가장 일반적인 용도 중 하나를 살펴보겠습니다. netcat을 포트 스캐너로 사용하는 방법을 알아보겠습니다. 대부분의 상황에서는 nmap과 같은 도구를 사용하는 것이 더 낫습니다. 하지만 간단한 포트 스캔만 수행하면 되는 경우에는 netcat이 유용합니다. 열려 있는 포트를 쉽게 식별하는 데 도움이 될 수 있습니다.
netcat을 포트 스캐너로 사용하려면 포트 범위를 지정해야 합니다. -z 옵션을 사용하여 이 작업을 수행합니다. 이렇게 하면 시스템이 연결을 시도하는 대신 포트 범위를 스캔합니다. 포트 1부터 포트 1000까지 스캔하고 싶다고 가정해 보겠습니다:
|
1 |
netcat -z -v domain.com 1-1000 |
-z 명령 외에도 -v 옵션도 사용했습니다. 후자는 명령에 더 많은 정보를 제공할 수 있게 해줍니다. 즉, 더 '상세한(verbose)' 정보를 출력하도록 합니다.
그 결과로 다음과 같은 출력을 얻게 됩니다:

출력에는 각 개별 포트에 대한 많은 정보가 표시됩니다. 각 포트의 연결 상태를 알 수 있습니다. 반면에 도메인 이름 대신 IP 주소를 알고 있다면 IP 주소를 사용할 수도 있습니다. 이렇게 하면 프로세스가 훨씬 빨라집니다. 다음은 예시입니다:
|
1 |
netcat -z -n -v 198.51.100.0 1-1000 |
시스템이 IP 주소를 확인하기 위해 DNS를 사용할 필요가 없음을 나타내기 위해 -n 플래그를 사용했습니다.
일반적으로 반환 메시지는 표준 오류(standard error)로 전송됩니다. 결과를 더 빠르게 필터링하기 위해 표준 출력(standard out)으로 리디렉션할 수 있습니다. 이를 위해 2>&1 bash 구문을 사용합니다. 그 후 grep을 사용하여 결과를 필터링합니다. 이 방법을 예제에 적용해 보겠습니다:
|
1 |
netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep 성공했습니다 |
출력은 다음과 유사하게 표시됩니다:
![]()
출력 결과는 지정된 범위에서 연결을 위해 22번 포트만 열려 있음을 보여줍니다. 22번 포트는 마침 전통적인 SSH 포트입니다.
Netcat을 통한 통신: 어떻게 작동하나요?
다음으로, netcat을 사용하여 TCP 및 UDP 패킷을 전송하는 방법을 살펴보겠습니다. 그뿐만 아니라 다양한 포트에서 패킷을 수신할 수도 있습니다. 이러한 기능 덕분에 두 개의 netcat 인스턴스를 사용하여 클라이언트-서버 관계를 만들 수 있습니다. 처음에는 클라이언트와 서버를 결정하게 됩니다. 초기 설정이 끝나면 양쪽 클라이언트 모두 어느 방향으로든 패킷을 보내고 받을 수 있습니다.
당연히 한 시스템에서 netcat이 특정 포트에서 연결을 대기하도록 구성해야 합니다. 이를 위해 -l 매개변수를 사용해야 합니다. 이를 통해 다음과 같이 원하는 포트를 선택할 수 있습니다:
|
1 |
netcat -l 4444 |
이제 이 머신의 TCP가 4444번 포트에서 연결을 대기하게 됩니다. 주의할 점은 루트(root) 권한이 없거나 일반 사용자인 경우 1000번 미만의 포트에는 액세스할 수 없다는 것입니다.
다음으로, 연결을 설정할 두 번째 머신을 구성해야 합니다. 다음과 같이 동일한 포트 번호를 사용하고 특정 도메인 이름을 지정합니다:
|
1 |
netcat domain.com 4444 |
이 명령을 실행해도 아무런 출력도 나타나지 않습니다. 하지만 연결은 설정됩니다. 즉, 두 서버 중 어느 쪽에서든 다른 쪽으로 메시지를 보내기 시작할 수 있습니다. 이렇게 하려면 메시지를 입력한 다음 ENTER를 누르기만 하면 됩니다. 메시지가 양쪽 화면에 모두 표시됩니다.
완료되면 CTRL+D를 눌러 TCP 연결을 닫을 수 있습니다.
Netcat을 사용하여 파일을 전송할 수 있나요?
다음으로, netcat을 통해 파일을 전송하는 방법을 보여드리겠습니다. TCP 연결을 사용하면 메시지뿐만 아니라 다른 종류의 데이터도 보낼 수 있습니다. 먼저, 연결을 대기할 머신 하나를 선택해야 합니다. 하지만 명령에 정보를 직접 입력하는 대신, 다음과 같이 파일에 저장하겠습니다:
|
1 |
netcat -l 4444 > received_file |
다른 머신에서는 새 텍스트 파일을 만들어야 합니다. 사용할 명령은 다음과 같습니다:
|
1 |
echo "Hello, this is a file" > original_file |
파일을 전송하려면 대기 중인 컴퓨터의 연결에 대한 입력으로 해당 파일을 사용합니다:
|
1 |
netcat domain.com 4444 < original_file |
다른 컴퓨터에는 'received_file'이라는 새 파일이 표시됩니다. 여기에는 우리가 입력한 모든 정보가 포함되어 있습니다:
|
1 |
cat received_file |
이 유틸리티를 사용하여 파일 전송 프로그램으로 전환할 수 있습니다. 디렉터리의 내용을 전송하고 싶다고 가정해 보겠습니다. 이름 없는 tarball을 만들어 시스템으로 전송한 다음 원격 디렉터리에 압축을 푸는 방식으로 진행하겠습니다. 다른 머신에서는 파일을 받을 준비를 해야 합니다. 압축을 풀고 추출해야 한다는 것을 알고 있습니다. 이를 위해 다음 명령을 실행합니다:
|
1 |
netcat -l 4444 | tar xzvf - |
대시(-)는 tar가 표준 입력에서 작동함을 나타냅니다. 이는 초기 연결을 설정했을 때 초기 서버의 netcat에서 제공됩니다.
마지막으로, 전체 디렉터리의 내용을 tarball에 넣고 다음과 같이 netcat을 통해 보낼 수 있습니다:
|
1 |
tar -czf - * | netcat domain.com 4444 |
tar 명령의 대시(-)는 시스템에 디렉터리 내용을 tar로 묶고 압축하도록 지시하고 있음을 보여줍니다. 또한 결과를 표준 출력으로 쓰도록 지시합니다. 파일은 TCP 연결을 통해 다른 쪽 끝으로 이동합니다. 수신 서버는 압축을 풀고 현재 원격 디렉터리에 저장합니다.
이와 마찬가지로 netcat을 통해 다른 종류의 데이터도 전송할 수 있습니다. 많은 사람들이 디스크 이미지를 만들고 전송하기 위해 dd 명령을 사용합니다. 데이터와 파일을 전송하는 다른 방법을 보려면 다음을 참조하십시오. SFTP로 파일을 전송하는 동안 보안을 보장하는 방법을 보여주는 튜토리얼.
Using Netcat as a Web Server
netcat의 또 다른 유용한 기능은 페이지를 테스트하는 데 사용할 수 있다는 것입니다. 서버를 사용하여 다음과 같은 HTML 파일을 만든다고 가정해 보겠습니다:
|
1 |
nano index.html |
이것은 파일에 포함된 HTML 코드입니다:
|
1 2 3 4 5 6 7 8 9 10 |
<html> <head> <title>테스트 페이지</title> </head> <body> <h1>1단계 헤더</h1> <h2>부제목</h2> <p>여기에 일반 텍스트</p> </body> </html> |
이 내용을 파일에 입력한 다음 저장하고 닫습니다. 일반적으로 포트 80이 기본 웹 포트입니다. 루트가 아닌 일반 사용자로서 우리는 포트 8888을 선택할 것입니다. 페이지를 한 번만 제공하고 확인하려는 경우 다음 명령을 사용해야 합니다:
|
1 |
printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888 |
파일의 내용을 시각적으로 확인하려면 브라우저로 이동하여 다음 주소에 접속하세요:
|
1 |
http://server_IP:8888 |
HTML 파일로 코딩한 페이지를 볼 수 있습니다:

페이지를 가져오면 netcat 연결이 닫힙니다. 즉, 페이지를 새로 고침하면 콘텐츠 대신 오류가 표시됩니다. 이는 페이지를 한 번만 제공하도록 구성했기 때문입니다. 페이지를 무기한으로 계속 보면서 연결을 계속 수신하려면 다른 코드를 사용해야 합니다:
|
1 |
while true; do printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888; done |
여기서는 마지막 명령을 무한 루프로 래핑했습니다. 루프를 중지하려면 CTRL-C를 입력하기만 하면 됩니다. 이제 첫 번째 연결이 닫힌 후에도 페이지와 렌더링 결과를 계속 볼 수 있습니다. 그러나 이것이 netcat 유틸리티를 웹 서버로 사용하여 얻을 수 있는 최대 기능입니다. 보안을 제공하지 않으므로 실제 웹사이트를 서비스하는 데 사용하지 마세요. 대신 다음 튜토리얼을 참조할 수 있습니다: Nginx와 같은 웹 서버 소프트웨어를 설치하는 방법 또는 Apache.
결론
이 튜토리얼에서는 netcat 유틸리티를 다루고 Ubuntu에서의 도구로서의 다재다능함을 살펴보았습니다. 위의 섹션에서 다루었듯이 통신, 데이터 전송 및 페이지 제공 목적으로 사용할 수 있습니다. TCP/UDP 연결을 통한 서버 간의 빠른 상호 작용에 완벽하게 작동합니다. 많은 기본 수준의 기능 및 진단에 매우 유용한 기능입니다.
즐거운 컴퓨팅 되세요!
댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.