리눅스

리눅스 서버 포트는 열렸는데 외부 접속이 안 될 때 방화벽만 보지 말고 Listen IP와 프로세스 확인하는 법

opsnote 2026. 6. 27. 00:31

리눅스 서버에서 포트는 열려 있지만 접속이 안 될 때 ss, curl, HTTP 상태 코드, nginx 로그를 확인하는 방법을 설명하는 이미지입니다.

리눅스 서버에서 웹사이트 접속이 안 될 때 ss -lntp로 포트를 확인했는데, 분명히 80이나 443 포트가 열려 있는 경우가 있습니다.

ss -lntp | grep ':80'

예를 들어 이런 결과가 보입니다.

LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))

이러면 초보 운영자는 이렇게 생각하기 쉽습니다.

포트 열려 있네?
그런데 왜 접속이 안 되지?

여기서 중요한 점이 있습니다.

포트가 열려 있다는 것과 서비스가 정상 응답한다는 것은 다릅니다.

포트는 열려 있어도 애플리케이션이 500 오류를 내고 있을 수 있고, nginx 뒤쪽 upstream 연결이 실패할 수도 있고, localhost로만 응답하거나, 도메인과 SSL 설정이 맞지 않을 수도 있습니다.

이번 글에서는 리눅스 서버에서 포트는 열려 있는데 접속이 안 될 때 어떤 순서로 확인하면 좋은지 초보 운영자 눈높이로 정리해보겠습니다.


포트 LISTEN은 “문이 열려 있음”까지만 알려준다

ss -lntp 결과에서 포트가 LISTEN 상태로 보이면, 해당 서버에서 어떤 프로세스가 그 포트를 열고 있다는 뜻입니다.

ss -lntp

예시입니다.

LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))

이 결과로 알 수 있는 것은 아래입니다.

80 포트가 열려 있음
nginx 프로세스가 포트를 잡고 있음
외부 인터페이스에서도 받을 수 있는 상태로 보임

하지만 이것만으로는 알 수 없는 것도 있습니다.

HTTP 응답이 정상인지
애플리케이션이 정상인지
뒤쪽 upstream이 살아 있는지
SSL 설정이 맞는지
도메인 라우팅이 맞는지
브라우저에서 정상 화면이 뜨는지

즉, 포트 확인은 시작점입니다.
끝이 아닙니다.


1단계: 서버 내부에서 curl로 HTTP 응답 확인

포트가 열려 있다면 다음은 curl로 응답을 확인합니다.

curl -I http://localhost

또는 포트가 8080이라면:

curl -I http://localhost:8080

정상이라면 이런 응답이 나올 수 있습니다.

HTTP/1.1 200 OK

이 경우 서버 내부 HTTP 응답은 정상일 가능성이 있습니다.

하지만 이런 응답이 나올 수도 있습니다.

HTTP/1.1 500 Internal Server Error

또는:

HTTP/1.1 502 Bad Gateway

이 경우는 포트가 열려 있어도 서비스가 정상이라고 볼 수 없습니다.

간단히 보면:

200 = 응답 정상 가능성
403 = 권한 또는 접근 제한 확인
404 = 경로 또는 라우팅 확인
500 = 애플리케이션 오류 확인
502 = upstream 연결 실패 가능성
503 = 서비스 가용 상태 확인
504 = timeout 또는 응답 지연 확인

접속 장애에서는 “포트가 열렸다”보다 “HTTP 응답이 무엇인가”가 더 중요할 때가 많습니다.


2단계: localhost와 서버 IP 응답 비교

서버 내부에서 localhost로는 되는데 서버 IP로는 안 되는 경우가 있습니다.

먼저 localhost로 확인합니다.

curl -I http://localhost

그다음 서버 IP로 확인합니다.

curl -I http://192.168.10.10

예를 들어 localhost는 되는데 서버 IP는 실패한다면, 서비스 바인딩 주소를 의심할 수 있습니다.

ss -lntp에서 바인딩 주소를 봅니다.

ss -lntp | grep ':8080'

결과가 이렇게 보일 수 있습니다.

LISTEN 0 128 127.0.0.1:8080 0.0.0.0:* users:(("app",pid=2345,fd=10))

이 경우 애플리케이션은 127.0.0.1에만 떠 있습니다.
즉, 서버 내부에서만 접근 가능할 수 있습니다.

반대로 이렇게 떠 있으면 외부 인터페이스에서도 받을 수 있습니다.

LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("app",pid=2345,fd=10))

간단히 기억하면 좋습니다.

127.0.0.1 = 서버 내부에서만 접근
0.0.0.0 = 모든 인터페이스에서 접근 가능
특정 IP = 해당 IP 기준으로 접근

포트가 열려 있어도 어디에 열려 있는지까지 봐야 합니다.


3단계: 웹 서버와 애플리케이션 포트를 구분하기

운영 서버에서는 nginx나 Apache가 앞단에 있고, 뒤쪽에 애플리케이션이 따로 떠 있는 경우가 많습니다.

예를 들면 이런 구조입니다.

사용자
→ nginx:80
→ app:8080

이때 80 포트가 열려 있어도 8080 애플리케이션이 죽어 있으면 접속이 실패할 수 있습니다.

먼저 nginx 포트를 확인합니다.

ss -lntp | grep ':80'

그다음 애플리케이션 포트를 확인합니다.

ss -lntp | grep ':8080'

그리고 각각 curl로 확인합니다.

curl -I http://localhost
curl -I http://localhost:8080

만약 nginx는 응답하지만 app 포트가 응답하지 않는다면, 방화벽보다 애플리케이션 상태를 먼저 봐야 합니다.

systemctl status app.service --no-pager
journalctl -u app.service -n 100 --no-pager

4단계: 502 Bad Gateway라면 upstream 확인

포트는 열려 있는데 curl 결과가 502라면 자주 보이는 원인이 있습니다.

HTTP/1.1 502 Bad Gateway

502는 보통 앞단 웹 서버가 뒤쪽 애플리케이션으로 연결하지 못할 때 발생합니다.

예를 들어 nginx는 살아 있는데 upstream app이 죽었거나, 포트가 다르거나, 설정이 틀릴 수 있습니다.

확인할 것은 아래입니다.

뒤쪽 애플리케이션 포트가 열려 있는지
nginx proxy_pass 설정이 맞는지
upstream 서버 IP와 포트가 맞는지
애플리케이션 로그에 오류가 있는지

nginx 설정에서 upstream을 확인합니다.

grep -R "proxy_pass" /etc/nginx/conf.d/

예시입니다.

proxy_pass http://127.0.0.1:8080;

그럼 실제로 8080 포트가 응답하는지 확인합니다.

curl -I http://127.0.0.1:8080

이게 실패하면 nginx 문제가 아니라 뒤쪽 애플리케이션 문제일 가능성이 큽니다.


5단계: 403, 404라면 접속은 된 것이다

포트가 열려 있고 curl 결과가 403이나 404라면, 적어도 서버에서 응답은 온 것입니다.

예를 들어:

HTTP/1.1 403 Forbidden

이건 접속 자체가 안 되는 것과 다릅니다.
서버가 요청을 받았지만 권한이나 접근 설정 때문에 거부했을 수 있습니다.

확인할 것은 아래입니다.

문서 루트 권한
인덱스 파일 존재 여부
nginx allow/deny 설정
인증 설정
WAF 또는 접근 제한 설정

404라면:

HTTP/1.1 404 Not Found

이건 서버가 요청은 받았지만 해당 경로나 파일을 찾지 못했다는 뜻입니다.

확인할 것은 아래입니다.

URL 경로
location 설정
애플리케이션 라우팅
배포 경로
정적 파일 존재 여부

즉, 403이나 404는 “접속 불가”라기보다 “응답은 오지만 요청 처리 결과가 오류”에 가깝습니다.


6단계: HTTPS만 안 된다면 443과 SSL 확인

HTTP는 되는데 HTTPS만 안 되는 경우도 있습니다.

먼저 443 포트가 열려 있는지 확인합니다.

ss -lntp | grep ':443'

HTTPS 응답을 확인합니다.

curl -I https://example.com

만약 인증서 문제가 의심되면 아래처럼 확인할 수 있습니다.

openssl s_client -connect example.com:443 -servername example.com

처음부터 SSL을 깊게 볼 필요는 없지만, 아래 상황이라면 SSL이나 443 설정을 봐야 합니다.

http는 정상
https는 실패
443 포트가 LISTEN 아님
인증서 만료 오류
도메인과 인증서 이름 불일치
로드밸런서 SSL 종료 설정 문제

포트가 열려 있어도 HTTP와 HTTPS는 확인 지점이 다릅니다.


7단계: 도메인과 Host 헤더 확인

웹 서버는 도메인에 따라 다른 설정을 적용할 수 있습니다.

서버 IP로는 접속이 되는데 도메인으로는 안 되는 경우도 있습니다.

도메인 확인:

nslookup example.com

또는:

dig example.com

도메인이 올바른 IP를 바라보는지 확인합니다.

그리고 nginx 같은 웹 서버는 server_name 설정에 따라 응답이 달라질 수 있습니다.

서버 내부에서 Host 헤더를 넣어서 확인할 수 있습니다.

curl -I -H "Host: example.com" http://127.0.0.1

이 명령어는 “127.0.0.1로 접속하되, 도메인은 example.com으로 요청한 것처럼” 테스트하는 방식입니다.

이런 경우에 도움이 됩니다.

IP 접속은 되는데 도메인 접속은 안 됨
nginx server_name 설정이 여러 개임
가상호스트 설정이 의심됨
도메인별 라우팅이 다름

실제 운영 서버에서는 도메인과 설정명을 가짜 값으로 바꿔 기록하는 습관도 필요합니다.


8단계: 로그에서 실제 오류 확인

포트, curl, 도메인을 확인했다면 로그를 봐야 합니다.

nginx라면:

tail -n 100 /var/log/nginx/error.log

Apache라면:

tail -n 100 /var/log/httpd/error_log

systemd 서비스라면:

journalctl -u nginx -n 100 --no-pager

애플리케이션 서비스라면:

