상황 요약
운영 중인 Linux 서버에서 웹 애플리케이션(자바 프로세스)이 8080 포트로 떠 있는 것으로 보였지만, 로컬에서는 정상 응답이 오는데 외부 PC에서 curl / telnet으로 접속하면 쿼리는 정상적으로 보내지지만 응답이 없거나 타임아웃이 발생했다.
여기서 의문은 다음과 같았다.
- "서비스가 떠 있는데(로컬은 정상 응답), 왜 외부에서는 연결/응답이 안 올까?"
- "방화벽이 닫혀 있으면 TCP 3-way handshake도 안 되어야 하는데, 왜 어떤 시도에서는 연결이 된 것처럼 보였을까?"
1) 최초 방화벽 상태 확인: iptables는 ‘거의 다 허용’처럼 보임
먼저 방화벽 문제인줄 알아서 다음 명령어를 쳐 확인해봤다.
iptables -nL
출력:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
- policy ACCEPT는 룰에 매칭되지 않아도 기본적으로 통과라는 뜻이다.
- 이 출력만 보면 “iptables가 외부 트래픽을 강하게 막고 있지는 않다”로 보인다.
- 처음에는 서버인데 방화벽 설정이 안되어 있는 것을 보고 의아했지만 리눅스에는 아래처럼 다른 방화벽이 있다고 한다.
- 다만 여기서 중요한 함정이 있다: iptables가 비어 보여도 nftables/ufw/firewalld 등 다른 계층이 실제로 드랍 중일 수 있다.
2) 외부 PC에서 8080 테스트: “연결은 된 것 같은데 응답이 0바이트”
외부 PC에서 접속시에는 연결은 됐으나 응답이 제대로 오지 않았다.
curl -v --max-time 5 http://[server_ip]:8080
결과:
* Trying [server ip]:8080...
* Established connection to [server ip] ([server ip] port 8080) from [my ip] port 5965
> GET / HTTP/1.1
> Host: [server ip]:8080
...
* Request completely sent off
* Operation timed out after 5002 milliseconds with 0 bytes received
curl: (28) Operation timed out after 5002 milliseconds with 0 bytes received
- Established connection은 “TCP 레벨에서 연결이 성립한 것으로 보임”을 의미한다.
- 그러나 0 bytes received는 HTTP 응답(상태줄/헤더/바디) 자체를 1바이트도 받지 못했다는 뜻이다.
3) 로컬(서버 내부)에서는 즉시 정상 응답
서버에서 직접 호출 했을때는 응답이 정상적으로 왔다.
curl -v --max-time 5 http://127.0.0.1:8080/
결과:
* Connected to 127.0.0.1 (127.0.0.1) port 8080
> GET / HTTP/1.1
< HTTP/1.1 302
< Location: /user/login
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
...
< Content-Length: 0
그리고 리슨 소켓 확인:
ss -lntp | grep :8080
결과:
LISTEN 0 100 *:8080 *:* users:(("java",pid=79531,fd=276))
- 로컬에서 302가 정상적으로 나온다 → 애플리케이션 자체는 정상 동작 중. 302로 온것은 경로를 잘 못 적어서 그렇다.
- *:8080으로 LISTEN 중 → 이론상 외부 NIC로도 받을 수 있는 형태로 바인딩되어 있다(단, 방화벽/라우팅이 별개로 막을 수 있음).
- 여기까지로 결론은 “앱 다운”이 아니라 네트워크 경로/필터링 계층 문제 쪽으로 좁혀진다
4) tcpdump로 원인 파악 완료
sudo tcpdump -nn -i any tcp port 8080
외부 PC에서 접속 시도 후 결과:
ens192 In IP [my ip].3741 > [server ip].8080: Flags [S], seq ..., length 0
ens192 In IP [my ip].13728 > [server ip].8080: Flags [S], seq ..., length 0
ens192 In IP [my ip].1496 > [server ip].8080: Flags [S], seq ..., length 0
(반복)
- Flags [S]는 SYN이다. 즉 클라이언트가 “연결 시작”을 보냈다.
- 이걸 보니 핸드셰이크는 전혀 없었고 일방적인 짝사랑이라는 것을 알게되었다.
- 즉, 서버 앞단에서 무언가에 의해 가로막고 있는 것
5) 앞에서 무엇이 가로막나 확인을 해보니
이전 단계에서 서버 앞단에서 가로막고 있는 무언가가 있는 것 같다는 발견을 하고 다음 명령어를 쳐 확인을 했다.
sudo nft list ruleset
세부 사항은 서버 정보가 들어있을 수 있어 첨부를 못하지만 결과적으로 8080에 대한 포트가 열려 있지 않았다.
즉, 서버로는 신호가 들어왔지만 앞에서 막고있기 때문에 서비스에 신호가 전달되지 못하고 당연히 응답 데이터도 주지 못하는 상황이었던 것이다.
이번 일로 알게 된 것은..
기존에는 telnet / curl로 찔러서 접속이 되면 방화벽이 열려있는 것이라고 생각했고 실제로도 문제가 없었지만 해당 명령어로 접속이 된다는 것이 꼭 방화벽이 열려있다고 볼 수는 없다는 것을 알게되었다.
방화벽 열어달라고 요청하러 가야겠다..
PS. 혹시 이글을 보고 틀린 것이 있다면 꼭 좋은 가르침을 남겨주셨으면 좋겠습니다.
'프로젝트 > 개인 서버 만들기' 카테고리의 다른 글
| [개인 서버] 클라우드 호스팅에서 개인 서버로 이전 (0) | 2026.02.17 |
|---|