일반적으로 리눅스에서 포트를 체크할 때는 telnet을 사용하실 텐데, telnet은 일단 연결되면 빠져나와야 하는 불편함이 있어 자동화 스크립트나 모니터링 용도로 사용하기엔 불편합니다. 또한 UDP 포트는 체크할 수 없죠. 이럴 때 사용하면 좋은 프로그램이 바로 nc입니다.

nc는 크게 두가지 기능이 있습니다. 바로 상대방 포트가 오픈되어 있는지 체크하는 기능과, 내 서버에서 임의의 포트를 리스닝하게 만드는 기능입니다. 저는 서버를 운영하면서 포트 오픈 여부를 체크할 일이 자주 발생하더군요. 일단 물리적인 방화벽 장비가 중간에 해당 포트를 막고 있는지 확인할 수 있고, 상대방 OS에서 방화벽을 오픈하지 않은 경우도 확인할 수 있습니다.

1. 포트 체크하기

예제로 네이버의 80포트 오픈 여부를 체크해보겠습니다.

nc -z www.naver.com 80


보시다시피 잘 열려 있네요. 이렇게 기본적인 사용법은 -z 옵션 주고 서버 주소 뒤에 포트 번호를 입력하면 됩니다. 기본은 TCP 포트입니다.

다음은 UDP 포트를 체크해보겠습니다. -u 옵션을 주면 되는데요, NTP 서버는 UDP 123 포트를 사용하죠. 예제로 kr.pool.ntp.org를 체크해보겠습니다.

nc -zu kr.pool.ntp.org 123

UDP 포트는 시간이 좀 걸리더군요. 아래와 같이 잘 열려 있음을 확인했습니다.


마지막으로 ipv4 옵션을 써야 하는 경우가 있는데요, 올레닷컴이 대표적으로 그렇더군요. 올레닷컴을 그냥 -z만 주고 체크하면 10초 이상의 딜레이가 발생합니다. 이때 -4 옵션을 주면 해결되더군요. ipv6로 DNS Resolve 하면서 발생하는 문제로 추정하고 있습니다.


사실 이 ipv4 옵션은 nc 뿐 아니라 wget이나 curl을 사용할 때도 동일하게 적용됩니다. 올레닷컴을 wget이나 curl로 체크하면 역시 10초 이상의 딜레이가 발생하지만 -4 옵션을 주면 즉시 반응합니다.


2. 포트 리스닝하기

다음은 임의의 포트를 리스닝하게 만드는 법입니다. 예를 들어 WEB 서버는 DMZ에 존재하고 MS-SQL DB서버는 사내망에 존재하는 경우, 1433 포트가 중간에 물리적인 방화벽으로 막혀있는지 여부를 테스트해볼 때 유용하겠죠. (아직 MS-SQL을 설치하지 않아서 리스닝하는 데몬, 프로세스가 없는 경우) 또는 WAS에서 사용하는 8009 포트 역시 마찬가지입니다.

저는 예제로 1433 포트를 리스닝 시켜보겠습니다. -l 옵션을 주시면 됩니다.

nc -l 1433

그러면 아래와 같이 쉘이 응답 대기상태로 진입합니다. 원격에서 해당 포트로 패킷이 날아오면 리스닝 상태가 풀립니다. 어차피 방화벽 오픈 여부만 체크해보면 되니까 한번으로도 충분하겠죠.


이 상태로 제 PC에서 tcping으로 패킷을 한번 날려보겠습니다.
(참고 : 2011/09/22 - [유용한 프로그램] - 특정 TCP 포트로 Ping 날리는 프로그램 - tcping)


보시다시피 정상적으로 1433 포트를 리스닝 하고 있음을 확인했습니다. 둘 사이엔 방화벽에서 1433 포트가 오픈되어 있다는 말이겠죠.

이상입니다.
secret