리눅스에서 호스팅 중인 서비스가 외부로부터 접속이 안 될 때 문제 확인 방법
친구가 호스팅 한 주피터 노트북이 로컬에서는 접속이 되는데 인터넷 공인 IP로는 접속이 안 됐습니다.
친구를 도와주면서 제시한 절차를 한번 공유봅니닷.
내가 제시한 진단 방법은 다음과 같다.
1. tcpdump로 패킷이 들어오고 나가는지 확인한다
tcpdump를 실행한채로 외부에서 접속해본다.
어떤 포트로 패킷이 들어오고 나가는지 캡처하려면 sudo tcpdump port 포트 명령어로 실행한채로 기다리고 있으면 된다.
캡처한 파일을 내보내서 와이어샤크에서 확인할 수도 있다.
참고. 내 기억으로 tcpdump가 인바운드는 iptable보다 우선이고 아웃바운드는 아니였다
- https://serverfault.com/questions/233302/will-tcpdump-see-packets-that-are-being-dropped-by-iptables
CASE 1. 패킷이 들어오고 내 서버 밖으로 잘 나가면
서버 상에서 돌아가는 애플리케이션 탓일 가능성이 높다.
애플리케이션 설정을 확인해본다.
CASE 2. 패킷이 들어오는데 내 서버 밖으로 안 나가면
방화벽이나 서버 어플리케이션이 listen하지 않고 있는 것이다.
첫 번째로 방화벽에서 막혔는지 확인한다.
- iptable 설정을 출력해서 해당 포트와 아이피가 allow 되어있는지 확인해본다.
- (우분투 한정) ufw 확인
- 원인인지 모르겠으면 일단 꺼보자
두 번째로 서버 어플리케이션 설정 확인한다.
간단한 웹서버를 띄워서 외부에서 접속되는 지 확인해보자.
ex. python으로 간단하게 띄울 수 있다. python3 -m http.server 포트
이게 접속이 된다면 애플리케이션 설정을 잘못한 것이다.
CASE 3. 패킷 자체가 아예 안 찍히면
컴퓨터로 패킷이 도달하지 못했다는 것이다.
99% NAT나 DNS같은 외부적인 문제이다.
tcpdump가 찍힐 때까지 공유기 포트포워딩이나 DNS 설정을 확인하고 수정해본다.
혹시나 유동IP를 쓰면 공인IP가 바뀌지 않았는지 확인한다.
2. 애플리케이션이 listen 중인지 확인해보자.
이런 명령어들로 확인해보자.
sudo fuser -vn tcp 포트sudo netstat -tnlp
내가 띄운 포트로 아무것도 안 떠있다면 애플리케이션이 아예 listen하지 않고 있는 것이다.
애플리케이션 설정을 확인하거나 다시 실행해서 띄워본다.
암튼 이거면 대부분 문제 해결 가능하다고 생각했는데 해결이 안 돼서 슬펐다.
로컬에서는 잘 접속됐고 0.0.0.0/0 대상으로 잘 listen하고 있었다. 공인 아이피로 접속하면서 tcpdump로 패킷이 오는 것도 확인했다.
와이파이의 포트포워딩도 잘되어 있었고 공인 아이피도 맞았고 ufw도 껐었고 주피터 노트북 설정도 잘 되어 있었다.
간단히 웹 서버로 띄워서 외부에서 접속해서 잘 접속되나 테스트할 때 tcpdump로 패킷은 오는 것은 확인했다. 그런데 외부에 위치한 브라우저는 페이지를 못 가져왔다. iptable 문제인 것 같긴한데 정확한 원인은 못 찾았다.
원인이 뭘까용...? ㅠ
댓글
이 글 공유하기
다른 글
-
TLS 1.3 with Wireshark
TLS 1.3 with Wireshark
2025.03.20 -
Email Protocol 비교 :: POP3, IMAP, SMTP
Email Protocol 비교 :: POP3, IMAP, SMTP
2020.03.21 -
DigitalOcean으로 네트워크 실습용 서버 만들기
DigitalOcean으로 네트워크 실습용 서버 만들기
2020.02.29