서버에 IP 주소가 보이는데도 SSH나 웹 접속이 되지 않는다면, 먼저 그 주소가 인터넷에서 직접 접근 가능한 공인 IP인지, 내부 네트워크에서만 쓰는 사설 IP인지 구분해야 합니다. 이 글은 단순히 공인 IP와 사설 IP 차이를 설명하는 데서 끝내지 않고, 리눅스 서버 운영 중 외부 접속이 막혔을 때 어떤 순서로 원인을 나눠 확인해야 하는지 정리한 문서입니다.
이 글에서 해결할 문제
서버 접속 문제는 겉으로 보면 비슷하게 보입니다. 터미널에서는 Connection timed out이 나오거나, 브라우저에서는 사이트가 열리지 않고, 사용자는 서버가 꺼졌다고 생각하기 쉽습니다. 하지만 실제 원인은 서버 다운이 아니라 다음 중 하나인 경우가 많습니다.
- 접속하려는 IP가 사설 IP라서 외부 인터넷에서 직접 접근할 수 없음
- 공인 IP는 있지만 공유기, 방화벽, 클라우드 보안 그룹에서 포트가 막힘
- 서버 내부 서비스는 실행 중이지만 외부에서 들어오는 경로가 열려 있지 않음
- 도메인이 예전 IP를 가리키거나, 공인 IP와 내부 IP를 혼동함
- 통신사 공유기 또는 CGNAT 환경이라 포트 포워딩만으로 해결되지 않음
리눅스 서버를 운영하다 보면 처음에는 애플리케이션 문제처럼 보였지만, 실제로는 IP 종류와 네트워크 경로 문제였던 경우가 자주 있습니다. 그래서 외부 접속 오류를 볼 때는 앱을 재시작하기 전에 IP부터 확인하는 편이 원인을 좁히기 쉽습니다.
먼저 확인할 핵심 요약
| 확인 항목 | 판단 기준 | 의미 |
|---|---|---|
| 서버 내부 IP | ip addr에서 확인 |
서버 네트워크 인터페이스에 붙은 주소 |
| 외부에서 보이는 IP | curl ifconfig.me 등으로 확인 |
인터넷으로 나갈 때 사용되는 공인 IP 또는 NAT된 주소 |
| 사설 IP 여부 | 10.x.x.x, 172.16~31.x.x, 192.168.x.x |
외부 인터넷에서 직접 접속하기 어려운 내부 주소 |
| 서비스 포트 | ss -tulpen으로 확인 |
SSH, Nginx, Node.js 등이 실제로 대기 중인지 확인 |
| 방화벽 상태 | sudo ufw status verbose |
서버 방화벽에서 포트가 막혔는지 확인 |
공인 IP와 사설 IP 차이
공인 IP는 인터넷에서 전 세계적으로 구분되는 주소입니다. 외부의 다른 컴퓨터가 내 서버를 찾을 때 기준이 되는 주소이며, VPS나 클라우드 서버에서는 관리 화면에 공인 IP가 표시되는 경우가 많습니다.
사설 IP는 집, 사무실, 데이터센터 내부망처럼 제한된 네트워크 안에서만 사용하는 주소입니다. 대표적인 사설 IP 범위는 다음과 같습니다.
10.0.0.0~10.255.255.255172.16.0.0~172.31.255.255192.168.0.0~192.168.255.255
예를 들어 집 안의 리눅스 서버가 192.168.0.25를 가지고 있다면 같은 와이파이에 연결된 노트북에서는 접속될 수 있습니다. 하지만 집 밖의 인터넷 환경에서는 이 주소로 직접 접속할 수 없습니다. 외부 사용자는 공유기 또는 통신사가 가진 공인 IP까지만 접근할 수 있기 때문입니다.
실제 서버 운영 중 헷갈리기 쉬운 지점
1. 서버 안에서 보이는 IP와 외부 접속 IP가 다를 수 있음
리눅스 서버에서 ip addr로 확인한 주소가 항상 외부 접속 주소는 아닙니다. 클라우드 환경에서는 서버 내부에는 사설 IP가 붙어 있고, 관리 콘솔에서 공인 IP를 별도로 연결해 외부 접속을 처리하는 구조도 흔합니다.
ip addr show
위 명령어는 서버의 네트워크 인터페이스에 설정된 IP를 보여줍니다. 여기서 10., 172.16~31., 192.168.으로 시작하는 주소가 보인다면 사설 IP일 가능성이 높습니다.
외부로 나갈 때 어떤 IP로 보이는지는 다음처럼 확인할 수 있습니다.
curl -4 ifconfig.me
curl -4 https://icanhazip.com
curl 명령이 설치되어 있지 않은 최소 설치 서버에서는 먼저 패키지 설치가 필요할 수 있습니다. 운영 서버에서는 패키지 설치 전 현재 배포판과 패키지 상태를 확인하는 것이 좋습니다.
lsb_release -a
apt-cache policy curl
2. 같은 와이파이에서는 되는데 밖에서는 안 되는 경우
집이나 사무실 내부에서는 192.168.0.25 같은 주소로 서버에 접속됩니다. 그런데 휴대폰 LTE나 외부 네트워크에서는 접속이 안 됩니다. 이때 서버가 고장 난 것이 아니라, 외부에서 내부 서버로 들어오는 경로가 없는 경우가 많습니다.
이 상황에서는 공유기의 공인 IP, 포트 포워딩, 서버 방화벽, 서비스 포트가 함께 맞아야 합니다. 하나만 맞아도 되는 구조가 아니기 때문에 순서대로 확인해야 합니다.
3. 공인 IP가 있어도 접속이 항상 되는 것은 아님
공인 IP가 있다고 해서 SSH나 웹 접속이 자동으로 열리는 것은 아닙니다. 클라우드 서버라면 보안 그룹에서 22, 80, 443 포트를 허용해야 할 수 있고, 서버 내부 방화벽인 UFW가 차단하고 있을 수도 있습니다. 또한 Nginx나 애플리케이션이 해당 포트에서 실제로 대기 중이어야 합니다.
처음 의심하기 쉬운 원인과 실제 원인의 차이
| 겉으로 보이는 증상 | 처음 의심하기 쉬운 원인 | 실제로 자주 확인해야 할 원인 |
|---|---|---|
| SSH 접속 시간 초과 | 서버가 꺼짐 | 사설 IP로 접속 중, 포트 미개방, 보안 그룹 차단 |
| 웹사이트가 열리지 않음 | Nginx 오류 | 80/443 포트 미개방, 공인 IP 불일치, DNS가 다른 IP를 가리킴 |
| 내부에서는 접속됨 | 외부 PC 문제 | 공유기 포트 포워딩 누락 또는 통신사 NAT 환경 |
| 도메인은 안 되고 IP는 됨 | 서버 설정 문제 | DNS A 레코드, www와 루트 도메인 차이, 전파 시간 |
SSH 접속 문제를 볼 때도 마찬가지입니다. 처음에는 서버 자체가 죽었다고 생각하기 쉽지만, 실제로는 접속 명령어의 IP, 포트, 사용자명, 키 파일, 방화벽 중 하나가 맞지 않는 경우가 많습니다. 그래서 접속 오류가 나면 바로 서비스를 재시작하기보다 접속 대상 IP가 공인 IP인지부터 확인하는 습관이 도움이 됩니다.
실제로 자주 막히는 상황
상황 1. 집에 둔 리눅스 서버에 밖에서 SSH 접속이 안 됨
서버 내부 IP가 192.168.0.25이고 SSH 포트가 22번이라고 가정해 보겠습니다. 같은 공유기에 연결된 노트북에서는 다음 명령으로 접속될 수 있습니다.
ssh user@192.168.0.25
하지만 외부 인터넷에서는 이 명령이 동작하지 않습니다. 192.168.0.25는 내부 네트워크에서만 의미가 있는 주소이기 때문입니다. 외부에서 접속하려면 공유기의 공인 IP로 접근하고, 공유기에서 내부 서버로 포트 포워딩이 되어 있어야 합니다.
상황 2. VPS 서버인데 10.x.x.x 주소만 보고 접속하려 함
일부 클라우드 서버는 내부 네트워크 주소로 10.x.x.x를 사용하고, 외부 접속용 공인 IP를 별도로 제공합니다. 서버 안에서 ip addr만 보고 10.x.x.x 주소로 SSH 접속을 시도하면 외부에서는 실패할 수 있습니다.
이 경우에는 클라우드 관리 화면에서 공인 IP 또는 Elastic IP, Floating IP처럼 표시되는 주소를 확인해야 합니다. 명칭은 업체마다 다를 수 있습니다.
상황 3. 서버 내부에서는 웹 앱이 응답하는데 외부에서는 안 됨
Node.js 앱이나 Nginx를 운영할 때 서버 내부에서만 응답하고 외부에서는 열리지 않는 경우가 있습니다. 이때는 내부 서비스 상태와 외부 네트워크 경로를 분리해서 봐야 합니다.
curl -I http://127.0.0.1
ss -tulpen | grep -E ':80|:443|:22|:3000'
curl로 내부 응답이 확인되는데 외부에서만 안 된다면, 애플리케이션 코드보다 방화벽, 보안 그룹, Nginx 프록시, 포트 개방 문제를 먼저 확인하는 편이 빠릅니다.
원인 분리 순서
접속 문제를 확인할 때는 한 번에 모든 설정을 바꾸지 말고, 아래 순서대로 원인을 나누는 것이 좋습니다.
- 접속하려는 IP가 사설 IP인지 공인 IP인지 확인
- 서버 내부에서 해당 서비스가 실행 중인지 확인
- 서버가 해당 포트에서 대기 중인지 확인
- 서버 내부 방화벽 상태 확인
- 클라우드 보안 그룹 또는 공유기 포트 포워딩 확인
- 도메인을 사용한다면 DNS가 올바른 공인 IP를 가리키는지 확인
1단계: 서버 내부 IP 확인
ip -4 addr show
출력에서 inet 192.168.x.x, inet 10.x.x.x, inet 172.16~31.x.x가 보이면 사설 IP일 가능성이 높습니다. 이 주소는 내부 통신에는 사용할 수 있지만, 외부 인터넷에서 직접 접근하는 주소로 사용하기 어렵습니다.
2단계: 외부에서 보이는 IP 확인
curl -4 ifconfig.me
이 값은 서버가 인터넷으로 나갈 때 외부에 보이는 주소입니다. 다만 이 주소가 항상 내가 제어할 수 있는 공인 IP라는 뜻은 아닙니다. 가정용 회선이나 일부 통신사 환경에서는 공유기 바깥에서 다시 통신사 NAT를 거칠 수 있습니다.
3단계: 서비스 포트 확인
ss -tulpen
이 명령은 현재 서버에서 어떤 포트가 열려 있고 어떤 프로세스가 대기 중인지 확인할 때 사용합니다. 조회 명령이므로 서버 설정을 변경하지 않습니다. 다만 일부 프로세스 정보는 권한에 따라 제한적으로 보일 수 있습니다.
예를 들어 SSH가 22번 포트에서 대기 중인지 보려면 다음처럼 확인할 수 있습니다.
ss -tulpen | grep ':22'
4단계: UFW 방화벽 상태 확인
sudo ufw status verbose
이 명령은 UFW 상태를 확인합니다. 방화벽 규칙은 보안에 직접 영향을 주므로, 상태를 확인하지 않고 포트를 여는 명령부터 실행하지 않는 것이 좋습니다. 특히 SSH 포트를 잘못 막으면 원격 서버에 다시 접속하지 못할 수 있습니다.
5단계: 도메인 DNS 확인
도메인을 사용한다면 도메인이 현재 공인 IP를 가리키는지도 확인해야 합니다.
dig +short example.com
curl -I http://example.com
dig가 설치되어 있지 않다면 Ubuntu/Debian 계열에서는 dnsutils 패키지가 필요할 수 있습니다. 운영 서버에서는 불필요한 패키지 설치를 줄이는 것이 좋으므로, 로컬 PC에서 DNS 조회를 해도 됩니다.
잘못된 예시
잘못된 예시 1. 사설 IP로 외부 SSH 접속 시도
ssh ubuntu@192.168.0.25
이 명령은 같은 내부 네트워크에서는 가능할 수 있지만, 카페나 회사 외부망에서는 실패하는 것이 자연스럽습니다. 192.168.0.25는 인터넷 전체에서 내 서버를 찾을 수 있는 주소가 아닙니다.
잘못된 예시 2. 내부에서만 열린 포트를 외부 접속 문제로 오해
curl http://127.0.0.1:3000
이 명령이 성공한다고 해서 외부에서 http://공인IP:3000 접속이 된다는 뜻은 아닙니다. 앱이 127.0.0.1에만 바인딩되어 있거나, 방화벽과 보안 그룹에서 3000번 포트가 막혀 있을 수 있습니다. 운영 환경에서는 보통 앱 포트를 직접 외부에 열기보다 Nginx 같은 리버스 프록시를 통해 80/443 포트로 노출하는 구성이 많습니다.
잘못된 예시 3. 방화벽을 확인하지 않고 포트부터 여는 경우
sudo ufw allow 22/tcp
위 명령은 SSH 포트를 여는 명령입니다. 상황에 따라 필요할 수 있지만, 무작정 실행할 명령은 아닙니다. SSH 포트를 전체 인터넷에 열면 공격 시도가 늘어날 수 있고, 이미 다른 포트를 SSH로 사용 중인 서버에서는 의미가 없을 수도 있습니다. 먼저 현재 SSH 포트와 방화벽 상태를 확인해야 합니다.
수정 예시
예시 1. VPS 서버에서 올바른 접속 IP 찾기
VPS 서버라면 서버 안의 사설 IP와 클라우드 관리 화면의 공인 IP를 구분합니다.
- 서버 내부에서
ip -4 addr show로 내부 IP 확인 - 클라우드 관리 화면에서 공인 IP 확인
- SSH 접속은 공인 IP 기준으로 시도
- 보안 그룹에서 SSH 포트가 허용되어 있는지 확인
ssh -p 22 ubuntu@203.0.113.10
203.0.113.10은 예시용 IP입니다. 실제로는 서버 제공업체에서 안내하는 공인 IP를 사용해야 합니다. 사용자명도 배포판과 이미지에 따라 ubuntu, debian, 직접 만든 사용자명 등으로 다를 수 있습니다.
예시 2. 집 서버에서 외부 접속 경로 만들기
집이나 사무실 공유기 뒤에 있는 서버라면 외부 사용자는 서버의 사설 IP가 아니라 공유기의 공인 IP로 접근합니다. 그리고 공유기에서 특정 포트를 내부 서버로 전달해야 합니다.
| 항목 | 예시 |
|---|---|
| 외부 접속 주소 | 공유기의 공인 IP |
| 외부 포트 | 2222 |
| 내부 서버 IP | 192.168.0.25 |
| 내부 포트 | 22 |
이 경우 외부에서는 다음처럼 접속합니다.
ssh -p 2222 user@공유기_공인_IP
단, 통신사 회선이 CGNAT 환경이면 공유기에서 포트 포워딩을 설정해도 외부 접속이 되지 않을 수 있습니다. 공유기 WAN IP와 외부에서 조회한 IP가 다르다면 이 가능성을 확인해야 합니다.
예시 3. UFW에서 특정 IP만 SSH 허용
방화벽 변경은 보안과 원격 접속에 영향을 줄 수 있습니다. 아래는 예시이며, 실행 전 현재 접속 세션을 유지하고 서버 제공업체의 콘솔 접속 방법이 있는지 확인하는 것이 안전합니다.
먼저 현재 상태를 확인합니다.
sudo ufw status verbose
ss -tulpen | grep ':22'
특정 관리 IP에서만 SSH를 허용하려면 다음과 같은 방식으로 제한할 수 있습니다.
sudo ufw allow from 198.51.100.20 to any port 22 proto tcp
198.51.100.20은 예시용 IP입니다. 실제로는 본인이 접속하는 고정 IP나 사무실 IP를 사용해야 합니다. 접속 위치의 IP가 자주 바뀐다면 이 방식이 불편할 수 있습니다.
수정 후 확인 방법
설정을 바꾼 뒤에는 내부 확인과 외부 확인을 나눠서 진행합니다. 내부에서 되는지, 외부에서 되는지, 도메인으로 되는지를 구분해야 같은 문제를 반복해서 추적하지 않습니다.
1. 서버 내부에서 서비스 확인
systemctl status ssh --no-pager
ss -tulpen | grep ':22'
systemctl status는 서비스 상태를 확인하는 명령입니다. 서비스를 재시작하지 않으므로 비교적 안전하게 현재 상태를 볼 수 있습니다.
2. 외부 네트워크에서 접속 확인
같은 와이파이가 아닌 휴대폰 테더링이나 다른 네트워크에서 접속을 확인합니다. 내부망에서만 테스트하면 포트 포워딩이나 공인 IP 문제를 놓치기 쉽습니다.
ssh -p 2222 user@공인_IP
3. 웹 서버라면 HTTP 응답 확인
curl -I http://공인_IP
curl -I http://example.com
IP로는 열리는데 도메인으로 안 열리면 DNS 문제일 가능성이 있습니다. 반대로 도메인도 IP도 안 열린다면 방화벽, 보안 그룹, 웹 서버 상태를 함께 확인해야 합니다.
4. 로그로 원인 좁히기
브라우저 화면이나 터미널 오류만 보면 원인을 놓치기 쉽습니다. 서비스 상태와 로그를 함께 보면 네트워크 문제인지 서비스 문제인지 구분하기가 쉽습니다.
journalctl -u ssh -n 50 --no-pager
sudo tail -n 50 /var/log/nginx/error.log
Nginx 로그 파일 위치는 배포판과 설치 방식에 따라 다를 수 있습니다. 로그 확인은 설정을 바꾸는 작업이 아니므로, 오류 원인을 좁힐 때 먼저 실행해 볼 수 있습니다.
재발 방지 체크리스트
- 서버 내부 IP와 외부 공인 IP를 메모해 둡니다.
- 사설 IP 범위인
10.,172.16~31.,192.168.주소를 외부 접속 주소로 착각하지 않습니다. - VPS에서는 클라우드 관리 화면의 공인 IP와 보안 그룹을 함께 확인합니다.
- 집 서버에서는 공유기 WAN IP와 외부에서 조회한 IP가 같은지 확인합니다.
- SSH, HTTP, HTTPS 포트가 실제로 열려 있는지
ss -tulpen으로 확인합니다. - 방화벽 규칙을 바꾸기 전
sudo ufw status verbose로 현재 상태를 먼저 봅니다. - 방화벽 변경 전에는 현재 SSH 접속을 끊지 말고, 콘솔 접속 방법을 확보합니다.
- 도메인을 연결했다면 A 레코드가 현재 공인 IP를 가리키는지 확인합니다.
- 내부 테스트와 외부 테스트를 구분합니다.
- 접속이 안 될 때는 서비스 재시작보다 IP, 포트, 방화벽, 로그 순서로 확인합니다.
핵심 정리
공인 IP와 사설 IP 차이는 서버 접속 문제를 볼 때 가장 먼저 확인해야 하는 기준입니다. 공인 IP는 인터넷에서 접근할 수 있는 주소이고, 사설 IP는 내부 네트워크에서만 의미가 있는 주소입니다. 하지만 공인 IP가 있다고 해서 접속이 항상 되는 것은 아니며, 포트, 방화벽, 보안 그룹, 공유기 설정, DNS가 함께 맞아야 합니다.
서버 운영에서는 화면에 보이는 오류보다 먼저 현재 IP가 어떤 종류인지, 서비스가 어떤 포트에서 대기 중인지, 외부에서 들어오는 경로가 열려 있는지를 확인하는 편이 문제를 빠르게 좁히는 데 도움이 됩니다.
FAQ
Q1. 공인 IP가 있으면 SSH 접속이 바로 되나요?
아닙니다. 공인 IP가 있어도 SSH 서비스가 실행 중이어야 하고, 해당 포트가 서버 방화벽과 클라우드 보안 그룹에서 허용되어 있어야 합니다. 사용자명, 포트, SSH 키 설정도 맞아야 합니다.
Q2. 192.168.x.x 주소로 외부에서 접속할 수 없는 이유는 무엇인가요?
192.168.x.x는 사설 IP 범위입니다. 같은 공유기 내부에서는 접속할 수 있지만, 외부 인터넷에서는 해당 주소로 직접 서버를 찾을 수 없습니다. 외부 접속이 필요하다면 공인 IP, 포트 포워딩, 방화벽 설정을 함께 확인해야 합니다.
Q3. 내부에서는 웹사이트가 열리는데 외부에서는 안 열리면 무엇부터 봐야 하나요?
먼저 서버 내부에서 서비스가 응답하는지 확인하고, 그다음 포트 대기 상태, UFW 방화벽, 클라우드 보안 그룹 또는 공유기 포트 포워딩을 확인합니다. 도메인을 사용한다면 DNS가 현재 공인 IP를 가리키는지도 함께 봐야 합니다.