ESNI 란 운영중인 웹 서버에서 인증서가 유효한지를 파악하는 식별 코드입니다. 그렇지만 이 방법에도 한계점은 있어 국가 검열 대상이 되고는 하는데요~
베이스온사이트에서 어떻게 하면 그보다 진화된 방식인 ECH 지원 웹사이트를 구축할 수 있는지를 소개해 드리려고 합니다.
ECH 에 대한 설명
웹서버에 접속할 때 받아와야 하는 사이트 식별자 SNI 를 암호화 하는 단어를 ESNI 라고 합니다. ECH 는 이보다 훵씬 복잡하게 꼬은 암호화 기술로서 동일한 서버내에서 SNI를 식별하는 문제가 발생하는 ESNI를 대체하고자 만들어졌습니다. 안타깝게도 ECH를 활성화 하는 방법에 대해 설명하는 곳이 적어서 간단한 설명과 쉽게 구축하는 법에 대해서 설명해 드리겠습니다.
구축에 필요한 준비물
- 1개의 구입한 도메인
- 2개 이상의 가상 머신
가상 머신 세팅하기
클라우드 업체에서, 우분투를 활용한 리눅스 머신 두개를 생성합니다. 예시에서는 CPU 1개, 램 2GB 의 비교적 저렴한 사이즈로 생성하였습니다. 또한 SSH 를 쓸 일이 많다보니 간편하게 되는 구글 클라우드 플랫폼에 생성을 하였습니다.
다음으로 각 우분투 머신에 구매한 도메인을 연결해 주셔야 합니다. 구글 클라우드 플랫폼 기준으로 네트워크 서비스 -> cloud dns 쪽에서 설정할 수 있습니다.

가상머신과 도메인을 연결하기 위해서는 어떤 클라우드 서비스에 관계 없이
80 번, 443번 포트를 인바운드 규칙에 추가,
도메인에 ns1 및 ns2 번 서브 도메인 A 레코드로 추가
연결 2가지를 필수로 진행해야 합니다.


각 머신별 인바운드 포트에 53 번을 추가해 주세요. 또한 생성시 놓쳤다면 HTTP 및 HTTPS 포트인 80,443 번 또한 필수 입니다! (구글 클라우드 플랫폼의 경우 네트워크 인터페이스 -> 방화벽 -> 방화벽 규칙 추가를 통해 설정)
2개의 서버가 준비 완료되셨으면 둘 다 SSH 접속으로 접속합니다. 그런 다음 모든 가상 머신에 다음과 같은 명령어를 한줄 씩 입력해 주세요.
- sudo apt-get update
- sudo apt-get install bind9

bind9 이라는 리눅스 프로그램으로 네트워크를 만질 예정입니다. 모든 가상머신에 다음과 같이 명령어를 입력해 텍스트 편집기를 열어주세요.
- sudo nano /etc/bind/named.conf.options
그러면 기존 파일을 편집할 수 있게 나옵니다. 여기서 기존의 코드는 건드리지 않고 괄호 안에 이미지 처럼 2줄을 추가해주세요.(들여쓰기는 반드시 지켜주셔야 합니다.)
- recursion no;
- allow-transfer { none; };

Ctrl + O -> Ctrl + X 로 저장 후 빠져나오세요. 모든 가상 머신에서의 설정이 완료되었으면 다음은 개별 설정입니다. 우선, 첫번째 머신에서 다음과 같은 명령어를 입력해 설정 파일을 만들어 주세요.
- sudo nano /etc/bind/db.example.com (example.com 은 연결되어 있는 도메인으로 바꾸어 주세요!)

- $TTL 604800 @ IN SOA ns1.example.com (
- 2023111501 ; Serial #<- 이 부분의 숫자만 날짜같은걸로 바꾸어 주세요. Ex. 2024010123
- 604800 ; Refresh
- 86400 ; Retry
- 2419200 ;Expire
- 604800 ) ; Negative Cache TTL
- ;
- @ IN NS ns1.example.com
- @ IN NS ns2.example.com
- ns1 IN A 첫번째 가상 머신 IP
- ns2 IN A 두번째 가상 머신 IP
example.com, 시리얼 넘버, 가상 머신 IP를 바꾸어서 저장합니다. 가상 머신에 대한 정보는 인스턴스 에서 확인할 수 있습니다.
다음은 sudo nano /etc/bind/named.conf.local 명령어를 입력해서 영역 파일을 생성합니다. 영역(Zone) 파일에는 다음과 같이 입력해 주세요.

- zone "example.com" {
- type master;
- notify yes;
- allow-transfer { 두번째 머신 IP };
- file "/etc/bind/db.example.com";
- };
존 파일 까지 생성을 완료 하셨으면 저장해 나온 뒤, 아래 명령어를 입력해 시스템 파일을 재시작 해주세요.
- sudo systemctl restart bind9
bind9 의 작동 상태를 확인해 주세요. 만약 실행되고 있지 않고 failed 라고 나온다면 해결을 하고 가야 합니다.
- sudo systemctl status bind9

만약 위 사진 같이 실패했다고 나온다면 named-checkconf 명령어로 원인을 파악해 주세요. 아무것도 나오지 않은 상태에서 restart 를 시도하면 작동이 될 확률이 높습니다.
추가로, 아래의 명령어를 입력해 2번째 설정에는 문제가 없는지를 확인해 주세요. 아래 이미지와 같이 OK 사인이 나와야 첫번째 머신의 설정이 완료되는 것 입니다.
- named-checkzone example.com db.example.com

다음은 두번째 머신을 설정하는 작업입니다. 첫번째와 다르게 굉장히 간단합니다. named.conf.local 만 추가하면 되는데 내용은 약간 다릅니다. 명령어 창에 다음과 같이 입력해 주세요.
- sudo nano /etc/bind/named.conf.local

- zone "example.com" {
- type slave;
- masters { 첫번째 머신 IP; };
- file "/var/lib/bind/db.example.com";
- };
Ctrl + O -> Ctrl + X 로 저장한 뒤, 첫번째 머신때와 똑같이 sudo systemctl restart bind9 으로 서비스를 재시작합니다.
그런 다음 두번째 머신에서 다음 명령어를 입력했을 때 정상적으로 첫번째 머신이 있다고 나오면 성공적으로 연결이 완료된 것 입니다.
- host ns1.example.com 첫번째머신IP

여기 까지 하면 서버의 준비는 완료 되었습니다. 잠시 쉬었다가 NGINX 를 사용한 웹 서버 구축에 들어가 보도록 하겠습니다.
NGINX 를 이용한 웹 서버 세팅하기
꽤 멀리 돌아왔지만 이번 예제에서는 아파치 대신 리버스 프록시 웹 서버로 유명한 엔진엑스를 사용해 머신에 웹 서버를 구축해 보겠습니다. 일반적인 서버라면 설치가 훨씬 쉬울 수 있겠지만, ECH 를 지원하기 위해서는 OpenSSL 이라는 통신 암호화 프로그램의 힘이 필요합니다.
아래 명령어를 입력해 라이브러리를 설치합니다. apt-get install 로 설치하는 것은 전부 C 언어로 되어있는 프로그램을 쓸 수 있게 변환해 주는 역할을 합니다.
- sudo apt-get install build-essential libpcre2-dev zlib1g-dev

보통 우분투에서는 nginx 를 apt 로 간단하게 설치할 수 있지만, ECH 를 활성화 시키기 위해서는 수동으로 설치 파일을 다운로드 받아야 합니다.
댓글