Address 는 와이어가드가 네트워크 인터페이스를 wg0 이라는 이름으로 추가하는데 거기서 사용할 IP 주소이다.
오라클 클라우드의 서버에서 10.0.0.x 대는 사용하니까 10.0.1.x 대를 사용해야 한다.
10.0.0.1로 지정했다가 VPN 접속을 통해서 인터넷이 연결 안되서 한참 헤맸다. 꼭 안쓰는 비어있는 IP 주소 대역을 지정해야 된다.
SaveConfig 는 와이어가드 실행, 종료시 이 conf 파일에 사용한 설정을 저장한다. false 로 해도 된다.
PostUp, PostDown 은 와이어가드 실행, 종료시 실행할 커맨드이다. ens3 은 네트워크 인터페이스 이름이므로 ifconfig 커맨드로 확인해서 바꾸자.
ListenPort 는 서버의 접속할 UDP 포트번호인데 OpenVPN 포트와 같은걸로 지정했다. (오라클 클라우드 서큐리티 리스트에 1194 포트를 이미 열어둬서…)
PublicKey 에는 클라이언트에서 만든 공개키를 넣는다.
AllowdIPs 는 클라이언트의 IP 대역을 지정한다.
iptable 에 udp 포트도 열어주고…
1
sudo iptables-AINPUT-pudp--dport1194-jACCEPT
와이어가드를 conf 파일을 지정해서 기동하자.
1
sudo wg-quick up/etc/wireguard/wg0.conf
한번 conf 파일 지정해서 기동했으면 다음부터는 conf 파일 지정 없이 기동할 수 있다.
1. 설치 후에 실행.
2. 실행 후 화면에서 왼쪽 아래 터널추가 버튼을 눌러서, 빈 터널을 추가를 선택.
3. 이름은 적당히 넣으면 되고, 공개키 부분을 복사해서 wg0.conf 의 [Peer] 부분에 있던 PublicKey 에 넣는다.
4. 아래 설정을 쓰는 곳에 아래 내용을 입력하고 저장한다.
PrivateKey 는 클라이언트의 개인키. 그대로 둔다.
Address 는 클라이언트가 사용할 IP (대역이 아니니 /32 로 지정)
DNS 는 DNS 서버. 1.1.1.1은 클라우드플레어의 DNS 주소이고 구글은 8.8.8.8. 취향따라 쓰자. (내 경우에는 이걸 지정안하면 인터넷 접속이 안된다)
PublicKey 에는 서버의 공개키를 적어 넣는다. (wg show 명령으로 볼 수 있다)
AllowdIPs 는 클라이언트에서 VPN 서버를 경유할 IP 대역이다. 0.0.0.0/0 은 모든 IP를 VPN 서버를 경유해서 접속하겠다는 설정이다.
Endpoint 는 와이어가드 서버의 IP 주소와 포트번호를 적는다.
우분투 서버 18.04 LTS에서 아파치와 톰캣9를 설치하고, 톰캣에 디플로이한 war 어플리케이션을 아파치를 경유해서 버츄얼 호스트로 접속하도록 아파치와 톰캣을 연동하는 방법을 설명한다.
톰캣만 써도 잘 되는데 왜 아파치를 경유하냐하면, 아파치에서 워드프레스 등 다른 서비스를 돌리고 있어서 톰캣도 같은 입구(아파치)를 통해서 외부로 연결되는 설정을 하는게 관리하기 편해서 그렇다.
딱히 아파치가 필요하지 않은 경우에는 그냥 톰캣만 기동해서 사용해도 된다.
아파치 톰캣9 설치와 모드 설정
설치는 아래 커맨드 한방으로 간단하게 끝.
1
sudo apt install apache2 tomcat9
아파치 모드 proxy 와 proxy_ajp 를 활성화한다.
1
2
sudo a2enmod proxy
sudo a2enmod proxy_ajp
proxy_ajp는 mod_jk 대신 사용하는건데 mod_jk는 따로 설치해야 되지만 proxy_ajp는 기본 설치된 모드이기 때문에 편하다. 복잡한 워커 설정도 필요없고.
아파치 site-available conf 설정
버츄얼 호스트 설정을 작성하기 위해서 /etc/apache2/site-available 디렉토리에 test.conf 파일을 생성한다. 내용은 아래처럼 작성.
1
2
3
4
5
6
7
8
9
10
11
12
<VirtualHost *:80>
ServerName test.elmi.page
ServerAdmin test@elmi.page
DocumentRoot/home/elmi/webapps/test
<Directory/home/elmi/webapps/test>
Require all granted
</Directory>
<Location/>
ProxyPass ajp://localhost:8009/
Require all granted
</Location>
</VirtualHost>
80 포트로 들어오는 요청에 대해서 서버이름은 test.elmi.page, 디렉토리 /home/elmi/webapps/test 에 대한 접근 모두 허용(Require all granted)
http://test.elmi.page 루트 / 를 AJP 프로토콜로 localhost:8009 로 넘긴다. localhost:8009 는 톰캣에서 AJP 프로토콜로 열어둘 주소/포트.
서브도메인을 추가하고 싶은 경우에는 conf 파일을 복사해서 다른 도메인/디렉토리로 설정하면 된다.
conf 파일을 수정한 경우에는 아래 커맨드로 적용하자.
1
2
sudo a2ensite test.conf
sudo service apache2 reload
서비스 리로드에서 에러가 났을 경우에는 아래 커맨드로 내용 확인.
1
sudo journalctl-xe
톰캣 server.xml 설정
톰캣의 server.xml을 편집한다. 위치는 /etc/tomcat9/server.xml
아래 8080 포트로 HTTP 연결은 아파치를 통해서 AJP 연결을 할 경우에는 필요 없으니 주석처리하자. (주석처리 안해도 딱히 지장 없음)
appBase 디렉토리(/home/elmi/webapps/test)에 ROOT.war 파일을 넣으면 자동으로 ROOT 디렉토리에 압축을 풀어서 디플로이 될 것이다. ROOT.war 파일을 사용하면 http://test.elmi.page/ 도메인 루트로 접속하도록 되는것이고, ROOT.war 이외에 이름 예를 들면 hoge.war 라는 war 파일을 사용하면 http://test.elmi.page/hoge/ 로 접속해야 한다.
서브도메인을 추가하고 싶은 경우에는 Host 태그를 복사해서 name을 name=”test2.elmi.page” 처럼 서브도메인 이름으로 넣으면 된다. 물론 appBase는 다른 곳으로 지정할것.
server.xml 파일을 수정했으면 서버 재기동해서 적용하자.
1
sudo service tomcat9 restart
아파치 로그는 /var/log/apache2, 톰캣 로그는 /var/log/tomcat9 에서 확인 가능하니 뭔가 제대로 안되면 로그 파일을 확인하면 된다.
conf 파일이나 xml 파일 수정 후에 리로드, 재기동하면 에러가 나는 경우는 파일의 문법상 문제이기 때문에 금방 찾아서 고칠 수 있다.
접속 테스트
브라우저로 확인해도 되지만, 내가 쓰는 page 도메인은 SSL 인증서를 발급 받지 않으면 브라우저로 확인이 불가능해서 wget 으로 에러 없이 index.html 파일이 제대로 보이는지 확인했다.
1
wget test.elmi.page
404 에러가 잘 나올텐데 아파치 access 로그부터 확인해서 연결이 잘 들어오고 있나 확인하자. 아파치에 문제가 없으면 그 다음은 톰캣의 억세스 로그를 보면 된다.
주로 디렉토리 경로가 잘못된 경우가 많으니 아파치의 conf 파일과 톰캣의 server.xml 에서 디렉토리 경로를 다시 잘 확인해 보자.
우분투 18.04 에서 iptables 애드온 xtables 로 국가 별로 접속 차단 허용 글에서 KRNIC 에서 받은 파일을 db-ip.com 포맷으로 변환하는 go 실행 파일과 CSV 파일을 다운로드해서 빌드까지 하는 쉘스크립트 파일을 공개했는데, 주기적으로 실행해서 국가별 IP 목록을 갱신해줘야 좀 더 정확하게 IP 차단 허용이 가능할거다.
일단 5일 정도 간격을 두고 실행하도록 crontab 설정을 해 보자.
리눅스 시스템에서는 주기적으로 프로그램을 실행할 때 crontab 이라는 명령으로 등록하는데, sudo 를 사용하면 루트 권한으로 실행 되는 crontab 을 등록할 수 있다. geoip.sh 에서 실행하는 xtables 빌드 파일(/usr/local/libexec/xtables-addons/xt_geoip_build)은 루트 권한이 필요하기 때문에 sudo 로 사용해서 root 의 crontab 을 등록하겠다.
crontabl 편집을 처음 실행하면 편집기를 선택해야된다. 1을 넣어서 nano 에디터를 선택했다. 각자 편한대로 하자.
1
2
3
4
5
6
7
8
$sudo crontab-e
no crontab forUSER-using an empty one
Select an editor.Tochange later,run'select-editor'.
1./bin/nano<----easiest
2./usr/bin/vim.basic
Choose1-2[1]:1
# 문자로 주석처리된 내용 제일 아래쯤에 써 넣으면 된다.
#분 시 월 일 요일 실행커맨드라인
나는 5일 마다 4시 12분에 실행하도록 설정했다. 오늘은 실행 안되고, 5일 후부터 실행 된다.
1
124*/5**cd/home/USER/;./geoip.sh
일 부분에 넣은 */5 가 5일마다를 뜻하고, 시간이나 분에도 /5 를 넣으면 5분마다, 5시간마다 실행하게 된다.
매달 5, 10, 15, 20, 25, 30일처럼 5의 배수일마다 지정하려면 1-31/5 로 지정하면 될거다.
요일은 0-6 범위에서 지정하고 일,월,화,수,목,금,토 순서이다. 예를들면 매주 수요일에 실행하려면 3을 넣으면 된다.
홈디렉토리에 파일을 다운로드하고 그 위치에서 쉘스크립트를 실행하기 위해서 cd 명령 후에 쉘스크립트를 실행한다.
2022/10/14 업데이트
아래 업데이트 내용과 같이 apt upgrade로 이 글에서 설치한 xtables 최신버전(3.9)이 지워져서 xtables-addons-3.9.tar.xz 파일로 다시 설치하려 했지만, 이것저것 업데이트 된 탓인지 make에서 에러가 발생.
아래 사이트에서 아래 deb 파일을 다운로드 받아서 설치하고, iptables를 재설정(같은 설정 파일로 iptables-apply)하면 된다.
1. xtables-addons-common_3.9-1ubuntu0.2~20.04.3_amd64.deb
2. xtables-addons-dkms_3.9-1ubuntu0.2~20.04.3_all.deb
다운로드 – https://launchpad.net/~ci-train-ppa-service/+archive/ubuntu/4610-deletedppa/+build/21765689
2020/6/25 업데이트
xtables-addons-common, xtables-addons-dkms이 업데이트 되면서 설치한 xtables 최신버전(이글에서 xtables-addons-3.9.tar.xz 파일로 설치한 것)이 덮어씌워지면서 iptables 에 geoip 설정 내용이 적용 안되게 된다. xtables-addons-3.9.tar.xz 파일로 다시 설치하면 복구되니 아래 인스톨 방법대로 한번 더 설치해주면 된다.
2020년1월부터 maxmind사가 제공하는 geoip 정보 파일이 회원가입제로 바뀌었다. 다른 방법으로 국가별 IP 정보를 얻어서 차단하거나 허용하는 방법에 대해서 자세히 설명. iptables 애드온 xtables 와 KRNIC 에서 제공하는 국가별 IP 정보를 사용한다.
우분투 18.04 에서 방화벽 iptables 의 애드온 xtables 를 이용해 국가 별로 접속 차단 또는 허용하는 방법을 쓰려고 했는데 여러가지 문제에 부딪혀 아주 긴 글이 될 것 같다.
일단 과정을 기록하면서 쭉 써보겠는데 너무 글이 난잡해서 어려워지면 나중에 설정 순서만 따로 정리해보도록 해야겠다.
자, iptables 에 xtables 라는 애드온을 설치해서 국가별로 접속을 차단하거나 허용하는 설정을 해 보겠다.
===== 경고!!! =====
클라우드 서비스나 VPS 를 사용하고 있는 서버에서 SSH 접속 포트에 이 글의 내용을 적용할 경우에는 iptables 에 대한 충분한 지식을 갖고 설정하지 않으면 서버에 접속이 불가능해 질 수가 있으니 꼭!!! 잘 확인하고 적용하도록 합시다. 최소한 리부팅하면 되돌아 올 수 있도록 iptables 에 재기동시 디폴트 파일에는 적용하지 않을 것을 추천합니다! 이 블로그에서도 iptables 에 대한 내용은 많이 다루었으니 먼저 읽어 보시는걸 추천합니다.
xtables 를 사용하기 위해선 /usr/lib/xtables-addons 에 국가별 IP 정보가 들어있는 파일을 다운로드하는 스크립트와 빌드하는 스크립트가 있는데 실행해도 작동하지 않는다.
원래라면 이 두 스크립트로 차례대로 실행해 CSV 파일로 되어 있는 국가별 IP 정보를 다운로드 하고, CSV 파일을 다시 바이너리 파일로 빌드해야 xtables 가 작동하게 된다.
Xtables-addons Git 에서 최신 버전 스크립트를 찾아서 열어보면, 다운로드 스크립트는 maxmind 라는 회사에서 제공하는 geoip 정보를 다운로드 하도록 만들어져 있다.
그런데 이 회사는 2020/01/01부터 정책을 변경해서, 회원가입을 해서 다운로드를 받도록 하고 있기 때문에 스크립트도 동작하지 않고, 회사 사이트에서 회원가입하고 geoip 정보는 받는것도 난 쓰기가 싫어서 다른 방법을 찾아봤다.
IP 를 관리하는 각 대륙별 인터넷 레지스트리에서 자기들이 할당한 IP 리스트에 IP 정보와 함께 국가 정보도 들어있다. 아래가 각 대륙별 인터넷 레지스트리들이 제공하는 IP 할당 정보 파일.
포멧은 CSV형식으로 되어있는데 자세한 포맷에 대해선 여기 문서에 잘 나와있다. (별거 없음)
이 파일들로 국가별로 정리하고 연속된 IP는 합치고하는 출력하는 프로그램을 자바로 다 만들고 나서 여기까지 글을 쓰는 도중에 발견한… KRNIC (한국인터넷정보센터) 에서도 같은 국가별 IP 할당 정보를 전국가분을 하나의 CSV 파일로 제공하고 있는것이다… 두둥…
다운받은 시점으로 3일전 등록한 내용까지 있으니 꽤 자주 업데이트 되는것 같다. 이건 차차 더 보기로 하고.
xtables-addons 의 빌드 스크립트(파일명:xt_geoip_build 갱신일:2020/01/07)에서 사용하는 파일 포맷은 DB IP 라는 회사에서 제공하는 geoip 정보가 담긴 csv 파일인데, 구조가 시작IP,끝IP,국가코드(두자리) 이다.
Can'tlocate Net/CIDR/Lite.pm in@INC(you may need toinstall the Net::CIDR::Lite module)(@INC contains:/etc/perl/usr/local/lib/x86_64-linux-gnu/perl/5.26.1/usr/local/share/perl/5.26.1/usr/lib/x86_64-linux-gnu/perl5/5.26/usr/share/perl5/usr/lib/x86_64-linux-gnu/perl/5.26/usr/share/perl/5.26/usr/local/lib/site_perl/usr/lib/x86_64-linux-gnu/perl-base)at/usr/lib/xtables-addons/xt_geoip_build line9.
BEGIN failed--compilation aborted at/usr/lib/xtables-addons/xt_geoip_build line9.
빌드 스크립트를 실행한 디렉토리에 국가별로 바이너리로 빌드 된 파일들이 생기게 된다. xtables가 인식하는 지정된 디렉토리가 있으니 거기에 넣어야한다. 디렉토리를 작성해서 .iv4 .iv6 파일을 모두 이동시키자. 인터넷에서 xtables 설치 과정을 보면 xt_geoip 디렉토리 아래 BE 와 LE 디렉토리 이야기가 많이 나와서 BE 는 도대체 뭔가 했는데 Big Endian 과 Little Endian 의 약자이다. 우분투는 Little Endian 시스템이니까 LE 에 넣으면 될 것 같다.
1
2
sudo mkdir-p/usr/share/xt_geoip/LE
sudo mv *.iv[46]/usr/share/xt_geoip/LE
문제 발생
뭔가 버그가 있는건지 뭘 잘못한건지 모르겠는데, iptables 에 REJECT 를 한줄 추가하면 국가를 뭘로 지정하든 모든 국가가 다 블럭되는것 같다.
아주 수상한 상황이니 사용할 때는 꼭 리붓하면 되돌아 올 수 있도록 설정하고 사용해 보자. 클라우드 서버에서 SSH 막히면 망한다.
해결방법을 찾았다. xtables 를 최신 버전으로 빌드해서 설치하면 잘 작동된다.
xtables 최신버전 설치
소스포지에 xtables-addons 의 다운로드 페이지에 가서 최신버전의 xtables 압축파일을 다운로드 받자.
이 글에서는 xtables-addons-3.9.tar.xz 파일을 받아서 설치하는 방법으로 진행한다.
다운받은 파일을 서버에 올리고, xz 압축 파일을 써 본적이 없을 경우에 설치부터 해서 아래 명령으로 압축 해제.
1
2
sudo apt install xz-utils
tar xvfJ xtables-addons-3.9.tar.xz
압축해제된 디렉토리로 이동해서 configure 실행.
1
2
cd xtables-addons-3.9/
./configure
내경우에는 에러가 나서 에러 내용으로 검색해보니 pkg-config, iptables-dev 가 부족해서 설치했다.
1
2
sudo apt install pkg-config
sudo apt install iptables-dev
다시 실행하니 문제 없음.
1
2
3
./configure
make
sudo make install
설치가 무사히 끝나면 다운로드 스크립트와 빌드 스크립트가 /usr/local/libexec/xtables-addons/ 디렉토리에 설치된다. 다운로드는 작동 안할 것이고, 빌드는 이글 위에서 사용했던 것과 같은 버전(최신버전)이 설치 된다.
이미 국가별 IP 파일은 모두 빌드해서 /usr/share/xt_geoip/LE 디렉토리에 넣어놓았으면 다시 빌드할 필요는 없다.
iptables 에 geoip 설정을 넣으니 에러가 발생해, 내용을 보니 이번 최신버전 xtables 는 LE 디렉토리를 사용하지 않는다.
/usr/share/xt_geoip 디렉토리에 빌드된 국가별 IP 파일을 넣어야한다.
파일들을 옮기고, LE 디렉토리는 필요없으니 지우자.
1
2
3
4
cd/usr/share/xt_geoip/LE
sudo mv *..
cd..
sudo rm-rf LE
이렇게 xtables 최신버전을 설치하고, 국가별 IP 파일도 옮기고 나니 아래에서 설정한 내용들이 잘 적용 된다. 만세 ㅠㅠ