홈 서버 모니터링 시스템 Oracle Cloud 로 이전하기 (2)

홈 서버의 메트릭 정보를 Prometheus 를 통해 Oracle cloud 로 보내는 과정

홈 서버 모니터링 시스템 Oracle Cloud 로 이전하기 (2)
Photo by Luke Chesser / Unsplash

지난 글에 이어 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 또한 함께 추가하자.
GitHub - ngoduykhanh/wireguard-ui: Wireguard web interface
Wireguard web interface. Contribute to ngoduykhanh/wireguard-ui development by creating an account on GitHub.
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 로 올리는 경우 wireguardconfig 볼륨과 같아야한다.
  • 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 을 보낼 수 있다.
Monitor Proxmox VE With Prometheus And Grafana
In the video below, we show how to monitor Proxmox VE with Prometheus and Grafana
  • 위 게시물에서 아주 친절하게 설명해둬서 그것을 그대로 따라갔다.
  • 이제 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 환경과 다르기 때문이었다.
Issues with cadvisor on Synology NAS · Issue #1846 · google/cadvisor
I am having issues running cadvisor on my Synology NAS. If ran on docker, I get this: I1227 04:16:53.543073 1 storagedriver.go:50] Caching stats in memory for 2m0s I1227 04:16:53.543643 1 manager.g…
  • CPU 사용량이 다른 컨테이너에 비해 눈에 띄게 높았다. 나만 그런 상황은 아니었고, 다른 사람들도 비슷하게 겪고 있는 문제였다. 아래 이슈에서 제안해준대로 housekeeping_interval=15s 으로 15%-> 2% 로 줄일 수 있었다.
(Relatively) high CPU usage for the cadvisor container · Issue #2523 · google/cadvisor
I noticed that the CPU usage of cadvisor is the highest of all containers I’m running, which I feel is unexpected. it’s still not crazy (an average of 7%), but I feel it should be less. I’m using t…

Router 모니터링

  • Router 쪽의 상태도 알아두면 나쁘지 않겠다는 생각이 들었다. 한국에서 내 공유기로 시도를 하신 분이 있어 그대로 시도해보았다.
asus ac68u - prometheus, grafana 모니터링 하기
1. ac68u에서 정보를 수집할 node_exporter를 컴파일 한다. asus ac68u 의 경우 armv7 아키텍처를 사용하고 있다. 이 아키텍처에 맞도록 node_exporter를 크로스 컴파일 한다. git clone git@github.com:prometheus/node_exporter.git cd node_exporter GOARCH=‘arm’ GOOS=linux go build 2. node_exporter를 ac68u로 이동 후 실행 크로스 컴파일 한 node_exporter 파일을 asus ac68u로 이동한 후 실행해준다. scp ./node_exporter admin@192.168.1.1:~/ ssh admin@192.168.1.1 ’nohup ./node_exporter >/de…
  • 여기서 생각도 안한 삽질을 했는데 -_-..
  • 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 니까 안될리가. 없어 이해가 안됐다.
  • 내 컴파일 바이너리가 문젠가 싶어, 정식으로 배포된 바이너리를 받아도 마찬가지.
Illegal instruction on Asus RT-AC68U router · Issue #1822 · caddyserver/caddy
1. What version of Caddy are you using (caddy -version)? Website says 10.0.6, caddy -version gives “illegal instruction” 2. What are you trying to do? this is my first try to run Caddy on Asus RT-A…
  • 비슷한 문제를 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 에 대해서는 깊게 짚고 넘어갈 필요는 있어보인다.

결과적으로 현재 나의 모니터링 구조는 아래와 같이 되었다.