카테고리: Linux

InfluxDB + Grafana + Telegraf 설치 및 설정

1. InfluxDB

1-1. wget https://dl.influxdata.com/influxdb/releases/influxdb_1.6.3_amd64.deb 으로 influxDB를  다운로드 후 dpkg로 설치.
데이터 디렉토리는 /var/lib/influxdb, 설정 파일은 /etc/influxdb에 위치.
1-2. 데이터베이스 용량이 초과되는 것을 막기 위하여 autogen retention policy를 disable. (Meta 섹션의 retention-autocreate를 false로)
1-3. influx를 입력, InfluxDB Shell로 진입.
1-4. CREATE DATABASE <DB_NAME> 명령어로 DB를 생성.
1-5. CREATE RETENTION POLICY “<POLICY_NAME>” ON “<DB_NAME>” DURATION <DURATION> REPLICATION 1 으로 retention policy를 생성, 적용.
1-6. ALTER RETENTION POLICY “<POLICY_NAME” ON “<DB_NAME>” DEFAULT로 default retention policy 설정.
1-7. create user <UserName> with password ‘<Password>’
1-8. grant all on <DB_NAME> to <UserName>
1-9. show retention policies on “<DB_NAME>”로 Retention Policy가 정상적으로 적용되었는지 확인.

2. Telegraf

2-1.  wget https://dl.influxdata.com/telegraf/releases/telegraf_1.8.0-1_amd64.deb 으로 Telegraf를 다운로드 후 dpkg로 설치.
설정 파일은 /etc/telegraf/에 위치.
2-2. 용도에 맞게 적절하게 설정. InfluxDB는 urls, database, skip_database_creation, retention_policy, timeout, username, password, user_agent, content_encoding, influx_uint_support를 설정해주어야 함.
2-3. usermod -aG docker telegraf  명령으로 도커 statistics를 가져올 수 있게 허용.

 

3. Grafana

3-1. /opt/grafana/data/ 폴더를 생성
3-2. docker run -d --user 0 -v /opt/grafana/data:/var/lib/grafana -p 3000:3000 --net=host grafana/grafana:5.1.0 으로 호스트 볼륨을 사용하는 컨테이너 생성
3-3. Data Source로 상단에서 설정한 InfluxDB를 선택, 설정.
3-4. Dashboard 생성 후 사용

Linux Network Bridge Overview

 

리눅스에서 네트워크를 구성하다 보면 흔히 브리지라는 것을 접하게 된다. 여러개의 이더넷 포트를 하나의 세그먼트로 묶어주는 역할을 하는 이 소프트웨어 장치는 과연 어떤 것일까?
이 질문에 대답하려면 먼저 컴퓨터 네트워크의 역사에서 브리지의 위치를 알아볼 필요가 있다.

1. 네트워크 브리지

초창기 컴퓨터 네트워크는 여러 인터페이스들이 서로 경쟁 관계에 있었고(Ethernet, Token Ring, FDDI..) 대부분 하나의 회선을 여러 클라이언트가 나눠 쓰는 버스(Bus) 형태의 구조를 가지고 있었다.
버스 구조에서 두 개의 버스를 가진 네트워크를 서로 연결하려면 어떤 장치가 필요할까?

버스가 물리적으로 분리되어 있다면, 그 두 회선을 연결해주는 장치가 있어야 할 것이다. 그 결과 리피터(Repeater)가 탄생하였다. -허브(Hub)라고 부르기도 한다-
리피터는 아주 단순한 장비여서, 한 포트로 수신한 전기 신호를 다른 포트로 전송해주는 일밖에 하지 못한다.
때문에 CSMA/CD를 사용하는 초창기 이더넷에서는 Collision Domain이 커지는 효과를 가져왔고, 버스의 길이를 물리적으로 연장함으로써 Detection Gap을 넘는 전파 지연 가질 위험성도 내포하고 있었다.

일이 이렇게 되니, 이 문제를 해결할 수 있는 보다 지능적인 장비가 필요했고, 리피터에 MAC 주소 학습/포워딩 결정 기능을 더한 브리지가 탄생하였다.
브리지부터는 단순히 전기 신호를 재전송하는 것이 아닌, L2 프로토콜을 해석하고, 프레임의 정보를 얻을 수 있는(주로 MAC Address) 기능을 갖게 된다.

브리지는 클라이언트들의 MAC Address를 학습하고, 목적지 클라이언트 MAC이 존재하는 네트워크의 포트로만 패킷을 전송함으로써 리피터의 문제를 해결하였다.

브리지 동작은 크게 Transparent Bridging과 Source Routed Bridging으로 나뉘는데, 우리가 흔히 접하는 것이 Transparent Bridging, 내부에 홉 순서를 가지고 있는 프레임을 처리하는 것이 Source Routed Bridging이다.
토폴로지 구성 또한 두 종류가 있는데, 일반적으로 같은 세그먼트의 LAN을 서로 연결하는 LAN Bridging과 원격지 네트워크를 서로 연결하는 Remote Bridging이 바로 그것이다.

