홈서버나 NAS를 이제 6년 넘게 운영해왔지만, 지금까지 외부접속을 위해서 일단 다 도메인으로 외부에 공개해놓고 사용하고 있었다. 이게 보안에 별로 좋지 않다는건 알지만 일단 편의성을 이기기는 힘드니까.
하지만 이미 사용자가 어느정도 있는 오픈소스 프로그램이 아니라 내가 바이브코딩해놓은 보안이란 전혀 고려하지 않은 코드들을 외부에 공개해두었다가는, 그야말로 익명의 외국인들과 내 서버에서 원하지 않는 동거를 하게 될 지도 모르는 일이었다.
실제로

연초에 그런일이 발생하기도 했었고, 대 바이브코딩의 시대에 이제 대응해야할것들도 점점 늘어나게 될 거 같아서 더이상 미룰수 없어진 네트워크 작업을 해보고자 한다.
보다 구체적으로는, opnsense 를 사용해서 기존의 공유기를 대체하고 tailscale 으로 홈서버에는 이 블로그 같은 외부로 공개하는 서비스들을 제외하면 모두 vpn을 사용해야만 접근할 수 있게 하는 작업을 진행할 것이다.
보다 더 나아간다면 ip대역을 적절히 쪼개주고 내부망끼리도 어느정도 통신을 막아주고 싶은데, 이건 당장 급한 작업은 아니라서 일단 위에 작업만 끝내고 나서 글을 발행하고 천천히 작업해볼 예정이다.
아래 글은 opnsense 구축 과정에서의 트러블슈팅을 간단히 정리해보았다.
네트워크작업의 귀찮은 점
일반적인 가정집 네트워크는 인터넷 ip가 한개가 배정되고, 그걸 통신사 공유기나 iptime 공유기가 받아서 각 기기에 분배한다.
그런데 만약 나처럼 그 공유기를 교체하고 싶어서 공유기를 꺼버린다면? 혹은 공유기가 원하는대로 작동해주지 않는다면?
바로 외부망 인터넷에 접근을 못하는건 물론 내부망끼리도 상호간 접근을 못하게 되어서 서버에 키보드 모니터 선부터 연결하고 다시 트러블슈팅을 시작해야한다.
일단 이 과정때문에 작업 전체에 걸쳐서 꽤나 많이 지연된 감이 있는듯.
잘 계획하고 실수없이 한번에 실행할수있다면 시간이 엄청나게 아껴질것 같다.
proxmox와 하드웨어적 준비
opnsense 는 일반적인 x86 하드웨어에 올라가는 라우터 운영체제이다.

여기서 라우터 란 일반적으로는 가정용 공유기가 수행하는 일을 칭하는건데,
- 외부 인터넷 망의 요청을 내부 컴퓨터에게 적절히 전달하고(NAT)
- 다양한 내부 컴퓨터에게 IP주소를 할당하거나 뺏고(DHCP)
- 라우터를 지나는 모든 인터넷 요청을 들여다보고 악의적 요청인 경우 방어 및 검열
하는것이 가능하다.
일반적으로 opnsense는 x86에 올리게 되고, 라우터의 특성상 당연히 인터넷 랜선을 두개 이상 연결할 방법이 있어야 한다. 랜포트를 두개 이상 지원하는 메인보드나 미니pc를 사용하거나, 혹은

이런 pcie 확장 랜카드를 설치해야 한다. 나는 불칸 에게 남는 랜카드를 운좋게 받게 되었으나...! 랜카드가 놀랍게도 케이스 유격때문인지 고정이 영 불안하게 되어서 결국 당근에서 랜카드를 하나 더샀다고 한다. 😭
아무튼 일반적으로 랜카드를 proxmox 서버에 설치하고 나면 확인할 수 있는데, 나 같은 경우에는 메인보드 내장 인터넷 포트가 enp4s0, 외장카드가 nic0 으로 표시되고 있는걸 확인할 수 있다.

이제 proxmox Network 탭에서의 저 다양한 값들이 무엇이고 어떻게 채워야 하는지 알아보자
vmbr
proxmox를 기본 상태에서 사용하고 있으면 아마 vmbr0만 존재하고, vmbr1이 존재하지 않을 것이다. vmbr은 가상화된 스위치라고 이해해주면 되고, 물리적인 랜선으로 연결되어 서로 통신가능하다고 생각해주어도 무방하다.
ports/slaves

