재부팅시 Iptables 설정 Reset 대응
얼마전 Oracle Cloud 에서 이메일이 하나 왔다. 마이그레이션을 위해 인스턴스를 정해진 날짜안에 "수동 재부팅" 혹은 날짜이후 자동 재부팅 된다는 내용이었다.
오라클 서버에서 재부팅 후 꼭 실행 되어야 하는것들과 그렇지 않은것은 전부 설정을 해두었기 때문에 재부팅을 해도 사이드 이펙트가 없을것으로 판단하여 재부팅을 진행 하였다.
- 문제 상황
재부팅 이후 인스턴스가 정상적으로 작동하는것을 콘솔에서 확인 이후 SSH 접속을 시도 했지만
"Connection Refused" 와 함께 접속이 되지 않았다.
해당 인스턴스는 Password 접속 방식이 아닌, SSH Key 접속 방식이어서 Oracle Console 의 "Local Connection" 도 불가능하여
설정 자체 수정이나 확인 불가한 상황.
더 자세한 내용과 해결방법은 맨 아래의 "번외" 부분 참고!
원인 분석
해당 서버에서는 SSH 의 기본 포트인 22 번을 비활성화 하고, 별도의 포트를 통해 22 port 로 forwarding 을 수행하고 있었는데
- Oracle Cloud Console : 별도의 TCP Port Open
- 인스턴스 내에서 iptables nat PREROUTING {Port} to 22 로 특정 포트 접속시 22로 포워딩
위의 흐름으로 SSH 접속을 하게 해두었다.
ssh user@{IP} -p {Port}
iptables로 내부에서 포워딩을 진행했기에 해당 부분이 문제일것 같아서, iptables 에 대해서 알아보니 아래와 같은 내용을 확인 할 수 있었다.
iptables 로 직접 추가한 nat, REDIRECT, ACCEPT 와 같은 Rule 은 재부팅 하면 저장이 되지 않고 날라간다.
-> iptables 의 rule 은 휘발성이다.
그런데 Nginx 의 Connection Rule 은 정상적으로 동작하고 있었다.
이때 서비스 포트들의 경우 아래처럼 오픈을 해두었었다.
> iptables 80 port open
> ufw 80 enable
왜 ufw 로 허용한 설정들은 적용이 되고 있을까?
- ufw
Uncomplicated Firewall(ufw) 는 iptables 위에서 동작하는 추상화 레이어이며,
Linux/debian 계열에서 사용되는 방화벽 관리 프로그램이다.
네트워크 트래픽이 들어올 수 있는 통로를 설정, 통제를 수행한다.
ufw allow {port}
명령어를 통해, 특정 port 에 대한 ingress, egress, 프로토콜 등을 설정 할 수 있다.
다만 port 차단/허용에 대해서만 지원하며, nat(포트포워딩, 리다이렉트), 패킷조작에 대한 기능은 지원하지 않는다.
해당 개념을 왜 언급했냐면
ufw 로 특정 port 에 대한 설정을 하면 재부팅시 iptables 에 해당 내용을 반영한다.
즉 ufw 로 설정해준 80,443,Nginx 에 대한 프로토콜 설정들은 ufw 를 통해 iptables 에 자동으로 반영 되었지만
수동으로 추가해준 nat PREROUTING 설정은 반영되지 않았던것이다.(nat 는 불가)
해결 방안
휘발성인 iptables 의 설정을 재부팅이 되어도 유지하게 하려면 무언가 조치를 취해야 한다.
이때 선택지는 2가지 정도로 볼 수 있을것 같다.
- iptables-persistent 로 수동 저장
- systemd 부팅시 자동 적용 (Script 방식)
1. iptables-persistent 방식
해당 방법이 가장 간편하게 사용할 수 있는 방법일것 같다.
iptables 의 rules 을 수동으로 저장 하고, 부팅시 저장해놓은 rules 를 읽어와 동작하게 하는 pacakge 이다.
해당 패키지 내부에는 netfilter-persistent 가 같이 설치되며, 수동 저장시 생성되는 "rules.v4" 파일을 읽어
시스템에 load 하게 하는 방식이다.
nat 포함 전체가 저장되며, ufw 와 혼용시 주의해야 할 점도 존재한다.
# 설치 및 사용 Command
# 설정 추가
$iptables -t nat ...
# 설치
$sudo apt uipdate
$sudo apt install iptables-persistent
# 저장
$sudo iptables-save > /etc/iptables/rules.v4
# NAT 포함 전부 저장 됨!
2. systemd 부팅시 자동 적용(스크립트 방식)
재부팅 이후 지정된 shell script 를 실행하게 하여, rule 을 추가 하게 하는 방식.
iptables-persistent 에 비해 유연하게 사용할 수 있다는 장점이 존재한다(필요한것만 사용)
해당 스크립트는 실행시점을 조정 할 수 있다.
- if-pre-up.d/ : 네트워크 인터페이스 올리기 직전 실행(systemd 초기화 이후)
- rc.local : 대부분의 데몬 실행 이후 실행
어떤 시점에서 실행할지는 크게 상관이 없다.
"if-pre-up.d" 의 경우 systemd 가 시작(초기화) 된 이후에 실행 됨으로 iptables 명령어를 사용할 수 있는 시점이다.
필자의 경우 nat 명령어 하나만 추가 하면 되기에, 충돌 가능성이 있는 iptables-persistent 를 사용하지 않고
해당 방법을 사용 했다.
설정 방법은 3단계를 거치기만 하면 된다.
- 파일 생성
- 파일 내부에 실행할 스크립트 작성
- 실행 권한 부여
# 파일 생성
$sudo vi /etc/network/if-pre-up.d/iptables-redirect
# 파일내 스크립트 작성!!! ```안의 내용만
```
#!/bin/sh
iptables -t nat ...
```
# 실행권한 부여
$sudo chmod +x /etc/network/if-pre-up.d/iptables-redirect
단계들을 차례로 진행이 정상적으로 되었다면, 재부팅시 systemd 가 초기화된 이후 해당 스크립트가 실행 되며 nat 관련 설정이 적용되며
정상적으로 ssh 에 접속이 되는것을 확인 할 수 있다.
번외
Oracle Cloud 의 해당 인스턴스는 3번째 재설치(초기화) 를 진행 하였으며, 재설치가 거듭되며 누락되는 설정들이 존재했다.
필자의 경우 나름 보안을 신경쓴다고
- Password 로그인 방식 -> SSH Key 접속 방식으로만 로그인 가능
- 기본 포트 접속 차단 -> 22 ~ 25
를 Oralce Console 단에서 차단 해뒀다.
이번처럼 SSH 접속이 불가할때, Oracle Console 내부에서 Local Connection 이나, OCI 로 접속등 전부 불가한 아이러니한 상황이 발생했다.
(주인조차 들어가지 못하는 서버,,,)
Local Connection 을 통해 접속은 됬지만 Login 부분에서 막혔었다.
Root 계정으로 로그인 불가, 기본계정 패스워드 사용X 설정 때문이었다....
결국 Oracle Console 내에서 22 port 를 오픈하여 서버 인스턴스에 접속 후에 iptables nat 설정을 다시하고 나서야 해결이 되었다.
SSH Key 로 로그인하도록 설정 한다면, 보안적으로는 좋을지 몰라도 이런 상황에서 접속조차 불가한 상황이 발생할줄은 몰랐다..
더 좋은 방법이 있을지 이번기회를 통해 찾아봐야겠다.
당시 찾아본 방법은 아래와 같다.
- boot volume 마운트해서 수동 복구 -> 새로운 인스턴스 연결 후 sshd_config 설정 바꾸는 방법.
- GRUB 진입 하여 sshd_config 설정 변경
- Oracle Cloud Metadata Sciprt 사용 -> ssh 설정 변경, 키 추가 sciprt 실행 가능 (Cloud-init)
* 번외속 번외: 이런 접속 수단 완전 차단 상황이 가끔 벌어지는 상황이라고 한다.. (필자처럼 어중간하게 하면) 대책을 잘 세워놓도록 하자
'Linux' 카테고리의 다른 글
Nginx SSL(HTTPS) 적용 - Certbot(Let's encrypt) (0) | 2025.03.26 |
---|---|
[Linux] iPad 로 서버 콘솔 접속(Termius), ssh key 인증 접속방법 (2) | 2025.02.13 |
[Linux] Ubuntu - OOM(Out Of Memory) 메모리 부족과 대응 (1) | 2024.09.18 |
[Linux] alias로 자주쓰는 커맨드 설정 (0) | 2023.10.25 |
[Linux]Ubuntu 설치 (Docker 컨테이너) 및 테스트(Ubuntu 초기 설정 Shell Script 제공) (0) | 2023.08.12 |
댓글