그리고 여기서 브리지의 한계가 드러나게 된다.
일반적으로 동일한 프로토콜을 사용하는 LAN과 달리, 원격지 네트워크는 LAN과 다른 프로토콜을 사용할 수 있으며, WAN 라인은 LAN에 비해 대역폭이 좁다.
그래서 LAN에서 발생한 트래픽이 WAN 회선을 타고 원격지 네트워크로 전송될 때, WAN 회선의 대역폭을 넘는 트래픽이 전달된다면 브릿지는 잉여 프레임을 버퍼에 저장할 수 밖에 없고, 버퍼의 용량이 초과된다면 나머지 프레임들은 모두 드랍될 수 밖에 없다. 때문에 패킷 드랍이 일어나지 않도록 브리지는 가장 작은 대역폭을 가진 포트에 맞춰 모든 포트의 전송률이 결정된다.

이런 한계점은 스위치의 등장과 함께 최종적으로 해결되었는데, 스위치에서는 링크가 1:1로 연결되므로 기본적으로 다른 포트의 전송 대역폭을 신경 쓸 필요가 없어졌다.

 

2. 리눅스의 소프트웨어 브리지

그렇다면 리눅스의 브리지는 어떤 기능을 가지고 있는 것일까.
결론부터 말하자면 리눅스의 브리지는 레거시 네트워크에서 흔히 말하는 브리지가 아니라, 소프트웨어적으로 구현된 스위치이다.
리눅스 브리지는 다수의 포트를 가질 수 있으며, STP가 동작하고, 인터페이스의 대역폭이 상호 독립적이기 때문에 브리지가 아니라 스위치라고 보아야 한다.

그럼 이제 리눅스 브리지의 동작에 대해 이야기해보도록 하자.

앞서 말했듯이, 브리지 동작에는 Transparent Bridging과 Source Routed Bridging이 존재한다.
리눅스의 브리지는 이 둘 중에서 Transparent Bridging을 수행한다. 이 때문에 다중 브리지가 존재하는 환경에서는 루핑이 발생할 수 있고, STP가 구현되었다.
그리고 리눅스의 브리지는 기본적으로 Ethernet을 사용하고, Remote Bridging을 적용할 수 없다. 또한, 하나의 포트는 한번에 하나의 브리지에만 할당될 수 있다.
상용 브리지 중에서는 하나의 포트를 여러 브리지에 할당하고 포워딩 정책을 통해 전송 포트를 결정하는 경우도 있으므로, 리눅스 브리지는 최대한 단순한 구성을 취하고 있음을 알 수 있다.

현재 리눅스 커널의 메인라인에는 802.1d Ethernet Bridging이 들어가 있으며, 커널을 컴파일 할 때 브리지 모듈을 탑재하는 것으로 활성화/비활성화를 결정할 수 있다.
브리지가 활성화된 커널에서 bridge-utils을 이용하는 것으로 브리지를 설정할 수 있다. 명령어는 brctl이다.

 

Visual Studio로 Linux 프로그래밍 하기

Visual Studio에는 리눅스용 프로그램을 빌드할 수 있는 확장 프로그램이 존재한다. Visual C++ for Linux Development가 바로 그것으로, 여기서 다운로드 하거나, Visual Studio 2017의 경우 설치 프로그램에서 추가할 수 있다.

VS와 원격 디버거는 SSH로 연결되며, 때문에 gdb, g++, openssh-server, gdb-server 패키지가 설치되어 있어야 한다.

디버거가 연결되면 리눅스용 프로그램을 작성, 빌드, 컴파일 할 수 있게 되는데, 리눅스의 헤더파일이 VS에 기본적으로 탑재되어 있지 않기에 InteliSense를 이용할 수 없게 되는 문제가 발생한다. 이것은 공개된 리눅스 배포판에서 헤더 파일들을 가져옮으로써 해결될 수 있지만, 별다른 추가적인 조작 없이 윈도 파일시스템에 이 파일들을 가져올 수 있는 방법이 있으니, 바로 Windows Linux Subsystem을 사용하는 것이다.

Linux Subsystem은 파워쉘 명령어 ‘Enable-WindowsOptionalFeature -O -F Microsoft-Windows-Subsystem-Linux‘를 통해 활성화시킬 수 있지만, 이 기능의 활성화를 위해서는 개발자 모드를 먼저 활성화시켜야 한다.

개발자 모드는 설정의 업데이트 및 복구에서 활성화할 수 있다.

파워쉘 스크립트로 활성화가 완료된 뒤에는 반드시 bash를 실행하자. 그래야 서브시스템이 로드되고, rootfs의 압축이 풀리게 된다. 서브시스템의 위치는  C:\Users\UserName\AppData\Local\lxss 이다.