journalctl -u app.service -n 100 --no-pager

에러만 빠르게 보고 싶다면:

grep -i -E "error|exception|timeout|refused" app.log

로그에서 자주 보는 단서는 아래입니다.

connection refused
upstream timed out
permission denied
no such file
SSL certificate problem
database connection failed

포트가 열려 있는데 접속이 안 되는 상황은 로그에 답이 남아 있는 경우가 많습니다.


운영 서버에서 확인하는 순서

포트는 열렸는데 접속이 안 될 때 저는 보통 아래 순서로 확인합니다.

1. ss로 포트 LISTEN 상태 확인
2. localhost curl 확인
3. 서버 IP curl 확인
4. HTTP 상태 코드 확인
5. 웹 서버와 애플리케이션 포트 구분
6. 502라면 upstream 확인
7. 403/404라면 권한과 라우팅 확인
8. HTTPS만 안 되면 SSL과 443 확인
9. 도메인과 Host 헤더 확인
10. 웹 서버와 애플리케이션 로그 확인

명령어로 정리하면 아래와 같습니다.

ss -lntp | grep ':80'
curl -I http://localhost
curl -I http://192.168.10.10
curl -I http://localhost:8080
curl -I -H "Host: example.com" http://127.0.0.1
tail -n 100 /var/log/nginx/error.log

이 순서로 보면 “포트는 열렸는데 왜 안 되지?”라는 상황을 조금씩 좁혀갈 수 있습니다.


초보 운영자가 자주 하는 실수

포트가 열려 있을 때 자주 하는 실수는 아래입니다.

LISTEN만 보고 정상이라고 판단함
curl 응답 코드를 보지 않음
localhost와 서버 IP 차이를 확인하지 않음
nginx 포트와 app 포트를 구분하지 않음
502를 방화벽 문제로만 의심함
도메인과 Host 헤더를 확인하지 않음
로그를 마지막까지 안 봄

특히 이 문장은 꼭 기억해야 합니다.

포트가 열려 있다는 건 연결을 받을 준비가 됐다는 뜻이지, 정상 응답을 보장한다는 뜻은 아니다.

접속 장애에서 포트 확인은 중요하지만, 그것만으로 판단하면 반쪽짜리 확인이 됩니다.


실무 보고 예시

포트는 열려 있지만 500 오류가 나는 경우:

대상 서버의 80 포트 LISTEN 상태는 확인되나, 서버 내부 curl 테스트 결과 HTTP 500 응답이 확인됩니다.
방화벽보다는 애플리케이션 내부 오류 가능성이 있어 애플리케이션 로그를 추가 확인하겠습니다.

포트는 열려 있지만 502가 나는 경우:

nginx 80 포트는 LISTEN 상태이나 curl 테스트 결과 502 응답이 확인됩니다.
뒤쪽 애플리케이션 upstream 연결 상태와 app 포트 응답 여부를 추가 확인하겠습니다.

localhost는 되는데 서버 IP로 안 되는 경우:

localhost 기준 응답은 확인되나 서버 IP 기준 요청은 실패하고 있습니다.
서비스 바인딩 주소 및 리스닝 인터페이스 설정을 추가 확인하겠습니다.

서버 내부는 정상이고 외부만 실패하는 경우:

서버 내부 curl 및 포트 LISTEN 상태는 정상으로 확인됩니다.
외부 접속만 실패하는 상황으로 보여 방화벽, 로드밸런서, DNS 구간을 추가 확인하겠습니다.

이렇게 보고하면 “포트는 열렸는데 안 됩니다”보다 원인 방향이 훨씬 명확해집니다.


정리

리눅스 서버에서 포트가 열려 있다고 해서 웹사이트 접속이 정상이라는 뜻은 아닙니다.

먼저 확인할 것은 아래입니다.

ss -lntp
curl -I http://localhost
curl -I http://서버IP
curl -I http://localhost:8080
tail -n 100 /var/log/nginx/error.log

초보 운영자라면 이 문장만 기억해도 좋습니다.

포트는 열렸는데 접속이 안 되면, 포트 다음은 HTTP 응답과 로그를 봐야 한다.

웹사이트 접속 장애도 결국 확인 → 판단 → 조치 순서가 중요합니다.

4. 관련 글 연결 문구

포트가 열려 있어도 HTTP 응답이 정상이라는 뜻은 아닙니다.
아래 글도 함께 보면 접속 장애 확인 흐름을 이어서 이해하기 좋습니다.

  • 리눅스 서버 웹사이트 접속이 안 될 때 방화벽부터 보기 전 확인 순서
  • curl과 nc 차이: 언제 뭘 써야 할까
  • 리눅스 서버 도메인 접속이 안 될 때 nslookup으로 DNS 확인하는 법
  • 리눅스 서버 접속이 안 될 때 curl로 HTTP 응답 확인하는 법

5. 다음 글 예고 문구

다음 글에서는 curl은 정상 응답이 오는데 브라우저에서는 화면이 안 뜰 때, 도메인, HTTPS, 캐시, 리다이렉트, 프론트엔드 경로를 어떻게 확인하면 좋은지 정리해보겠습니다.