UDP 는 핸드셰이크가 없어 응답만으로 판단할 수 없으므로 수신 측에서 패킷이 실제로 도착했는지 보는 것이 가장 확실하다. 서버에서 tcpdump 로 대기하고 클라이언트에서 패킷을 보내는 방식으로 확인한다.
# [서버] 대기
tcpdump -i any udp port 9999 -n -v
# [클라이언트] 전송
echo "test" | nc -u <서버IP> 9999
echo "test" > /dev/udp/<서버IP>/9999
| 상황 | 클라이언트 | 서버 tcpdump |
|---|---|---|
| 포트 열림 + 서비스 동작 | 응답 있음 | 패킷 보임 |
| 포트 닫힘(서비스 없음) | ICMP port-unreachable | 패킷 보임 |
| 방화벽 DROP | 무응답 · 타임아웃 | 패킷 안 보임 |
| 방화벽 REJECT | ICMP unreachable 즉시 | 패킷 안 보임 |
정리하면 서버 tcpdump 에 패킷이 안 보이면 방화벽 또는 라우팅 문제이고, 보이는데 응답이 없으면 서비스 · 애플리케이션 문제다.
# 클라이언트에서 패킷이 실제로 나가는지
tcpdump -i any udp port 9999 -n
# 로컬 방화벽
iptables -L OUTPUT -n -v # 클라이언트
iptables -L INPUT -n -v # 서버
firewall-cmd --list-all
# 경로 추적 — 특정 홉에서 * * * 이면 그 구간 장비가 차단
traceroute -u -p 9999 <서버IP>
# 서버에서 해당 포트를 듣는 서비스가 있는지
ss -ulnp | grep 9999
클라이언트에서 패킷이 나가는 것이 확인되면 중간 경로 또는 서버 방화벽이고, 클라이언트에서도 안 보이면 클라이언트 쪽 문제다.
nc -zv -w 3 <서버IP> 80
telnet <서버IP> 80
nmap -p 80,443,8080 <서버IP>
tcpdump -i any tcp port 80 -n
ss -tlnp
| 관찰 | 의미 |
|---|---|
SYN → SYN-ACK → ACK |
포트 열림 |
SYN → RST |
포트 닫힘(서비스 없음) |
SYN → 무응답 |
방화벽 DROP |
SYN → ICMP unreachable |
방화벽 REJECT |
-i any 로 잡히지 않는 경우가 있어 ip a 로 실제 인터페이스를 확인해 지정한다. -c 1 을 주면 한 개 잡고 즉시 종료되어 화면에 출력되기 전에 끝나 보일 수 있다. 종료 시 나오는 1 packet received by filter 는 통계이며 패킷이 실제로 도달했다는 뜻이다.
송신 패킷에 찍히는 bad cksum 0x7b64 -> 0xd64e! 는 NIC checksum offload 때문이다. tcpdump 는 NIC 가 체크섬을 채우기 전 커널 단계에서 캡처하므로 나가는 패킷의 체크섬 오류는 정상이다. 들어오는 패킷의 bad cksum 만 실제 손상을 뜻한다.
ethtool -k eth0 | grep checksum # tx-checksumming: on 이면 정상 동작