Linux에서 ss 명령을 사용하는 방법

ss 명령어는 과거에 널리 사용되었던 netstat 명령어를 대체하는 현대적인 도구입니다. 리눅스 환경에서 네트워크 연결 상태를 확인하고 상세한 통계를 얻는 데 유용하게 활용됩니다. 이 편리한 명령어를 효과적으로 사용하는 방법을 알아봅니다.

ss 명령어와 netstat의 차이점

더 이상 사용이 권장되지 않는 netstat 명령어를 대신하여, ss 명령어는 컴퓨터가 다른 시스템, 네트워크 및 서비스와 어떻게 통신하는지에 대한 심층적인 정보를 제공합니다. 자세한 내용은 여기서 확인하세요.

ss 명령어는 TCP, UDP, 유닉스 도메인 소켓 (프로세스 간 통신), 그리고 원시 소켓에 대한 다양한 통계를 제공합니다. 특히 원시 소켓네트워크 OSI 계층에서 작동하며, 이는 TCP 및 UDP 헤더 처리가 전송 계층이 아닌 응용 프로그램 레벨에서 이루어져야 함을 의미합니다. ICMP 메시지와 ping 유틸리티 모두 원시 소켓을 활용합니다.

ss 명령어 사용법

ss 명령어는 대부분의 최신 리눅스 배포판에 기본적으로 포함되어 있어 별도의 설치 과정이 필요하지 않습니다. 그러나 명령어의 출력 결과가 매우 방대할 수 있다는 점을 유념해야 합니다. 실제로 630줄 이상의 결과가 반환되는 경우도 종종 있습니다.

스크린샷으로는 전체 내용을 담기 어려워, 명령어 출력 결과를 텍스트 형태로 제공합니다. 또한, 가독성을 높이기 위해 일부 내용을 편집했습니다.

네트워크 연결 목록 확인

별도의 옵션 없이 ss 명령어를 실행하면, 현재 수신 대기 중이 아닌 소켓의 목록을 확인할 수 있습니다.

다음 명령어를 입력하여 결과를 확인해 보세요.

ss

Netid State Recv-Q Send-Q          Local Address:Port Peer Address:Port   Process
u_str ESTAB 0      0                           * 41826           * 41827
u_str ESTAB 0      0 /run/systemd/journal/stdout 35689           * 35688
u_str ESTAB 0      0                           * 35550           * 35551
...
u_str ESTAB 0      0                           * 38127           * 38128
u_str ESTAB 0      0 /run/dbus/system_bus_socket 21243           * 21242
u_str ESTAB 0      0                           * 19039           * 19040
u_str ESTAB 0      0 /run/systemd/journal/stdout 18887           * 18885
u_str ESTAB 0      0 /run/dbus/system_bus_socket 19273           * 17306
icmp6 UNCONN 0     0                           *:ipv6-icmp       *:*
udp   ESTAB 0      0         192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps

각 열의 의미는 다음과 같습니다.

Netid: 소켓의 유형을 나타냅니다. 위 예시에서는 Unix 스트림인 “u_str”, “udp”, 그리고 IPv6 ICMP 소켓인 “icmp6” 등이 있습니다. 리눅스 소켓 유형에 대한 더 자세한 설명은 리눅스 매뉴얼 페이지에서 확인할 수 있습니다.
State: 소켓의 현재 상태를 나타냅니다.
Recv-Q: 수신된 패킷의 수를 표시합니다.
Send-Q: 전송된 패킷의 수를 나타냅니다.
Local Address:Port: 로컬 주소 및 포트 (또는 Unix 소켓의 경우 해당 값)를 보여줍니다.
Peer Address:Port: 원격 주소 및 포트 (또는 Unix 소켓의 경우 해당 값)를 표시합니다.

