리눅스에서 서버 프로세스를 개발하고 테스트하다 보면 서버 프로세스는 정상적으로 기동되어 있는데 다른 컴퓨터에서 접속이 안되는 경우가 있다.  여러 가지 이유가 있겠지만 포트가 열려 있지 않아서 그런 경우도 있다. 이 글은 그런 상황에서 포트가 열려 있는지를 확인하고 닫혀 있었다면 포트를 열어주는 방법에 대한 글이다.


리눅스에서 현재 열려 있는 포트를 확인하는 방법


열려 있는 모든 포트를 표시하기

netstat -nap

n:host명으로 표시 안함
a:모든소켓 표시
p:프로세스ID와 프로그램명 표시


LISTEN중인 포트를 표시하기

netstat -nap | grep LISTEN)



상대방 포트가 열려 있는지를 확인하는 방법

상대방 머신에 접속이 되지 않을 때 혹시 포트가 막혀 있는지를 확인해 보자.
netcat(nc) 네트워크 유틸리티를 이용하면 된다. 


특정 호스트의 특정 포트가 열려 있는지를 확인하기

nc -z 호스트주소 포트

ex) nc -z www.google.com 80

<결과예>

Connection to www.google.com 80 port [tcp/http] succeeded!

z: 포트 검색


특정 머신의 포트 범위를 지정하여 열린 포트를 확인하기

nc 호스트주소 -z 시작포트-끝포트

ex) nc 10.20.30.40 -z 19-21

<결과 예>
Connection to 10.20.30.40 21 port [tcp/ftp] succeeded!
Connection to 10.20.30.40 22 port [tcp/ssh] succeeded!
Connection to 10.20.30.40 23 port [tcp/telnet] succeeded!



포트를 열기

위의 방법으로 호스트의 포트가 LISTEN중임을 확인하였는데 상대방 호스트에서 포트가 열려있지 않다고 나온다면, 호스트의 포트가 막혀 있을 가능성이 있다.

포트를 열려면 iptables를 사용하면 된다. iptables는 리눅스 방화벽을 설정하는 명령어이다.

특정 포트를 외부에서 접속할 수 있도록 열기

iptables -I INPUT 1 -p tcp --dport 12345 -j ACCEPT 

I: 새로운 규칙을 추가한다.
p: 패킷의 프로토콜을 명시한다.
j: 규칙에 해당되는 패킷을 어떻게 처리할지를 정한다.

이 명령은 외부에서 들어오는(INBOUND) TCP포트 12345의 연결을 받아들인다는 규칙을 방화벽 1번 방화벽 규칙으로 추가한다는 의미이다.

이렇게 추가한 규칙은 조회나 삭제가 가능하다.


추가한 설정 조회하기

조회하기

iptables -L -v

L: 규칙을 출력
v: 자세히


추가한 설정 삭제하기

규칙을 삭제하려면 추가한 규칙의 번호로 삭제하는 방법과 추가했을 때의 명령어에서 "-I"를 "-D"로 바꾸어 주는 방법이 있다.

규칙번호로 삭제하기
iptables -D INPUT 1

추가한 규칙으로 삭제하기
iptables -D INPUT -p tcp --dport 12345 -j ACCEPT 

D: 규칙을 삭제