LabHub
배우기 러닝패스 코스

ネットワークトラブルシューティング

ソケットとポートの診断

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

리슨 소켓을 읽고, 바인딩 주소가 원격 접속에 미치는 영향을 직접 재현하고, Connection refused 와 정상 연결의 차이를 확인합니다.

왜 중요한가

127.0.0.1:8080 으로 리슨하는 프로세스는 같은 호스트에서는 완벽히 동작하지만 바깥에서 오는 연결은 커널이 RST 로 거절합니다 — 즉 refused 가 납니다. 그래서 "로컬에서는 되는데 원격만 안 된다" 는 신고를 받으면 ss -ltnpLocal 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:8080127.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 는 실제 리슨 주소, prototcp 입니다.

참고

리슨 소켓 확인

/root/sock 디렉터리를 만들고, 현재 리슨 중인 TCP 소켓 목록을 /root/sock/listen.txt 로 저장하세요. :2222 가 포함돼야 합니다.

TCP 리슨 소켓만, 이름 해석 없이, 프로세스까지 보는 옵션 조합입니다. sshd 가 2222 에서 돌고 있습니다.

테스트 서버 띄우기

0.0.0.0:8080 에서 듣는 HTTP 서버를 백그라운드로 띄우세요. 채점 시점에도 살아 있어야 합니다.

python3 의 내장 HTTP 서버를 백그라운드로 띄우세요. 채점 시점에도 살아 있어야 하므로 nohup 이나 setsid 를 함께 쓰는 편이 안전합니다.

바인딩 범위가 다른 두 서버

127.0.0.1:8081 에서만 듣는 두 번째 서버를 띄우고, 두 소켓의 Local Address:Port 를 각각 한 줄씩 /root/sock/bind.txt 에 적으세요. (예: 0.0.0.0:8080127.0.0.1:8081)

python3 -m http.server 에는 바인딩 주소를 지정하는 옵션이 있습니다. 두 서버의 Local Address 열을 비교해 보세요.

열린 포트 확인

127.0.0.1:8080 으로 연결이 되는지 확인한 결과를 /root/sock/nc-open.txt 로 저장하세요.

nc 의 -z 는 데이터를 보내지 않고 연결만 시도합니다. -v 를 붙여야 결과 문장이 나옵니다.

닫힌 포트 확인

아무도 듣고 있지 않은 127.0.0.1:9999 로 연결을 시도한 결과를 /root/sock/nc-refused.txt 로 저장하세요. 출력에 refused 를 뜻하는 문구가 있어야 합니다.

아무도 듣고 있지 않은 포트로 연결하면 커널이 RST 를 돌려줍니다. 그 결과 문구를 그대로 저장하세요.

/proc/net/tcp 직접 읽기

/proc/net/tcp 에서 8080 포트의 LISTEN 소켓 줄을 찾아 그대로 /root/sock/proctcp.txt 에 저장하세요.

포트는 16진수로 적혀 있습니다. 8080 을 16진수로 바꾸면 무엇이 될까요? 상태 컬럼의 0A 는 LISTEN 입니다.

바깥 주소에서 두드려 보기

자기 인터페이스 IP(루프백 아님)로 8080 과 8081 을 각각 두드리고, 결과를 /root/sock/scope-test.txt 에 두 줄로 적으세요. 8080=<open|closed> / 8081=<open|closed>

루프백이 아니라 자기 인터페이스 IP 로 접속해야 차이가 드러납니다. 두 포트의 결과가 달라야 합니다.

리슨 소켓 표 만들기

/root/sock/report.csv 를 만드세요. 첫 줄은 port,bind,proto 헤더이고, 그 아래에 2222, 8080, 8081 세 포트에 대해 각각 한 줄씩 적으세요. bind 는 실제 리슨 주소, prototcp 입니다.

CSV 는 쉼표로 구분합니다. 헤더 줄을 포함하고, 앞에서 띄운 두 포트가 모두 들어가야 합니다.