UDP 소켓의 경우 “State” 열은 보통 비어 있습니다. TCP 소켓의 상태는 다음 값들 중 하나를 가집니다.

  • LISTEN: 서버 측에서만 사용됩니다. 소켓이 연결 요청을 대기하고 있는 상태입니다.
  • SYN-SENT: 클라이언트 측에서만 사용됩니다. 연결 요청을 전송하고 응답을 기다리는 상태입니다.
  • SYN-RECEIVED: 서버 측에서만 사용됩니다. 연결 요청을 수락하고 연결 승인을 기다리는 상태입니다.
  • ESTABLISHED: 서버와 클라이언트 간에 연결이 설정되어 데이터 전송이 가능한 상태입니다.
  • FIN-WAIT-1: 서버와 클라이언트 모두 사용할 수 있습니다. 원격 소켓의 연결 종료 요청을 기다리거나, 이전에 보낸 연결 종료 요청에 대한 승인을 기다리는 상태입니다.
  • FIN-WAIT-2: 서버와 클라이언트 모두 사용할 수 있습니다. 원격 소켓의 연결 종료 요청을 기다리는 상태입니다.
  • CLOSE-WAIT: 서버와 클라이언트 모두 사용할 수 있습니다. 로컬 사용자의 연결 종료 요청을 기다리는 상태입니다.
  • CLOSING: 서버와 클라이언트 모두 사용할 수 있습니다. 원격 소켓의 연결 종료 요청에 대한 승인을 기다리는 상태입니다.
  • LAST-ACK: 서버와 클라이언트 모두 사용할 수 있습니다. 원격 소켓으로 보낸 연결 종료 요청에 대한 승인을 기다리는 상태입니다.
  • TIME-WAIT: 서버와 클라이언트 모두 사용할 수 있습니다. 원격 소켓의 종료 요청을 수신했음을 알리는 승인을 보낸 후, 승인 수신 여부를 확인하기 위해 대기하는 상태입니다.
  • CLOSED: 연결이 종료되어 소켓이 닫힌 상태입니다.

수신 대기 소켓 목록 확인

수신 대기 중인 소켓을 확인하려면 -l (listen) 옵션을 추가하여 명령어를 실행합니다.

ss -l

Netid State  Recv-Q Send-Q               Local Address:Port                  Peer Address:Port Process
nl    UNCONN 0      0                             rtnl:NetworkManager/535                *
nl    UNCONN 0      0                             rtnl:evolution-addre/2987              *
...
u_str LISTEN 0      4096          /run/systemd/private 13349                            * 0
u_seq LISTEN 0      4096             /run/udev/control 13376                            * 0
u_str LISTEN 0      4096             /tmp/.X11-unix/X0 33071                            * 0
u_dgr UNCONN 0      0      /run/systemd/journal/syslog 13360                            * 0
u_str LISTEN 0      4096    /run/systemd/fsck.progress 13362                            * 0
u_dgr UNCONN 0      0    /run/user/1000/systemd/notify 32303                            * 0

여기서 보여지는 소켓들은 모두 연결이 설정되지 않은 상태에서 연결 요청을 기다리는 중입니다. “rtnl”은 커널과 사용자 공간 프로세스 간의 정보 전송에 사용되는 라우팅 넷링크를 의미합니다.

모든 소켓 목록 확인

시스템의 모든 소켓 목록을 확인하려면 -a (all) 옵션을 사용할 수 있습니다.

ss -a

Netid State  Recv-Q Send-Q    Local Address:Port                 Peer Address:Port    Process
nl    UNCONN 0      0                  rtnl:NetworkManager/535               *
nl    UNCONN 0      0                  rtnl:evolution-addre/2987 *
...
u_str LISTEN 0      100       public/showq 23222                            * 0
u_str LISTEN 0      100      private/error 23225                            * 0
u_str LISTEN 0      100      private/retry 23228                            * 0
...
udp   UNCONN 0      0             0.0.0.0:631                         0.0.0.0:*
udp   UNCONN 0      0             0.0.0.0:mdns                        0.0.0.0:*
...
tcp   LISTEN 0      128              [::]:ssh                            [::]:*
tcp   LISTEN 0      5               [::1]:ipp                            [::]:*
tcp   LISTEN 0      100             [::1]:smtp                           [::]:*

이 출력 결과에는 상태에 관계없이 모든 소켓이 포함됩니다.

TCP 소켓 목록 확인

특정 종류의 소켓만 표시하도록 필터를 적용할 수 있습니다. 예를 들어, -t (TCP) 옵션을 사용하여 TCP 소켓만 표시할 수 있습니다.

ss -a -t

UDP 소켓 목록 확인

-u (UDP) 옵션을 사용하여 UDP 소켓만 확인할 수 있습니다.

ss -a -u

State  Recv-Q Send-Q    Local Address:Port Peer   Address:Port Process
UNCONN 0      0               0.0.0.0:631         0.0.0.0:*
UNCONN 0      0               0.0.0.0:mdns        0.0.0.0:*
UNCONN 0      0               0.0.0.0:60734       0.0.0.0:*
UNCONN 0      0         127.0.0.53%lo:domain      0.0.0.0:*
ESTAB 0       0    192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps
UNCONN 0      0                   [::]:mdns          [::]:*
UNCONN 0      0                   [::]:51193         [::]:*

Unix 소켓 목록 확인

Unix 소켓만 확인하려면 -x (Unix) 옵션을 사용합니다.

