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