libc의 설치를 위해 g++을 설치하고 나면 헤더파일을 불러올 준비가 다 끝난다.

이 경로를 프로젝트의 Dependency Directory로 잡아주면 이제 InteliSense가 정상적으로 동작할 것이다.

 

프로젝트에서 라이브러리 의존성이 발생할 수 있는데, 원하는 라이브러리를 프로젝트 속성에서 추가할 수 있다.

Library Dependencies에서 원하는 라이브러리의 이름(lib-, .a 제거)을 입력한다. 구분자는 세미콜론이다.
그리고, Additional Library Directories에 라이브러리 경로를 추가해주면 된다.

OpenWRT 패키지 컴파일하기

OpenWRT에서 제공하는 패키지를 컴파일하기 위해서는 먼저 tools와 toolchain라이브러리를 링킹해야 한다.

Repository 루트에서 다음 명령어를 입력한다.

그리고 컴파일하려는 패키지의 dependency를 컴파일 한 뒤 링킹하고, 마지막으로 원하는 패키지를 컴파일, 링킹한다

/bin 디렉토리를 확인해 보면 패키지 파일(*.ipk)이 생성되어 있다. 패키지의 Config를 정상적으로 하였는지 확인한 뒤 설치하면 된다.

Duplicator을 활용한 워드프레스 블로그 이전

AWS Free Tier가 만료되어가는 관계로, 다시금 블로그를 이전했다.
작년에는 새로 블로그를 만들고 DB를 덮어버리는 방법을 사용했는데, permalink 등의 문제로 이게 영 불편한지라.. Duplicator라는 플러그인을 사용해 보았다.

그간 PHP가 7.0으로 버젼업하면서 FPM 세팅이 약간 달라져서 헤매었지만, 그리 어려움 없이 설정을 끝내고, Nginx까지 정상적으로 구동시켰는데, Duplicator Installer가 DB와 연결이 안된다면서 에러를 뿜는 것이었다.
사용자 계정은 정상적으로 생성되었는데 뭐가 문제였나 하면.. Duplicator는 생성된 데이터베이스 테이블이 있어야 하며, 해당 테이블에 대한 모든 권한이 사용자에게 주어져 있어야 했다.

당연히 데이터베이스를 자동으로 만들어서 덮어줄 것이라고 생각했던 나의 불찰..

그리고 백업한 Zip Archive를 압축 해제하는데 플러그인이 필요하다.
‘PHP ZipArchive module’ 이 그것으로, apt로 php7.0-fpm을 설치했다면 apt-get install php7.0-zip  명령어로 간단하게 설치할 수 있다.

우분투에 OpenVPN 서버 설치하기

 

사용 환경: Ubuntu 14.0.4 LTS, OpenVPN 2.3.2-7

 

OpenVPN 2.3부터 Easy-RSA가 다른 프로젝트로 떨어져 나가면서 OpenVPN을 설치할 때 함께 설치되지 않게 되었다.

때문에, 먼저 apt-get install easy-rsa 로 Easy-RSA를 설치해 준다.

 

Easy-RSA 설치가 끝난 뒤, /usr/share/easy-rsa/ 로 이동하고, vars 파일을 입맛에 맞게 수정해 준다.

그리고 다음과 같은 명령어를 입력한다.

 

 

이제 keys 폴더 안에 다음과 같은 파일들이 생성되었을 것이다.

이 중 ca.crt, <서버 이름>.crt, <서버 이름>.key,dh2048.pem 이 서버에서 사용되는 파일들이다.

cp -r keys /etc/openvpn  을 입력, 키 파일들을 복사한다.

apt-get install openvpn  을 입력하어 OpenVPN을 설치한다.

 

openvpn의 설정 파일 샘플은 /usr/share/doc/openvpn/samples/ 에 있다.

이 폴더에서 gzip -d server.conf.gz 를 입력, 설정 파일의 압축을 푼다.

 

vi server.conf 를 입력, 설정 파일의 값을 적절하게 수정한다. 그리고 수정이 완료된 설정 파일을 /etc/openvpn 으로 복사한다.

 

OpenVPN 서버의 실행은 openvpn <설정 파일 경로> 를 통하여 이루어진다.

OpenVPN 서버를 실행한 뒤, 리눅스 커널에서 IP 포워딩을 활성화하기 위하여 echo 1 > /proc/sys/net/ipv4/ip_forward 를 입력한다.

이 설정을 시스템 재시작 시에도 유지하기 위해 sysctl.conf를 수정한다.

시스템 시작 시 OpenVPN 서비스를 자동으로 실행하기 위해서 rc.local을 수정한다.

이 때 주의할 점은, rc.local에 등록된 스크립트는 root로 실행이 된다는 것이다. 비특권 유저로 실행하고 싶다면 이 포스팅을 참조하길 바란다.

ca.key, <클라이언트 키 이름>.key는 클라이언트의 접속에 필요한 키 파일들이다.