네트워크 스위치라는것은 이렇게 환공포증 걸릴거같이 생겼고 저게 다 랜포트인데, 그럼 물리적인 실제 랜선을 가상 스위치에 연결할 수 있지 않을까? 라는 생각을 할 수 있고 그걸 실제로 가능하게 하는 입력란이 ports/slaves 란이다.
nic0 랜선(벽에서 나온 랜선)은 지금 현재 vmbr0 가상 스위치에 연결되어 있고,
enp4s0 포트(내부망 공유기와 연결된 랜선)은 현재 vmbr1 스위치 밑에 연결되어 있다.
즉 vmbr1에 연결된 VM/LXC는 내부망 공유기와 같이 묶여 들어가게 되고, vmbr0에 묶인 VM/LXC는 IP를 두개 이상 할당받을 수 있는 경우 독립적인 IP주소를 가지고 작동하게 될 것이다.
cidr
cidr은 ip할당에 사용되는 어쩌고저쩌고... 하면 크게 안와닿고 그냥 해당 가상 스위치로 묶인 인터넷 망 안에서 proxmox 서버 자체의 ip주소라고 생각하면 간단한거같다. 다시말해 사진에서의 10.0.1.1 을 입력하면 proxmox 콘솔이 열리게 되는 것이고, 뒤에 /16은 얼마나 많은 대역폭을 받아올거냐인데 일반적으로 /24 이다.
그러므로 cidr은 여러 vmbr에 대해서 가질 수 있다! 서로 다른 두개의 공유기에 proxmox가 동시 연결되어있는 이중화 구성이라면 각 공유기에서 proxmox에 접근하는 ip를 다르게 할 수도 있으며, 이 경우 cidr을 서로 다르게 두게 된다. 물론 같은거써도된다.
gateway
gateway는 정 반대로 proxmox가 외부 인터넷에 연결되기 위해 어디로 요청을 넣어야 하냐 이다. 일반적으로 공유기 및 라우터를 가리키게 되고, opnsense를 설치한다면 opnsense의 IP 주소를 가리키면 된다.
그러므로 gateway는 여러개 설정해서 동시에 존재할 수 없다! 예를들어 proxmox에서 구글에 접속한다 쳤을때 구글에 접속 가능한 경로가 두개 이상이면 무엇을 선택해야 할 지 모르게 되기 때문에, gateway는 하나만을 바라보아야 하고 보통 그 경로로 외부 인터넷과 통신하게 된다.
이 개념이 잡히지 않은채로 무작정 서버작업을 했다가 하루를 통째로 날려먹었고, 아래는 그 접근과 트러블슈팅이다.
처음 접근
먼저 일단 vmbr0이 외부망용 switch, vmbr1이 내부망용 switch가 되게 작업을 할 예정임을 기억하고 들어가자. 아래는 대략 시간순으로 했던 작업이다.
- iptime이 라우터의 역할을 하고 있고, 그 라우터 밑에 proxmox와 vmbr1이 있다.
- opnsense에서 LAN을 vmbr1로, WAN을 vmbr0으로 설정했다.
(vmbr0에는 아무것도 연결되어있지 않음) - opnsense 의 dhcp를 켜고 dhcp가 작동함을 믿고,
iptime 공유기를 외부망에서 분리하고,
공유기로 들어가던 WAN을 vmbr0에 연결한다. - 이후 iptime을 AP 모드로 변경한다.
- 인터넷이 통째로 뻗는다 🤯
이 방법의 문제점으로 예상되는 지점은 vmbr1 하나의 스위치에 iptime과 opnsense 두개가 다 라우터 역할으로 연결되어 있었다는 점이고, 그보다 큰 문제는 proxmox 가 gateway로 iptime을 여전히 보고 있는 채로 AP모드로 변경함에 따라 외부망에 못붙게 되었다는데 있다고 보인다.
opnsense의 dhcp 서버가 정상적으로 띄워졌는지를 검증할 방법도 딱히 없었고, 한 3시간쯤 끙끙대다가 새로 opnsense의 LAN에 vmbr2를 만들어서 vmbr2 속 LXC가 제대로 dhcp를 통해 ip를 할당받는지 확인할 방법을 고민하던 중 해결 방법이 떠올라 작업했다.
해결 방법
잠시동안 nested router가 되도록 했다.
- iptime의 LAN과 opnsense의 WAN(vmbr0)을 케이블로 연결하였다
- proxmox는 vmbr0을 통해 iptime과 연결되고, vmbr1을 통해서는 opnsense의 LAN과 동시에 연결되게 작업했다.
- 이상태로 opnsense의 관리콘솔을 iptime 공유기 밑에서 볼 방법이 없다는 문제가 있다
(opnsense 시점에서는 외부망이라 보안 문제로 열어주지 않는다)- 이걸 해결하기 위해 proxmox에서 opnsense 터미널을 열고
pfctl -d명령으로 방화벽을 껐다.
- 이러면 iptime 속의 내부망임에도 불구하고 "외부망" 시점에서 opnsense 관리 콘솔에 들어갈 수 있게 된다.
- 이제 opnsense에서 dhcp를 켜고, vmbr1에 cidr을 설정 밑 vmbr1에서 dhcp가 작동하는것을 확인한다.
- vmbr1 밑 내부망으로 맥북 랜케이블을 연결한다.
- proxmox etc/hosts 등등을 잡다하게 수정한다.
- 공유기를 AP모드로 변경하고 분리한 뒤, opnsense WAN과 외부망을 연결한다.
pfctl -e명령으로 WAN에서의 관리콘솔 접근을 다시 차단하고, WAN이 제대로 외부 ip를 받아오게 한다.- 외부망/내부망이 작동한다 🎉
결론
개념을 확실하게 알고 들어갔으면 빨리햇을거같은데 주먹구구식 박치기 해서 오히려 오래걸린거같다.
CIDR / gateway 개념을 잘 알고있었다면 조금 더 빨리할수있을거같아서 아쉬우나, 한 2년쯤전에 한번 시도했다가 비슷한 이유로 인터넷이 터@져서 포기했던 작업을 성공해서 뿌듯하다.
그 뒤에...
tailscale의 경우 플러그인화 되어있어서 설치하기가 되게 쉬웠고, 거의 딸깍이었다.
헤놀로지가 포트 443을 점유하고 있어서 기존에 사용하던 nginx proxy manager가 포트 444에서 운영되고 있었고, opnsense에서 443포트를 444로 라우팅 해보려고 하다가 nat reflaction 문제가 좀 발생해서 이것도 글 한편 나올 사투를 하기는 했었는데 리버스프록시를 caddy로 옮겨보는 등 뭐 다양한 개선 과정을 거치고 있다.
홈서버 업타임이 요새 낮아지고 있는데 블로그 외에는 딱히 올라간게 없어서 아마 괜찮을 거 같고, 이제 이것저것 바이브코딩해서 열심히 올려서 써야겠다!

