[Linux] netstat 명령어


현업에서 자주 사용되는 명령어 중 하나인 netstat에 대해 다뤄볼까 한다.

간단한 명령어기도 하고, 자주 쓰이는 옵션들은 한정적이라 깊게 다룰만한 명령어는 아니지만 정말 유용하게 쓰인다.




네트워크 연결에 관한 정보를 표시해주는 명령어인데, 주로 현재 서버에서 열려있는 port 및 해당 port를 물고 있는 프로세스 확인의 용도로 사용하고 있다.

[root@wordpress ~]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 ip-172-26-10-63.ap-:ssh 54.239.117.74:44856     ESTABLISHED
tcp        0      0 ip-172-26-10-63.ap-:ssh 54.239.117.82:26057     ESTABLISHED
tcp        0    164 ip-172-26-10-63.ap-:ssh 54.239.117.74:44535     ESTABLISHED
tcp        0      0 ip-172-26-10-63.ap-:ssh 54.239.117.8:flashfiler ESTABLISHED
udp        0      0 ip-172-26-10-63.:bootpc ip-172-26-0-1.ap:bootps ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    399959   /run/user/1000/systemd/notify
unix  3      [ ]         DGRAM      CONNECTED     12205    /run/systemd/notify
unix  15     [ ]         DGRAM      CONNECTED     12525    /run/systemd/journal/dev-log
unix  8      [ ]         DGRAM      CONNECTED     12527    /run/systemd/journal/socket
unix  2      [ ]         DGRAM      CONNECTED     18553    /run/chrony/chronyd.sock
unix  3      [ ]         STREAM     CONNECTED     18488    /run/systemd/journal/stdout
unix  3      [ ]         STREAM     CONNECTED     19569    /run/systemd/journal/stdout
unix  3      [ ]         STREAM     CONNECTED     14071    
unix  2      [ ]         DGRAM      CONNECTED     400461   
unix  2      [ ]         DGRAM                    19571    
.......

단순하게 netstat을 쳐보면 어지러운 글자들의 향연이 펼쳐진다.

그렇기에 필요한 부분들만 뽑아서 보는 옵션들이 중요하게 다뤄지며, 똑같은 옵션만 계속 사용하게 되는게 현실이다.

그러면 옵션들에 대해서 알아보자





-a: 모든 네트워크 연결을 표시합니다. 이 옵션을 사용하면 서버와 클라이언트의 모든 연결이 표시됩니다.

-t: TCP 프로토콜과 관련된 연결만 표시합니다.

-u: UDP 프로토콜과 관련된 연결만 표시합니다.

-l: 수신 대기 중인 소켓만 표시합니다. 즉, 서버에서 현재 수신 대기 중인 포트들만 보여줍니다.

-n: 호스트, 포트, 사용자 이름 등을 숫자로 표시합니다. DNS 룩업을 방지하여 결과를 더 빨리 얻을 수 있습니다.

-p: 어떤 프로세스가 특정 연결을 사용 중인지 표시합니다. 이 옵션을 사용하면 연결과 관련된 프로세스 ID(PID)와 프로세스 이름을 볼 수 있습니다.

-r: 라우팅 테이블을 표시합니다. 이 옵션은 네트워크 트래픽이 어떻게 라우팅되는지 확인할 때 유용합니다.

-s: 네트워크 인터페이스의 프로토콜별 통계 정보를 표시합니다.

-i: 네트워크 인터페이스 테이블을 표시합니다. 이 옵션은 각 네트워크 인터페이스의 상태와 전송량 등의 정보를 확인할 수 있습니다.

-c: 정보를 주기적으로 갱신하여 실시간으로 표시합니다.




위 처럼 옵션들만 보면 무엇인지 이해가 안갈수도 있는데, 내가 자주 쓰는 명령어는 아래와 같다.

-a : 모든 네트워크 연결 표시

-u : UDP 프로토콜 연결 표시

-t : TCP 프로토콜 연결 표시

-n : 호스트, 포트를 숫자로 표시

-p : 어떤 프로세스가 연결을 사용중인지 표시

netstat -auntp

위 처럼 사용하고 있는데, 이는 자신이 원하는 정보에 맞게끔 옵션들을 수정하면 좋을 것 같다.


실제로 해당 명령어를 서버에서 실행하면

[root@wordpress ~]# netstat -auntp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      21142/docker-proxy  
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      21162/docker-proxy  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      723/sshd: /usr/sbin 
tcp        0      0 172.26.10.63:22         54.239.117.74:44856     ESTABLISHED 27295/sshd: ec2-use 

위의 정보를 해석해보자면

  1. 443 포트에 대해 any로 받아들이고 있으며, 해당 프로세스는 21142 pid를 갖는 docker-proxy 프로세스이다.
  2. 80 포트에 대해 any로 받아들이고 있으며, 해당 프로세스는 21162 pid를 갖는 docker-proxy 프로세스이다.
  3. 22 포트(SSH)에 대해 any로 받아들이고 있으며, 해당 프로세스는 723 pid를 갖는 sshd 프로세스이다.
  4. 172.26.10.63(local)의 22 포트(SSH)가 54.239.117.74라는 서버와 44056 포트로 ESTABLISHED 즉 서로 통신하고 있고 27295 pid를 갖는 sshd 프로세스이다.

LISTEN은 문장 그대로 읽어들이고 있다는 의미이며 클라이언트의 요청을 기다리고 있다는 의미이다.

ESTABLISHED는 해당 프로세스가 사용중이며 이미 연결되어 데이터를 서로 주고받고 있다는 것을 의미한다.


이러한 netstat 명령어를 통해 was가 현재 어떤 포트로 기동중인지, 외부에 있는 was에서 해당 was와 통신하고 있는지등을 알 수 있기에 유용한 명령어라고 생각한다.

이를 잘 활용한다면 was들이 기동되는 port를 굳이 config를 까지 않아도 확인할 수 있고, 방화벽 및 통신 문제에 기본적인 원인들을 알 수 있다.

현재까지도 많이 사용했고, 앞으로도 자주 사용할 예정인 명령어이다.