자격증 공부/리눅스 마스터 2급

[명령어 알아보기] netstat

강_토발즈 2025. 2. 11. 18:27

 

리눅스 및 네트워크를 공부하면서 나오는 명령어들 중 많이 사용되지만 내용과 기능이 한번에 잘 떠오르지 않아
직접 명령어를 실행해보고 정리해 보도록 한다.
netstat, ifconfig (ipconfig), route 명령어를 차례로 알아보기로 하는데, 먼저 netstat 를 먼저 알아보기로 한다.

 

1. 명령어 메뉴얼 살펴보기

일단 명령어의 메뉴얼을 읽어보기 위해 man netstat 를 통해, 해당 명령어의 정의를 먼저 살펴봤다.

 

 

Netstat prints information about the Linux networking subsystem.  
The type of information printed is controlled by the first argument, as follows

 

netstat 명령어는, 리눅스 네트워킹 서브시스템의 정보를 출력한다. 좀 더 자세히 알아보니, 네트워크 연결, 라우팅 테이블, 인터페이스 통계, 네트워크 프로토콜의 상태를 확인할 수 있고, 이를 통해 시스템 네트워크 상태를 모니터링 하고 문제를 진단하는데 쓰이는 명령어로 정의 된다.
옵션은... 외워두면 바로바로 쓸 수 있겠지만 필요할때 검색해서 사용하다 보면 익..숙해 지겠지..?

 

 

2. 명령어 실행하기

실제로 내 컴퓨터에서 netstat 를 입력하니 다음과 같이 실행 중인 프로세스들이 어떤 프로토콜을 사용하고 있는지, 또 다양한 다른 네트워크 정보들에 대한 내용들을 표시해 주었다.

 

 

일단 화면에서 크게 두 개의 항목으로 구분되어 있는 것을 확인 했는데,
Active Internet connections 항목과 Active UNIX domain sockets 항목으로 구분되어 출력되었다. 

 

  • Active Internet connections (w/o servers):

    이 항목은 현재 활성화된 인터넷 연결을 보여고, TCP 및 UDP 프로토콜을 사용하는 클라이언트와 서버 간의 연결을 나타냄.
    서버가 아닌 연결만 표시하며, 로컬 시스템에서 원격 서버로의 연결이나 원격 서버에서 로컬 시스템으로의 연결이 나열됨.
    각 연결의 상태 (예: ESTABLISHED, TIME_WAIT 등)와 관련된 IP 주소 및 포트 번호가 표시됨.

    Proto : 프로토콜의 종류를 나타낸다 (TCP or UDP)
    Recv-Q : 수신 대기 중인 데이터의 바이트 수
    Send-Q : 송신 대기 중인 데이터의 바이트 수
    Local Address : 로컬 시스템의 IP 주소(도메인 주소)와 포트번호
    Foreign Address :  연결된 원격 시스템의 IP 주소와 포트번호 (https : 443 번 포트 )
    State : 프로토콜의 연결 상태
  • Active UNIX domain sockets (w/o servers):

    이 항목은 UNIX 도메인 소켓을 사용하여 통신하는 활성 연결을 나타내는데,  UNIX 도메인 소켓이란 같은 호스트 내에서 프로세스 간 통신을 의미한다.
    즉 이 연결들은 네트워크를 통해 이루어지는 것이 아니라, 로컬 시스템 내에서만 사용되는 것이고, 일반적으로 데이터베이스 서버나 웹 서버와 같은 로컬 서비스 간의 통신을 보여준다.

위 두 항목을 통해서, 현재 외부와 네트워크를 연결하여 실행 중인 프로세스들에 대한 정보, 그리고 내 컴퓨터 내에서 서로 네트워크를 구성하여 실행 중인 프로세스들에 대한 정보를 보여준다는 것을 알게 되었다.

 

 

 

3. 외부 연결 자세히 살펴보기

 

Active Internet connections 항목을 살펴보다 비슷한 도메인 이름이 많이 발견되는 것을 확인했다. 특정 서비스와 내 컴퓨터가 많이 연결되어 있는 것 같아서, 어떤 프로세스가 어떤 외부 서비스와 소통(?) 중인지 알아보고 싶어졌다.


먼저 검색을 통해 알아보니

  • kix : 지역 또는 데이터 센터 코드
  • [숫자s숫자] : 서버의 인덱스 번호
  • in-f : infrastructure 의 약자로, 구글의 인프라 서비스와 관련된 서버일 가능성이 높음.
  • 14.1 or 3.1e : 추가적인 식별자나 버젼 정보
  • :https : 해당 서버의 포트번호. 443번 포트를 사용한다는 의미.

즉 도메인 이름만 보면 모르겠지만, 구글의 어떤 서비스 (443 번 포트) 에 연결되어서 내 컴퓨터에 어떤 프로세스들이 실행 중에 있다는 게 예상되었다. 그러면 내 컴퓨터에서 54284, 54272, 45609 포트를 사용하고 있는 프로세스들은 어떤 것들인지 알아보면 되겠다는 생각이 들었다.

특정 포트번호를 사용하는 프로세를 확인하기 위해 아래 명령어를 입력해 봤다.

lsof -i :[포트트번호]

 

 

?????

 

예상과는 다른 결과가 나왔다. 해당 포트를 사용하는 프로세스가 종료되거나 더 이상 활성화 되지 않는지,
아무런 검색 결과도 나오지 않았다.

