별도의 원격서버에 prometheus server와 grafana를 설치해 OpenWrt 모니터링 하는 방법을 소개합니다.(아래 스크린샷 참조)
준비물
- prometheus server, grafana 설치용 : 구글 클라우드(GCP) 또는 오라클 클라우드(OCI) VM 인스턴스
- OpenWrt용 grafana dashboard json 화일 : http://pastebin.com/nQdZM89w
- 라우터 ddns 설정을 하지 않았다면 ddns설정을 하세요.(아래 예시는 duckdns를 사용합니다.)
구성도

1. prometheus node exporter 설치
OpenWrt 패키지 설치
OpenWrt에 prometheus node exporter를 설치합니다.
opkg update
opkg install prometheus-node-exporter-lua prometheus-node-exporter-lua-nat_traffic prometheus-node-exporter-lua-netstat prometheus-node-exporter-lua-openwrt prometheus-node-exporter-lua-wifi prometheus-node-exporter-lua-wifi_stations
prometheus node exporter 설정
vi /etc/config/prometheus-node-exporter-lua
외부에서 접근가능하도록 listen_interface 'loopback' 을 listen_interface '*' 로 수정합니다.
config prometheus-node-exporter-lua 'main' option listen_interface '*' option listen_ipv6 '0' option listen_port '9100'
firewall 포트개방
vi /etc/config/firewall
방화벽은 prometheus-server가 data를 수집할 수 있도록 tcp 9100포트를 개방합니다. <super.duckdns.org's ip>는 prometheus-server가 설치될 서버의 ip로 수정하십시요.
... config rule option name 'Allow-prometheus' option src 'wan' option proto 'tcp' option src_ip '<super.duckdns.org ip>' option dest_port '9100' option target 'ACCEPT' option enabled '1'
prometheus node exporter, firewall 재시작 및 동작 확인
/etc/init.d/prometheus-node-exporter-lua restart
/etc/init.d/firewall restart
netstat -an | grep -i 9100
curl 192.168.1.1:9100/metrics
netstat listen ip 가 127.0.0.1이 아닌 0.0.0.0 임을 확인하십시요. 또한 curl이나 웹브라우저 9100포트로 접속했을 경우 prometheus node exporter의 웹서버가 제대로 자료를 뿌려주는지 확인합니다.
[email protected]:~# netstat -an | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN
[email protected]:~# curl 192.168.1.1:9100/metrics
# TYPE node_scrape_collector_duration_seconds gauge
# TYPE node_scrape_collector_success gauge
# TYPE node_nf_conntrack_entries gauge
node_nf_conntrack_entries 148
# TYPE node_nf_conntrack_entries_limit gauge
node_nf_conntrack_entries_limit 16384
node_scrape_collector_duration_seconds{collector="conntrack"} 0.0009601116180419
.
.
.
wifi_stations{ifname="mesh0"} 1
node_scrape_collector_duration_seconds{collector="wifi_stations"} 0.0045309066772461
node_scrape_collector_success{collector="wifi_stations"} 1
2. 서버 설치(prometheus-server, grafana, autossh)
저는 구글 클라우드에 OS는 ubuntu 20.4 LTS minimal로 하였으며, 방화벽은 미리 tcp 3000, 9090포트를 개방했습니다.
시스템 업그레이드 및 기본 패키지 설치
minimal 설치시 기본적으로 필요한 패키지를 설치합니다. minimal이 아닌경우 root 사용로 변경(su)만 하세요.
sudo passwd root
su
apt update && apt upgrade
apt install vim landscape-common net-tools iputils-ping bridge-utils dnsutils
docker 엔진 설치
참고 : https://docs.docker.com/engine/install/ubuntu/
apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt install docker-ce docker-ce-cli containerd.io
docker-compose 설치
참고 : https://docs.docker.com/compose/install/
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod 755 /usr/local/bin/docker-compose
docker-compose 구성
root 유저에서 일반유저로 변경하고 docker 컨테이너의 설정화일이 들어갈 디렉토리 dockerrr를 홈 디렉토리에 생성합니다.
exit
mkdir ~/dockerrrr
cd ~/dockerrrr
mkdir prometheus grafana grafana/dashboards autossh
docker-compose.yml에 autossh / prometheus / grafana 인스턴스를 구성합니다
vi docker-compose.yml
version: "3.0" services: autossh: image: jnovack/autossh container_name: autossh environment: - SSH_REMOTE_USER=root - SSH_REMOTE_HOST=openwrt.duckdns.org - SSH_REMOTE_PORT=2222 - SSH_BIND_IP=0.0.0.0 - SSH_TUNNEL_PORT=19100 - SSH_TARGET_HOST=openwrt.duckdns.org - SSH_TARGET_PORT=9100 - SSH_MODE=-L - SSH_SERVER_ALIVE_COUNT_MAX=60 restart: always volumes: - ./autossh/autossh_id_rsa:/id_rsa ports: - 19100:19100 dns: - 1.1.1.1 - 1.0.0.1 prometheus: image: prom/prometheus container_name: prometheus volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml ports: - 9090:9090 depends_on: - autossh grafana: image: grafana/grafana container_name: grafana volumes: - ./grafana/grafana.ini:/etc/grafana/grafana.ini - ./grafana/datasources.yml:/etc/grafana/provisioning/datasources/datasources.yml - ./grafana/dashboards.yml:/etc/grafana/provisioning/dashboards/dashboards.yml - ./grafana/dashboards:/etc/grafana/provisioning/dashboards/dashboards ports: - 3000:3000
vi ./prometheus/prometheus.yml
아래 targets은 docker-compose.yml 의 autossh 인스턴스와 포트를 매핑합니다.
global: scrape_interval: 5s scrape_configs: - job_name: Prometheus static_configs: - targets: ["autossh:19100"]
vi ./grafana/grafana.ini
grafana 접속을 위한 id와 패스워드를 설정합니다. 아이디/패스워드는 원한는것으로 바꾸세요.
instance_name = My Instance [security] admin_user = admin admin_password = [email protected]
ip addr show docker0 | grep global | awk '{print $2}' | cut -d/ -f1
docker0 인터페이스 ip를 확인해 아래처럼 ./grafana/datasources.yml 의 url을 기입합니다.
[email protected]:~/dockerrr$ ip addr show docker0 | grep global | awk '{print $2}' | cut -d/ -f1
172.17.0.1
vi ./grafana/datasources.yml
apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://172.17.0.1:9090
vi ./grafana/dashboards.yml
apiVersion: 1 providers: - name: "Dashboards" folder: "" type: file editable: true options: path: /etc/grafana/provisioning/dashboards/dashboards
ssh 터널링을 위한 키 생성 및 전송
서버에 접속한 사용자([email protected]) ssh 공개키를 OpenWrt에 등록을 한 후 아래와 같이 autossh가 사용할 ssh키를 생성해 OpenWrt에 전송합니다.
ssh-keygen -t rsa -b 4096 -C "autossh" -f autossh_id_rsa
mv autossh_id_rsa* ./autossh
ssh -p 2222 [email protected] "tee -a /etc/dropbear/authorized_keys" < ./autossh/autossh_id_rsa.pub
화일구조 종합
위에서 생성한 docker-compose 화일 구조는 아래와 같습니다.
${HOME}
|- dockerrrr
|- docker-compose.yml
|- grafana
| |- dashboards.yml
| |- datasources.yml
| |- grafana.ini
| |- dashboards
| |- <place dashboards here>
|- prometheus
| |- prometheus.yml
|- autossh
|- autossh_id_rsa
|- autossh_id_rsa.pub
일반사용자(현재 접속자)에게 docker 실행 권한 부여
sudo usermod -aG docker $USER
sudo service docker restart
sudo chmod 666 /var/run/docker.sock
docker 실행 및 확인
docker-compose up -d
docker-compose ps
[email protected]:~/dockerrrr$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[email protected]:~/dockerrrr$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[email protected]:~/dockerrrr$ docker-compose up -d
Creating network "dockerrrr_default" with the default driver
Creating autossh ... done
Creating grafana ... done
Creating prometheus ... done
[email protected]:~/dockerrrr$ docker-compose ps -a
Name Command State Ports
------------------------------------------------------------------------------
autossh /entrypoint.sh Up 0.0.0.0:19100->19100/tcp
grafana /run.sh Up 0.0.0.0:3000->3000/tcp
prometheus /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp
[email protected]:~/dockerrrr$
prometheus server 접속 및 target 확인
웹브라우저로 http://super.duckdns.org:9090 로 접속해 prometheus server가 OpenWrt에서 메트릭을 제대로 긁어 오는지 확인합니다.

grafana 접속 및 dashboard import
웹브라우저로 http://super.duckdns.org:3030 로 접속해 위에서 설정한 id / password로 로그인하여 openwrt.json을 import 합니다.



참고사이트
- https://grafana.com/grafana/dashboards/11147
- https://yetiops.net/posts/prometheus-monitoring-other-os/
- https://royportas.com/posts/2020-02-25-prometheus-and-grafana-configuration-for-docker-compose/
- https://mkezz.wordpress.com/2017/08/04/prometheus-in-docker-ssh-tunnel-to-target-nodes/
- https://github.com/jnovack/autossh
- https://ef.gy/secure-prometheus-ssh-hidden-service
- https://www.everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh/