리눅스에서 호스팅 중인 서비스가 외부로부터 접속이 안 될 때 문제 확인 방법
친구가 호스팅 한 주피터 노트북이 로컬에서는 접속이 되는데 인터넷 공인 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 문제인 것 같긴한데 정확한 원인은 못 찾았다.
원인이 뭘까용...? ㅠ
댓글
이 글 공유하기
다른 글
-
Email Protocol 비교 :: POP3, IMAP, SMTP
Email Protocol 비교 :: POP3, IMAP, SMTP
2020.03.21 -
DigitalOcean으로 네트워크 실습용 서버 만들기
DigitalOcean으로 네트워크 실습용 서버 만들기
2020.02.29