실망했지만, 현재 외부와 네트워크 연결 중인 다른 포트들을 하나하나 검색해 봤다. 지금 Chrome 브라우저를 통해 블로그를 작성 중이니, Chrome 프로세스는 나와야 하는거 아니야?

 

 

 

9개의 연결 중 tcp 7개 udp 2개 연결 모두, 사용 중인 포트 번호를 찾아봤다. PID 는 똑같은데, 다른 포트로 다른 연결이 되고 있음을 확인 하였다. 검색을 통해 확인해보니, 하나의 프로세스가 여러 개의 포트를 사용하는 것은 일반적인 상황이며, 특히 웹 브라우저 같은 복잡한 애플리케이션에서는 더 흔하게 발생한다고 한다. 특히 다중 연결, 비동기 요청, 확장 프로그램 및 플러그인, 로드 밸런싱 등을 사용하기 위해 서로 다른 포트들을 사용한다고 한다.

각 탭 또는 브라우저 창 마다 독립적인 연결을 유지하기 위해 포트를 사용하기도 한다니, 포트를 한 10개 열어서 tcp 연결이 늘어나는지 확인해 보고 싶었다.

 

 

 

브라우저 탭을 추가하여 네이버, 유투브, 인프런, 백준 사이트에 접속했다. 이제 netstat 를 통해 확인해보자

 

 

갑자기 연결이 너무 많아졌다... 하나하나 확인 해 보라고 항의하는 것 같았다...

아까 알아본 봐와 같이, 특정 브라우저에 연결된 사이트에서 비동기 요청이나 확장 프로그램이 있는 경우 추가적인 연결을 실행하기 때문에 브라우저 창을 5개 추가했다고 해서 딱 5개의 연결이 늘어나는 것이 아니라 더 많은 네트워크 연결이 발생한다는 것을 알 수 있었다.

 

 

4. 내부 연결 자세히 살펴보기

 

 

일단 netstat 명령어를 실행하면 외부 네트워크 연결보다 압도적으로 많은 양을 보여주는 것이 Active UNIX domain sockets 항목이다.

  • Proto : 사용 중인 프로토콜은 나타낸다. Unix 도메인 소켓은 unix 라고 표시된다.
  • RefCnt : 소켓에 대한 참조 카운트(레퍼런스 카운트 군). 해당 소켓을 참조하고 있는 프로세스의 수를 의미하고, 0 값이 되면 메모리에서 해제된다. (얼마나 많은 다른 프로세스들은 연결되어있는지 알 수 있는 것 같다.)
  • Flag : 소켓의 상태를 나타냄. 여러 플래그가 조합되어 표시될 수 있음. 아쉽게도 [  ] 표시밖에 없네...
  • Type : 소켓의 유형. STREAM (연결지향), DGRAM(비연결 지향) 을 나타냄.
  • I-Node : 소켓을 구분할 수 있는 소켓의 i-node 번호 ( 각 소켓은 파일 시스템에서 고유한 i-node 를 가지고 있음)
  • Path : 소켓의 경로

화면을 자세히 보니 Path 들이 대부분 /run 경로로 시작되는 것을 알 수 있었다. 대부분의 프로세스들은 C 드라이브 아래에서 각각 설치된 경로들이 다를텐데 왜 약 90%의 소켓들이 동일한 /run 경로 아래에 있는걸까?

 

검색하여 찾아보니, /run 디렉토리는 임시 파일 시스템으로, 시스템 부팅 시에만 존재하는 메모리 기반의 파일 시스템. 이 곳은 시스템이 실행되는 동안에만 사용되고 재부팅 후에는 초기화 되는데, 소켓 역시 프로세스 간의 임시 통신을 위한 엔드포인트 이기 때문에 프로세스가 종료되면 소켓도 더 이상 필요가 없게 되므로 run 디렉토리에서 함께 존재하다가 시스템을 종료하면 다 같이 사라지도록 관리하는 것 이였다.

 

또 /run 경로가 아니라 @dea04c..... 와 같은 경로들도 존재하였는데, 이는 비파일 시스템 경로로 실제 파일 시스템에 존재하지 않고, 메모리 내에서만 존재하는 소켓이라고 한다. 이러한 형태의 소켓은 특히 보안이 중요한 상황에서 사용되며, 여러 프로세스 간의 통신을 위한 임시적인 경로로 활용된다.

 

마지막으로 특정 소켓을 찾아서 어떤 프로세스가 소켓을 사용하고 있는지 알아보고 싶어졌다.

 

lsof -U

 

위 명령어를 통해, 현재 소켓을 사용하는 프로세스들을 모두 나열할 수 있었다.

 

또 특정 PID 를 통해 해당 프로세스가 사용 중인 소켓을 검색할 수도 있었다.

ls -l /proc/<PID>/fd

 

 

 

5.마무리

netstat 명령어를 자세히 알아보았다. 내 컴퓨터에서 외부와 네트워크 연결로 작동 중인 프로세스들에 대한 정보, 또 내 컴퓨터 안에서 서로 네트워크 연결을 통해 데이터를 주고받는 프로세스들에 대한 정보들을 한 번에 볼 수 있는 명령어 였다.
다음엔 ifconfig (for Linux) 와 ipconfig (for Window) 명령어에 대해 공부하고 포스팅 하도록 해야겠다.