OCI "No Route to Host" Solution

Oracle Cloud Infrastructure Instance에서 발생하는 외부 접속 불가 문제 해결 방법

OCI "No Route to Host" Solution

문제 발생

Oracle Cloud Infrastructure에서 굴리고 있는 서버에 SSL 인증서를 발급받으려고 certbot을 사용했는데, 다음과 같은 오류가 발생했습니다.

...
Requesting a certificate for godbell.kr

Certbot failed to authenticate some domains (authenticator: nginx). The Certificate Authority reported these problems:
  Domain: godbell.kr
  Type:   connection
  Detail: x.x.x.x: Fetching http://godbell.kr/.well-known/acme-challenge/kK5kdCyd_AEcr5_WfnErBMl7jCCrLhIWcx6vvKwhzdo: Error getting validation data

Hint: The Certificate Authority failed to verify the temporary nginx configuration changes made by Certbot. Ensure the listed domains point to this nginx server and that it is accessible from the internet.

Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.

nginx -t를 통한 테스트도 성공했고, OCI Ingress 설정에서도 분명 80번 포트가 열려 있었습니다.

/var/www/certbot/.well-known/acme-challenge/ 경로에 테스트용 html 파일을 만들어 접속을 시도했으나 nginx 오류가 아닌 연결 불가 오류가 발생, curl이나 nc 등 다른 방식으로도 접속할 수가 없었습니다.

아예 No Route to Host가 떠 버리니, 아무래도 방화벽 문제라고 생각하여 iptable의 정책들을 날려 보기도 하고 ufw까지 비활성화해 보기도 했으나 여전히 연결이 불가능했고, tcpdump를 사용해 타 Ubuntu 기기에서 접속 시도를 해 기록을 살펴 보았으나 PTR? 한 줄만을 남긴 채 Three Way Handshaking이 되지도 않았습니다. 3시간에 걸친 삽질에도 답이 보이지 않아서 서버를 재부팅해 보았지만 문제는 그대로였습니다.

해결법

결국 방화벽 문제가 맞았고, superuser.com의 질답을 참고하여 해결했습니다.

Oracle 문서에 따르면, 서버에 반드시 적용되어야 하는 방화벽 정책이 있으며 이는 iptable로 적용해야 한다고 합니다. OCI 기본 제공 방화벽 정책은 /etc/iptables/rules.v4에 있습니다. 해당 파일에 다음 내용을 추가하여 80 포트와 443 포트를 개방했습니다.

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

이후 다음 명령어를 실행하여 룰을 적용했습니다.

iptables-restore < /etc/iptables/rules.v4

nc -zvw100 IP PORT로 테스트한 결과 정상적으로 접속되는 것을 확인했습니다. SSL 발급도 무사히 성공.

Certificate is saved at: /etc/letsencrypt/live/godbell.kr/fullchain.pem           
Key is saved at:         /etc/letsencrypt/live/godbell.kr/privkey.pem
This certificate expires on 2023-01-04.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for godbell.kr to /etc/nginx/sites-enabled/godbell.kr.conf
Congratulations! You have successfully enabled HTTPS on https://godbell.kr
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate