홈 서버 모니터링 시스템 Oracle Cloud 로 이전하기 (2)
홈 서버의 메트릭 정보를 Prometheus 를 통해 Oracle cloud 로 보내는 과정
지난 글에 이어 Oracle Cloud 로 모니터링 시스템을 옮기는 과정을 마저 진행해보겠다.
VPN 설치
- 모니터링 서버에서 내부 서비스의 경우 외부로 노출될 이유가 없다. 따라서, VPN 을 통해서만 해당 서버에 접속 할 수 있도록 한다.
- 기존에 OpenVPN 을 통해서 VPN 을 구축하고 있어, 해당 서버도 OpenVPN 을 활용하도록 할 것이다.
docker container 올리기
- Wireguard / OpenVPN 두 가지 선택지가 있다.
- 기존의 경우 라우터에서 OpenVPN 을 지원하여 OpenVPN 을 바탕으로 통신하였다. 그러나 최근 OpenVPN 보다 WireGuard 쪽으로 트렌드가 넘어간 것으로 보인다. OpenVPN 에 비해서 경량화 되어있으며 빠르고 보안적으로도 안전하다. 따라서 이번 기회에 VPN 을 wireguard 로 변경해보고자 한다.
- 이미지는 다음 이미지를 사용할 것이다.
https://hub.docker.com/r/linuxserver/wireguard
- wireguard 의 경우 gui 를 자체 제공하지 않는다. 이를 제공하는 web ui 또한 함께 추가하자.
version: "3.8"
name: wireguard
services:
wireguard:
image: lscr.io/linuxserver/wireguard:latest
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE #optional
environment:
- PUID=1003
- PGID=1003
- TZ=Etc/UTC
- SERVERURL=${SERVER_URL}me #optional
- SERVERPORT=51820 #optional
- PEERS=1 #optional
- PEERDNS=auto #optional
- INTERNAL_SUBNET=10.13.13.0 #optional
- ALLOWEDIPS=0.0.0.0/0 #optional
- PERSISTENTKEEPALIVE_PEERS= #optional
- LOG_CONFS=true #optional
volumes:
- ./data/wireguard:/config
- /lib/modules:/lib/modules #optional
ports:
- 5000:5000
- 51820:51820/udp
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
webui-wireguard:
image: ngoduykhanh/wireguard-ui
container_name: webui-wireguard
cap_add:
- NET_ADMIN
network_mode: service:wireguard
environment:
- SENDGRID_API_KEY
- EMAIL_FROM_ADDRESS
- EMAIL_FROM_NAME
- SESSION_SECRET
- WGUI_USERNAME=${USER}
- WGUI_PASSWORD=${PW}
- WG_CONF_TEMPLATE
- WGUI_MANAGE_START=false
- WGUI_MANAGE_RESTART=false
logging:
driver: json-file
options:
max-size: 50m
volumes:
- ./data/db:/app/db
- ./data/wireguard:/etc/wireguard
발생한 문제들
- wireguard 가 갑작스럽게 연결이 안되는 문제가 있었다. 이상하게 핸드폰에서는 연결이 되는데, mac 에서만 연결이 안됐다.
- Peer 충돌로 인한 문제였던 것으로 보인다. 동시에 여러 device 에서 접근 하는 경우에 주의좀 해야할 것 같다.
- web-ui 연결하면서도 네트워크 관련하여 문제가 발생했다.
- webui-wireguard 와 wireguard container 가 서로 연결되어있어야한다.
- 포트 개방을 web-ui 에서 하는 것이 아니다 (?) 왠지는 모르겠지만 그렇게 설정이 되어있더라.
/etc/wireguard
부분의 경우 docker container 로 올리는 경우wireguard
의config
볼륨과 같아야한다.
- DNS 문제가 종종 생길 수도 있다. 내 라우터의 경우 pi-hole DNS 와 연결되어있는데 딱히 문제가 발생하지는 않았다. 다만 문제가 발생한다는 보고가 몇 개 있다.
NPM Proxy
- VPN 으로 접속하여 내부 망 경로로 접속을 해도 된다. 하지만, 그냥 NPM 자체 기능을 통해 source ip 를 제한할 수 있다. NPM 에서 access list 를 설정하고, 이를 해당하는 도메인으로 지정했다.
- VPN 을 통하지 않은 경로의 경우 403 이 나오며 접속이 불가해졌다.
Home server 모니터링
Network
- VPN 을 통해서 두 네트워크를 잇는 방법을 처음에 고려했다.
- 다음과 같이 생각해보았다.
- Home server 의 docker container 로 wireguard 올리기
- Oracle VM 과 wireguard 로 연결
- container 간 VPN 통신으로 정보를 전달한다.
- 그러나 해당 방식으로 구현할 경우 다음과 같은 문제가 발생한다.
- pve-exporter 의 경우 pve node 로부터 정보를 받아오는데, 이는 home network 에서만 들고 올 수 있다.
- 그러나 해당 컨테이너를 Oracle 쪽의 VPN 과 묶으면 home network 쪽으로 접근할 수가 없다.
- 다음과 같이 생각해보았다.
- 따라서, 앞서 NPM 을 통해 접근 제어를 한 방식으로 접근해보려고 한다.
- 맘에는 안들지만... 현재 찾아본 바로는 별 수가 없는 것 같다.
- pve-exporter 에서 전달해주는 metric 을 외부로 개방하되, access list 를 통해서 oracle vm 측에서만 들고 올 수 있도록 설정했다.
pve-exporter
- proxmox node 의 경우 pve-exporter 를 통해서 prometheus 로 metric 을 보낼 수 있다.
- 위 게시물에서 아주 친절하게 설명해둬서 그것을 그대로 따라갔다.
- 이제 proxmox 노드 상태도 이 곳에서 관찰 할 수 있다.
cAdvisor
- 이왕 모니터링 하는 겸, 컨테이너들의 상태도 모니터링하고자한다.
- cAdvisor 는 컨테이너 모니터링에 특화된 툴이다. 마찬가지로 docker container 를 통해서 올릴 수 있다.
cadvisor:
image: gcr.io/cadvisor/cadvisor
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
- metric 을 prometheus 에서 수집할 수 있도록 추가해준다.
- job_name: cadvisor
scrape_interval: 15s
static_configs:
- targets:
- cadvisor:8080
- grafana dashboard 또한 추가하면 이렇게 컨테이터네 대한 정보를 수집할 수 있다.
- 각 서버마다 cAdvisor 를 설치해주었고, metric을 수집하도록하였다.
- Synology 의 경우 문제가 발생했었다.
volume
연결에서의 문제인데, linux 환경과 다르기 때문이었다.
- CPU 사용량이 다른 컨테이너에 비해 눈에 띄게 높았다. 나만 그런 상황은 아니었고, 다른 사람들도 비슷하게 겪고 있는 문제였다. 아래 이슈에서 제안해준대로
housekeeping_interval=15s
으로 15%-> 2% 로 줄일 수 있었다.
Router 모니터링
- Router 쪽의 상태도 알아두면 나쁘지 않겠다는 생각이 들었다. 한국에서 내 공유기로 시도를 하신 분이 있어 그대로 시도해보았다.
- 여기서 생각도 안한 삽질을 했는데 -_-..
- AC68U 와 AC68P 의 차이일지도 모르겠다. ARMv7 아키텍처로 동일한데, 위 방식으로 컴파일하면
Illegal instruction
이 발생했다. Linux RT-AC68P-8AF8 2.6.36.4brcmarm #1 SMP PREEMPT Sat Jan 1 13:43:55 EST 2022 armv7l ASUSWRT-Merlin
라고 나온다. ARMv7 에 linux 니까 안될리가. 없어 이해가 안됐다.- 내 컴파일 바이너리가 문젠가 싶어, 정식으로 배포된 바이너리를 받아도 마찬가지.
- 비슷한 문제를 ac68u 에서 겪은 사람이 있었다. ARMv7 로하면 안되고 ARMv5로 해야 된단다. (?) 혹시나 싶어 ARMv5 버전을 가져와서 사용하니 잘 작동한다.
- SNMP 로 자료 수집이 가능하긴하다.
결과
홈 서버에 대한 모니터링 도구를 모두 Oracle Cloud 로 옮겼다. 기존에는 Proxmox node 에 대해서만 모니터링하고 있었으나, 이번 기회에 다음과 같이 모니터링 도구를 추가했다.
- Proxmox node 모니터링
- pve-exporter
- Oracle Cloud VM모니터링
- node-exporter
- 호스팅 중인 web service 모니터링
- blackbox-exporter
- docker container 모니터링
- cAdvisor
또한 Grafana 를 통해 이를 시각화하였으며, Grafana 의 알림 도구를 통해 hosting 중인 서비스가 down 되는 경우 즉각 알림이 오도록 조치했다. 테스트 결과 아주 잘 작동하고 있다.
이전과 마찬가지로 개인 VM 이기에 내부 망에 접근하기 위해 VPN 을 설정하였고, 이번에는 Wireguard 를 활용하였다. 여러 VPN 을 굳이 사용할 이유도 없고, OpenVPN 에 비해 Wireguard 가 이점이 있어, 홈 서버 또한 Wireguard 로 전환하는 것을 검토해볼 필요가 있다. 다만, Router 단에서 직접 접속을 하는 것을 원하는 상황인데, 현재 펌웨어에서는 Wireguard 를 지원하지 않아 그 방법을 모색해봐야할 것이다.
앞으로 추가로 기기를 추가하거나 VM 을 늘린다면 현재 작업한 내용을 수동으로 일일히 추가해야한다. 좀 귀찮은 작업이라서 자동으로 할 수 있는 방법에 대해서도 찾아볼 필요가 있다.
또한, Cloud 와 홈 서버의 네트워크 관련한 작업이 은근히 골칫거리였다. 현재는 단순하게 ACL 을 통해 접근을 제한하고 있다. 하지만 최대한 격리가 필요한 환경에서는 서로 다른 네트워크를 묶어야할텐데 이에 대해서 지식이 전무하여 어떻게 해야할 지 몰랐다. 아마 site-to-site VPN 같은 서비스를 Cloud 제공 업체에서 제공하는 것으로 알고 있는데 조금 더 찾아봐야할 것 같다.
이번에 사용한 툴들에 대해서 각각 공부해볼만한 것이 꽤 많다. 현재는 단순하게 툴의 조합을 맞춘 것이지만, 이후 백엔드 서버를 구성하거나 한다면 내기 필요한 모니터링 요소를 관찰 할 수 있도록 만들어야할 것이다. 적어도, prometheus 에 대해서는 깊게 짚고 넘어갈 필요는 있어보인다.
결과적으로 현재 나의 모니터링 구조는 아래와 같이 되었다.