Oracle Cloud 서버 접속 문제는 네트워크 보안 규칙, 호스트 방화벽, 서비스 리스너를 구분해 진단합니다. 이 글의 세 계층은 진단을 위한 분류이며 OCI에만 존재하는 세 종류의 방화벽을 뜻하지 않습니다. Apache Listen은 서비스 설정입니다. DNS·라우팅·HTTP Host·TLS SNI와 인증서·애플리케이션 응답도 결과에 영향을 줄 수 있습니다.
이 글은 실제 서브도메인 배포 과정에서 겪은 "Connection refused" 문제를 진단하고 해결한 과정을 정리한 것입니다.
1 → 2 → 3은 확인 순서의 한 예입니다. 아래 출력과 “통과” 표시는 당시 사례의 단서이며 현재 환경의 정상 판정 기준이 아닙니다. Connection refused만으로 방화벽 차단을 확정할 수 없고, IP 주소에 대한 403도 의도한 VHost·WAF 경유·TLS 인증 성공을 입증하지 않습니다. -k는 인증서 검증을 생략합니다.
사례에 제시된 출력은 HTTPS(443)의 403 응답과 HTTP(80)의 연결 거부입니다. 이것만으로 서비스 정상이나 차단 계층을 확정할 수 없습니다.
# 443: 사례 출력 예시
curl -v https://<서버IP> -k --connect-timeout 10
# HTTP/1.1 403 Forbidden ← HTTP 응답 관찰; 의도한 서비스/TLS 검증은 별도
# 80: 거부
curl -v http://<서버IP> --connect-timeout 10
# Connection refused ← 연결 실패; 원인 계층은 별도 확인
서버 내부에서도 접속이 안 된다면 외부 방화벽을 더 열기 전에 서비스 실행과 리스닝 상태부터 확인해야 한다. 요청이 어디까지 도달했는지에 따라 아래 점검 범위를 좁힐 수 있다.
OCI 콘솔에서 확인:
Networking → Virtual Cloud Networks → VCN → Subnets → Security Lists
→ Ingress Rules 확인
이 사례에서는 80 포트 규칙이 보였지만, 규칙 존재만으로 해당 연결의 허용이나 도달성을 확정할 수 없습니다. 실제 VNIC의 subnet에 연결된 Security Lists와 VNIC가 속한 모든 NSGs의 허용 규칙을 함께 보고, 방향·출발지/목적지·프로토콜·포트·stateful/stateless 처리와 반환 트래픽 조건을 대조해야 합니다.
실제 적용되는 라우팅도 별도로 확인해야 하며, 엔드포인트에 ZPR 보안 속성이 적용되어 있다면 ZPR 정책의 허용 조건도 충족해야 합니다.
Source Port Range는 송신 측 포트, Destination Port Range는 수신 서비스의 목적지 포트를 뜻합니다. HTTP 서비스가 80 포트를 사용하는 예에서는 80을 목적지 포트와 대조합니다.# firewalld 서비스 확인
sudo firewall-cmd --list-services
# dhcpv6-client http https ssh ← 서비스 목록 예시; 활성 zone/규칙은 별도 확인
# iptables 확인
sudo iptables -L -n | grep -E "80|DROP|REJECT"
# 사례의 필터링된 목록 예시; 전체 정책/규칙 판정 불가
위 출력만으로는 해당 연결을 호스트 방화벽이 허용하는지 확정할 수 없습니다. zone을 지정하지 않은 서비스 목록은 기본 zone을 대상으로 하므로 실제 인터페이스·source에 적용되는 활성 zone과 다를 수 있습니다.
필터링된 iptables 출력은 체인 기본 정책·규칙 순서·jump 대상·다른 테이블·IPv6를 포함한 전체 ruleset을 보여주지 않습니다. 사용 중인 backend와 유효 runtime 정책을 확인하고 permanent 설정과의 차이도 검토하기 전에는 판정을 보류합니다.
# Apache 리스닝 포트 확인
sudo ss -tlnp | grep -E ":80 |:443 "
# 사례 출력에서 443만 관찰됨; 필요한 80 리스너/도달성은 별도 확인
# Listen 설정 확인
grep -r "Listen" /etc/httpd/conf/ /etc/httpd/conf.d/ | grep -v "#"
# /etc/httpd/conf.d/ssl.conf: Listen 443 https ← 443만 있음
# httpd.conf의 Listen 80이 주석 처리됨
80 포트의 리스너가 없다는 관찰은 이 사례의 단서이며, WAF 사용 여부만으로 그 원인이나 필요한 포트를 단정할 수 없습니다.
직접 HTTPS에 80 포트가 항상 필요한 것은 아니지만 HTTP 서비스나 HTTP-01 검증 경로에는 80 도달성 검토가 필요합니다. 아래 변경 예제는 일괄 실행하지 말고 기존 서비스와 origin 보호 경계에 대한 별도 검토 후에만 적용 여부를 결정해야 합니다.
sudo sed -i 's/^#Listen 80$/Listen 80/' /etc/httpd/conf/httpd.conf
sudo apachectl configtest && sudo systemctl restart httpd
# 확인
sudo ss -tlnp | grep ":80 "
# LISTEN 0 511 *:80 *:* ← 리스너 관찰 예시; 종단 간 정상 판정 아님
다음 표의 명령과 결과는 빠른 관찰 단서입니다. DNS 응답은 승인된 직접 연결 또는 프록시 경로와 대조해야 하며, 규칙 존재·DROP 부재·LISTEN·Syntax OK·일부 로그의 오류 부재만으로 종단 간 정상이나 WAF 보호를 확정하지 마세요.
외부 접속 문제를 살펴볼 때 참고할 관찰 항목입니다:
| 순서 | 확인 대상 | 명령어 | 관찰과 한계 |
|---|---|---|---|
| 0 | DNS | dig 도메인 +short | DNS 응답을 의도한 직접/프록시 경로와 대조 |
| 1 | OCI Security List | 콘솔 → Ingress Rules | 규칙 존재만으로 적용 범위·도달성 판정 불가 |
| 2a | firewalld | sudo firewall-cmd --list-services | 서비스 목록 일부; 활성 zone·규칙 확인 필요 |
| 2b | iptables | sudo iptables -L -n | grep DROP | 필터링된 출력; DROP 부재로 허용 판정 불가 |
| 3 | Apache Listen | sudo ss -tlnp | grep ":포트 " | 리스너 관찰; 외부 도달성은 별도 확인 |
| 4 | Apache 설정 | sudo apachectl configtest | 구문 검사 결과; 서비스 정상 보장 아님 |
| 5 | 에러 로그 | sudo tail -20 /var/log/httpd/error_log | 일부 로그 관찰; 오류 부재로 정상 판정 불가 |
아래 도식·표는 가능한 구성 예시이며, 현재 계정 설정의 검증 결과가 아닙니다. WAF 사용이나 DNS CNAME만으로 origin 직접 접근이 자동 차단되지는 않습니다. 리다이렉트 코드, origin 프로토콜·포트 및 허용 출발지는 실제 설계에 따라 달라집니다.
이 구조에서는:
| 동작 | 설명 |
|---|---|
| origin 포트 요구사항 | WAF의 리다이렉트만으로 80 불필요를 단정하지 말고 서비스·검증 경로를 따로 검토 |
| origin 직접 접근 제한 | WAF 사용만으로 자동 차단되지 않음; 의도한 출발지·경로에 대한 별도 제한 필요 |
| WAF 경유 DNS 구성 | Edge 정책이 제공한 CNAME과 DNS 구성을 대조; CNAME 자체는 origin 접근 제한이 아님 |
같은 origin IP에 직접 연결 서브도메인을 추가하기 전에는 기존 WordPress의 Host/SNI와 기본 VHost, 네트워크·애플리케이션 접근 제한을 함께 검토해야 합니다.
정적 사이트를 위한 접근 확대가 다른 사이트의 WAF 경계를 약화하지 않도록 별도 설계·승인이 필요합니다. 이 글만으로 현재 서버에 우회가 가능하다고 결론 내릴 수 없으며, IP 직접 요청을 임의로 시험하지 마세요.