ss -a -x

Netid State Recv-Q Send-Q               Local Address:Port  Peer Address:Port    Process
u_str ESTAB 0      0                                * 41826            * 41827
u_str ESTAB 0      0                                * 23183            * 23184
u_str ESTAB 28     0               @/tmp/.X11-unix/X0 52640            * 52639
...
u_str ESTAB 0      0      /run/systemd/journal/stdout 18887            * 18885
u_str ESTAB 0      0      /run/dbus/system_bus_socket 19273            * 17306

원시 소켓 목록 확인

원시 소켓에 대한 필터는 -w (raw) 옵션입니다.

ss -a -w

IPv4 소켓 목록 확인

IPv4 프로토콜을 사용하는 소켓은 -4 (IPV4) 옵션을 사용하여 확인할 수 있습니다.

ss -a -4

IPv6 소켓 목록 확인

IPv6 프로토콜을 사용하는 소켓은 -6 (IPV6) 옵션을 사용하여 확인할 수 있습니다.

ss -a -6

상태별 소켓 목록 확인

특정 상태의 소켓 목록을 확인할 수 있습니다. 예를 들어, established, listening 또는 closed 상태의 소켓들을 볼 수 있습니다. 또한, -r 옵션을 사용하여 네트워크 주소와 포트를 이름으로 확인할 수 있습니다.

다음 명령은 established 상태의 TCP 연결을 찾고, ss 명령어가 호스트 이름과 포트 이름을 확인하도록 합니다.

ss -t -r state established

위 결과는 established 상태의 4개의 연결을 보여줍니다. 호스트 이름 “ubuntu20-04″가 확인되었으며, 두 번째 줄의 SSH 연결의 경우 포트 번호 22 대신 “ssh”가 표시됩니다.

listening 상태의 소켓도 동일한 방법으로 확인할 수 있습니다.

ss -t -r state listening

Recv-Q Send-Q Local Address:Port   Peer Address:Port Process
0      128        localhost:5939        0.0.0.0:*
0      4096    localhost%lo:domain      0.0.0.0:*
0      128          0.0.0.0:ssh         0.0.0.0:*
0      5          localhost:ipp         0.0.0.0:*
0      100        localhost:smtp        0.0.0.0:*
0      128             [::]:ssh         [::]:*
0      5      ip6-localhost:ipp         [::]:*
0      100    ip6-localhost:smtp        [::]:*

프로토콜별 소켓 목록 확인

특정 프로토콜과 관련된 소켓을 나열할 수도 있습니다. 이는 dport (대상 포트) 및 sport (소스 포트) 옵션을 함께 사용합니다.

예를 들어, established 상태에서 HTTPS 프로토콜을 사용하는 소켓을 나열하려면 다음 명령을 입력합니다. 괄호 앞뒤의 공백에 유의하세요.

ss -a state established ‘( dport = :https or sport = :https )’

프로토콜 이름 또는 해당 프로토콜과 관련된 포트 번호를 사용할 수 있습니다. SSH의 기본 포트는 22입니다.

다음은 프로토콜 이름과 포트 번호를 사용하여 동일한 결과를 얻는 예시입니다.

ss -a ‘( dport = :ssh or sport = :ssh )’
ss -a ‘( dport = :22 or sport = :22 )’

예상대로 동일한 결과를 얻을 수 있습니다.

특정 IP 주소에 대한 연결 목록 확인

dst (대상) 옵션을 사용하여 특정 IP 주소에 대한 연결 목록을 확인할 수 있습니다.

다음 명령어를 입력해 보세요.

ss -a dst 192.168.4.25

프로세스 정보 확인

소켓을 사용하는 프로세스 정보를 확인하려면 -p (process) 옵션을 사용할 수 있습니다 (sudo 권한 필요).

sudo ss -t -p

State Recv-Q Send-Q  Local Address:Port   Peer Address:Port  Process
ESTAB 0      0       192.168.4.28:57650  54.218.19.119:https users:(("firefox",pid=3378,fd=151))
ESTAB 0      0       192.168.4.28:ssh     192.168.4.25:43946 users:(("sshd",pid=4086,fd=4),("sshd",pid=3985,fd=4))

위 결과는 TCP 소켓에 설정된 두 개의 연결이 각각 SSH 데몬과 Firefox에서 사용되고 있음을 보여줍니다.

마무리

ss 명령어는 netstat 명령어가 제공하던 정보를 훨씬 더 간결하고 접근하기 쉬운 방식으로 제공합니다. 더 자세한 옵션과 정보는 매뉴얼 페이지를 참조하시기 바랍니다.