리눅스 네트워크 명령어: ip, ss, ping, traceroute, dig, curl로 네트워크 진단하기
리눅스의 주요 네트워크 명령어는 ip(주소, 인터페이스, 경로), ss(열린 포트와 연결), ping과 traceroute(호스트 도달 여부와 경로), dig(DNS 조회), curl(HTTP 서비스 응답)입니다. 네트워크 문제는 주소, 경로, DNS, 포트, 애플리케이션 순서로 계층별로 점검하면 원인을 빨리 찾을 수 있습니다.
리눅스 네트워크 명령어는 일상적인 네트워크 진단의 대부분을 담당합니다. ip는 주소와 경로를 보여 주고, ss는 열린 포트와 연결을 보여 주며, ping과 traceroute는 호스트에 도달 가능한지 확인하고, dig는 DNS를, curl은 웹 서비스의 응답을 확인합니다. 아래는 옵션을 정리한 치트시트와, "네트워크가 안 된다"는 상황에서 원인을 찾는 순서입니다.
치트시트: 리눅스 네트워크 명령어 한눈에 보기
| 작업 | 명령어 |
|---|---|
| 모든 인터페이스의 IP 주소 | ip -br addr |
| 인터페이스 상태 (UP/DOWN) | ip -br link |
| 라우팅 테이블 | ip route |
| 주소로 가는 패킷이 거치는 게이트웨이 | ip route get 8.8.8.8 |
| 이웃 장치 (ARP 테이블) | ip neigh |
| 수신 대기 중인 포트와 프로세스 | sudo ss -tulpn |
| 설정된 TCP 연결 | ss -tn state established |
| 호스트 응답 확인 | ping -c 4 example.com |
| 호스트까지 패킷 경로 | traceroute example.com, mtr example.com |
| 도메인 이름을 IP로 변환 | dig +short example.com |
| 특정 DNS 서버에 질의 | dig @1.1.1.1 example.com |
| HTTP 응답 헤더 확인 | curl -I https://example.com |
| 연결과 TLS 세부 정보 | curl -v https://example.com |
| TCP 포트가 열려 있는지 확인 | nc -zv host 443 |
| 호스트 이름 | hostnamectl, hostname -I |
ip: 주소, 인터페이스, 경로
ip 명령은 iproute2 패키지에 포함되어 있으며, 오래된 ifconfig와 route를 대체합니다. 하위 명령은 줄여 쓸 수 있습니다. ip a는 ip addr, ip r은 ip route와 같습니다. -br 옵션은 간략한 출력을, -c는 색상을 켭니다.
$ ip -br addr
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 192.168.1.25/24 fe80::a00:27ff:fe4e:66a1/64
docker0 DOWN 172.17.0.1/16
인터페이스에 필요한 네트워크 주소가 없거나 상태가 DOWN이라면, 더 찾을 필요 없이 문제가 이 계층에 있다는 뜻입니다.
IP 주소 추가하고 인터페이스 켜기
sudo ip link set eth0 up
sudo ip addr add 192.168.1.50/24 dev eth0
sudo ip addr del 192.168.1.50/24 dev eth0
ip로 바꾼 설정은 재부팅 전까지만 유지됩니다. 영구 설정은 시스템 설정 파일에서 합니다. Ubuntu는 netplan, Fedora와 RHEL은 NetworkManager(nmcli), 서버에서는 systemd-networkd를 씁니다.
경로와 기본 게이트웨이
$ ip route
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.25
$ ip route get 10.20.0.5
10.20.0.5 via 192.168.1.1 dev eth0 src 192.168.1.25 uid 1000
default via 줄은 더 구체적인 경로에 해당하지 않는 모든 트래픽이 나가는 게이트웨이입니다. 이 줄이 없으면 로컬 네트워크는 동작해도 인터넷은 되지 않습니다. 경로 추가 예: sudo ip route add 10.20.0.0/16 via 192.168.1.254.
ss: 열린 포트와 포트를 쓰는 프로세스
ss는 netstat을 대체하며 더 빠르게 동작합니다. 가장 자주 쓰는 조합은 ss -tulpn입니다.
| 옵션 | 의미 |
|---|---|
-t / -u | TCP / UDP |
-l | 수신 대기 소켓만 |
-p | 프로세스 표시 (다른 사용자의 프로세스는 sudo 필요) |
-n | 포트와 주소를 이름으로 바꾸지 않음 |
-a | 설정된 소켓을 포함한 모든 소켓 |
-s | 요약 통계 |
$ sudo ss -tulpn
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=812,fd=6))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=640,fd=3))
tcp LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=901,fd=21))
주소를 확인하세요. 0.0.0.0은 서비스가 모든 인터페이스에서 연결을 받는다는 뜻이고, 127.0.0.1은 로컬에서만 받는다는 뜻입니다. 데이터베이스가 다른 장비에서 응답하지 않는 흔한 원인이 바로 이것입니다.
포트를 누가 쓰고 있는지 찾기
sudo ss -ltnp 'sport = :8080'
sudo ss -tn dst 10.0.0.7 # 특정 주소로 가는 연결
ss -tan state time-wait | wc -l # TIME-WAIT 상태 소켓 개수
ping: 호스트에 도달할 수 있는지 확인
ping은 ICMP echo 요청을 보내고 응답 시간과 손실을 보여 줍니다. 리눅스에서는 멈추지 않고 계속 실행되므로 -c로 패킷 수를 지정하세요.
$ ping -c 4 8.8.8.8
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=12.4 ms
...
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 12.1/12.5/13.0/0.3 ms
유용한 옵션: -i 0.2는 간격, -W 2는 응답 대기 시간, -4/-6은 IP 버전, -s 1472 -M do는 단편화 없이 MTU를 확인합니다. 많은 서버와 클라우드가 ICMP를 차단하므로 ping에 응답이 없다고 해서 호스트를 쓸 수 없다는 뜻은 아닙니다.
traceroute와 mtr: 패킷이 어디서 사라지는지
traceroute는 목적지까지 거치는 노드를 보여 줍니다. 일부 홉에서 별표(*)가 나오는 것은 정상입니다. 중간 라우터가 응답하지 않을 수 있기 때문입니다. 주의할 신호는 특정 홉 이후 모든 응답이 별표인 경우입니다.
traceroute -n example.com # DNS 이름 없이, 더 빠르게
sudo traceroute -T -p 443 example.com # UDP 대신 TCP, 방화벽 통과에 유리
tracepath example.com # root 권한 없이, MTU도 함께 표시
mtr은 ping과 traceroute를 합쳐서 홉별 손실 통계를 실시간으로 갱신합니다. 보고서를 만들려면 mtr -rwc 50 example.com을 사용하세요.
dig: DNS 확인
dig은 dnsutils 패키지(RHEL에서는 bind-utils)에 포함된 주요 DNS 점검 도구입니다. 짧은 형식은 답만 출력합니다.
$ dig +short example.com
93.184.215.14
$ dig example.com MX +short
$ dig @8.8.8.8 example.com A # 특정 서버에 질의
$ dig -x 8.8.8.8 +short # 역방향 조회 (PTR)
$ dig +trace example.com # 루트 서버부터 전체 체인 추적
전체 출력에서는 status를 보세요. NOERROR는 레코드를 찾았다는 뜻, NXDOMAIN은 도메인이 없다는 뜻, SERVFAIL은 서버가 응답하지 못했다는 뜻입니다(DNSSEC 문제나 권한 서버 장애가 흔한 원인입니다). dig @8.8.8.8은 응답하는데 기본 dig이 응답하지 않는다면 로컬 리졸버가 문제입니다. /etc/resolv.conf와 resolvectl status를 확인하세요.
dig은 /etc/hosts를 읽지 않는다는 점도 기억하세요. 애플리케이션이 이름을 해석하는 것과 같은 방식으로 확인하려면 getent hosts example.com을 사용하세요.
curl: HTTP와 API 점검
curl은 마지막 질문에 답합니다. 서비스가 응답하는지, 그리고 정확히 무엇을 돌려주는지 말입니다.
| 명령어 | 동작 |
|---|---|
curl -I URL | 헤더만 가져오기 (HEAD 요청) |
curl -v URL | 자세히: DNS, 연결, TLS, 헤더 |
curl -L URL | 리디렉션 따라가기 |
curl -o file URL | 파일로 저장 |
curl -X POST -H 'Content-Type: application/json' -d '{"a":1}' URL | JSON 전송 |
curl -k URL | 인증서 검사 생략 (디버깅 전용) |
curl --resolve site.ru:443:10.0.0.5 https://site.ru | DNS를 거치지 않고 특정 서버에 요청 |
curl -s -o /dev/null -w '%{http_code} %{time_total}\n' URL | 응답 코드와 소요 시간 |
$ curl -s -o /dev/null -w '%{http_code} %{time_connect} %{time_total}\n' https://example.com
200 0.041 0.187
curl의 오류 메시지는 문제가 어느 계층인지 잘 알려 줍니다. Could not resolve host는 DNS 문제, Connection refused는 포트가 닫혀 있거나 아무도 수신하지 않는다는 뜻, Connection timed out은 방화벽이 패킷을 막았거나 경로가 없다는 뜻, SSL certificate problem은 인증서 문제입니다.
진단 순서: "네트워크가 안 될 때"
- 인터페이스와 주소:
ip -br addr로 인터페이스가 UP이고 주소가 있는지 확인합니다. - 게이트웨이:
ip route에default via가 있는지 보고,ping -c 3 <게이트웨이>를 실행합니다. - IP로 외부 네트워크 확인:
ping -c 3 1.1.1.1. 응답하면 라우팅은 정상입니다. - DNS:
dig +short example.com. IP로 ping이 되는데 결과가 비어 있거나 오류가 나면 리졸버 문제입니다. - 포트:
nc -zv host 443또는curl -v. 서버에서는ss -tulpn으로 서비스가 수신 중인지, 어떤 주소에서 수신하는지 확인합니다. - 방화벽:
sudo nft list ruleset,sudo iptables -L -n,sudo ufw status. - 애플리케이션:
curl -I와 서비스 로그(journalctl -u nginx)를 확인합니다.
아래에서 위로 단계를 밟고, 단계를 건너뛰지 마세요. 이렇게 하면 몇 분 안에 문제가 어느 계층에 있는지 알 수 있고, 아무 서비스나 무작정 재시작하는 일을 피할 수 있습니다.
구형 명령어와 신형 명령어
| 구형 (net-tools) | 현대적인 대체 명령어 |
|---|---|
ifconfig | ip addr, ip link |
route -n | ip route |
arp -n | ip neigh |
netstat -tulpn | ss -tulpn |
nslookup | dig |
최신 배포판에는 net-tools가 아예 설치되지 않은 경우가 많으니, 새 명령어에 익숙해지는 것이 좋습니다.
정리
일상적인 진단에는 여섯 가지 리눅스 네트워크 명령어 ip, ss, ping, traceroute, dig, curl이면 충분합니다. 주소, 경로, DNS, 포트, 애플리케이션 순서로 계층별로 점검하면 문제를 빨리 찾을 수 있습니다. 네트워크 명령어와 자주 발생하는 장애 사례는 리눅스 과정에서 실습으로 다룹니다.
자주 묻는 질문
시스템에 ifconfig 명령어가 없는 이유는 무엇인가요?
ifconfig는 구형 net-tools 패키지에 속하며, 최신 배포판에서는 기본으로 설치되지 않습니다. ip addr을 사용하거나 net-tools를 직접 설치하세요.
콘솔에서 외부 IP 주소를 어떻게 확인하나요?
curl ifconfig.me 또는 curl -4 icanhazip.com을 실행하면 인터넷으로 나갈 때 사용하는 주소가 표시됩니다. ip addr은 보통 내부 주소만 보여 줍니다.
ping과 포트 확인은 어떻게 다른가요?
ping은 ICMP로 호스트의 도달 가능성만 확인하며, 특정 서비스가 동작하는지는 알려 주지 않습니다. 포트가 연결을 받는지 확인하려면 nc -zv 호스트 포트 또는 curl을 사용하세요.
네트워크 인터페이스의 속도와 부하는 어떻게 보나요?
ip -s link로 바이트와 오류 카운터를 볼 수 있고, 실시간 부하는 iftop, nload, bmon으로 확인합니다. 두 장비 사이의 대역폭은 iperf3로 측정합니다.
DNS 서버를 임시로 바꾸려면 어떻게 하나요?
systemd-resolved를 쓰는 시스템에서는 sudo resolvectl dns eth0 1.1.1.1을 사용합니다. 일회성 확인만 필요하다면 요청에 서버를 직접 지정하는 dig @1.1.1.1 example.com이 더 간단합니다.