네트워크 트러블슈팅 · 소켓과 포트 · 실습
소켓과 포트 진단
목표
리슨 소켓을 읽고, 바인딩 주소가 원격 접속에 미치는 영향을 직접 재현하고, Connection refused 와 정상 연결의 차이를 확인합니다.
왜 중요한가
127.0.0.1:8080 으로 리슨하는 프로세스는 같은 호스트에서는 완벽히 동작하지만 바깥에서 오는 연결은 커널이 RST 로 거절합니다 — 즉 refused 가 납니다. 그래서 "로컬에서는 되는데 원격만 안 된다" 는 신고를 받으면 ss -ltnp 의 Local Address 열 한 칸만 보면 절반이 끝납니다. 반대로 그 주소가 0.0.0.0 인데도 바깥에서 timeout 이면 그때부터 방화벽과 네트워크 정책을 봅니다. 이 갈림이 조사 범위를 절반으로 줄입니다.
단계
1. /root/sock 디렉터리를 만들고, 현재 리슨 중인 TCP 소켓 목록을 /root/sock/listen.txt 로 저장하세요. :2222 가 포함돼야 합니다.
2. 0.0.0.0:8080 에서 듣는 HTTP 서버를 백그라운드로 띄우세요. 채점 시점에도 살아 있어야 합니다.
3. 127.0.0.1:8081 에서만 듣는 두 번째 서버를 띄우고, 두 소켓의 Local Address:Port 를 각각 한 줄씩 /root/sock/bind.txt 에 적으세요. (예: 0.0.0.0:8080 과 127.0.0.1:8081)
4. 127.0.0.1:8080 으로 연결이 되는지 확인한 결과를 /root/sock/nc-open.txt 로 저장하세요.
5. 아무도 듣고 있지 않은 127.0.0.1:9999 로 연결을 시도한 결과를 /root/sock/nc-refused.txt 로 저장하세요. 출력에 refused 를 뜻하는 문구가 있어야 합니다.
6. /proc/net/tcp 에서 8080 포트의 LISTEN 소켓 줄을 찾아 그대로 /root/sock/proctcp.txt 에 저장하세요.
7. 자기 인터페이스 IP(루프백 아님)로 8080 과 8081 을 각각 두드리고, 결과를 /root/sock/scope-test.txt 에 두 줄로 적으세요.8080=<open|closed> / 8081=<open|closed>
8. /root/sock/report.csv 를 만드세요. 첫 줄은 port,bind,proto 헤더이고, 그 아래에 2222, 8080, 8081 세 포트에 대해 각각 한 줄씩 적으세요. bind 는 실제 리슨 주소, proto 는 tcp 입니다.
참고
ss -ltnp,nc -zv -w 2 <ip> <port>,ip -4 -br addr show scope global조합이면 충분합니다.- 서버는
nohup python3 -m http.server 8080 --bind 0.0.0.0 >/dev/null 2>&1 &형태로 띄웁니다. /proc/net/tcp의 포트는 16진수입니다.printf '%04X\n' 8080으로 변환값을 확인하세요.- 흔한 실수 1: 7번에서 루프백 주소로 시험하면 두 포트 모두 열린 것으로 보여 차이가 드러나지 않습니다.
- 흔한 실수 2: 백그라운드 서버가 셸 종료와 함께 죽는 경우.
nohup이나setsid로 분리하세요.
단계 8개
- 리슨 소켓 확인
- 테스트 서버 띄우기
- 바인딩 범위가 다른 두 서버
- 열린 포트 확인
- 닫힌 포트 확인
- /proc/net/tcp 직접 읽기
- 바깥 주소에서 두드려 보기
- 리슨 소켓 표 만들기