서버 관리자는 항상 자신이 관리하는 서버가 안전하게 운영되길 원합니다.
지금 이 시간에도 서버 관리자는 서버 보안 설정을 튼튼하게 하고 중요한 파일들을 백업하여 안전성을 확보하지요.
하지만 24시간 밤낮 관계없이 관리하는 서버에 무작위로 접근을 시도하여 과도한 트래픽 유입과 해킹을 시도하는 자가
있어 골머리를 앓는 서버 관리자가 많습니다.
제가 소개할 프로그램은 제한된 시간 내에 클라이언트(집 PC등)가 서버로 설정된 TCP 또는 UTP등의 패킷을
정해진 시간내로 송신하면 서버가 패킷을 수신받아 수신된 패킷이 설정한 패킷과 같으면 설정된 내용을
실행시키는 기능을 하는 knockd 프로그램입니다.
knockd은 iptables과 병용하여 사용하면 큰 효과를 볼수 있는 프로그램 입니다.
예를 들어 iptables를 통해 서버에 접근이 불가능한 상태로 만든후 knockd에서 설정한 패킷을 받으면
패킷을 송신한 클라이언트의 IP의 접속을 허용하여 그 클라이언트가 서버에 접속할수 있게끔 설정이 가능하며
ICMP등을 차단한 상태에서 설정한 패킷을 받으면 클라이언트만 ICMP(PING)를 확인하게 할수 있습니다.
오늘은 knockd의 설치 방법과 응용 방법에 대해 정리하도록 하겠습니다.
주의 : 이 글에서는 iptables 설정을 변경합니다. 잘못설정시 서버에 콘솔로 접근하여 설정을 변경 해야하는점
명심해주시기 바라며 knockd의 설치 및 설정에 의해 발생하는 문제점은 작업하시는 분의 책임입니다.
절대 작성자 및 스마일서브가 책임을 지지않습니다.
또한 이 글은 기술지원과는 관계가 없어 응대가 어려운점 참고 부탁드립니다.
서버(가상) 구성 2대
리눅스 OS : Ubuntu 16.04 LTS 64 bit
CPU : 1core
메모리 : 1GB
윈도우 OS : 윈도우 10 64bit
CPU : 1core
메모리 : 1GB
윈도우 knock client 설치
리눅스 서버에 knockd를 설치하기 전에 윈도우 부분을 먼저 셋팅합니다. 아래의 URL로 이동하여
Other Downloads항목의 Native Win32 Client를 다운로드 받습니다.
다만 자신이 사용하는 컴퓨터 OS가 리눅스거나 또는 knockd에 보낼 패킷을
스마트폰의 어플을 이용하여 보내실경우 이 부분을 진행하지 않으셔도 무방하며
리눅스의 경우 knockd client, telnet, nmap등으로도 패킷을 보낼수 있는점 참고바랍니다.
(윈도우도 telnet이 존재하지만 패킷 전송이 잘되지않는 문제가 있습니다.)
URL: http://www.zeroflux.org/projects/knock
다운로드 받은 knock-win32의 압축을 해제합니다.
압축을 해제한뒤 knock-win32 > knock-win32-port > Release 순으로 이동하면 knock.exe를
확인할수 있습니다. 그것을 Crtl + c로 복사한후 C:\Windows\System32에 이동하여 붙여넣습니다.
관리자 권한이 필요하다는 부분에는 계속을 클릭하면 되며 이렇게 하면 윈도우에서 할일은 끝입니다.
순서 정리
1. knock-win32 > knock-win32-port > Release로 이동한다.
2. knock.exe를 복사한다.
3. C:\Windows\System32에 knock를 붙여넣는다.
4. 관리자 권한이 필요합니다. 부분에서 계속(C)을 클릭.
리눅스 knockd 서버 설치
이번엔 리눅스 서버로 접속하여 knockd_0.7-1_amd64.deb를 다운로드 받은뒤 설치합니다.
보통은 apt-get install knockd로도 설치가 됩니다만 저의 경우 이렇게 설치하면 기능이 정상적으로
작동하지 않아 부득이하게 deb 파일을 다운받아 설치를 진행하였습니다.
순서정리
1. /usr/local/src로 이동한다.
cd /usr/local/src
2. wget 으로 knockd_0.7-1_amd64.deb를 다운로드 받는다.
wget http://ftp.kr.debian.org/debian/pool/main/k/knockd/knockd_0.7-1_amd64.deb
3. dpkg로 설치를 진행한다.
dpkg -i knockd_0.7-1_amd64.deb
/etc/knockd.conf로 이동하여 설정을 진행합니다.
초기 설정은 SSH에 관련된 openSSH, closeSSH 총 두가지의 설정으로 구성되어있습니다.
이 부분은 간단하게 풀어서 설명하도록하겠습니다.
[openSSH] : 이름을 설정합니다.
sequence : 패킷을 설정합니다. 설정에 따라 TCP 또는 UCP로 패킷을 받아올수있습니다.
seq_timeout : 패킷을 받을 시간 제한을 설정합니다. (초 단위)
command : 설정한 패킷이 올바르면 명령어가 구동됩니다.
tcpflags : 플래그와 일치시킬 패킷을 설정합니다.
저는 여기서 openSSH 설정을 조금 다르게 변경해보도록 하겠습니다.
변경 후를 보시면 sequence와 seq_timeout, command를 변경한것을 알수있습니다.
이렇게 변경한 이유는 받을 패킷을 변경하고 패킷을 받아올 시간에 조금 여유를 주기 위함이며
이번 글에서는 iptables의 22번 포트를 막아놓고 knockd를 통해 IP를 방화벽에 등록시키기위해
-A에서 -I로 설정을 변경하였습니다.
변경 전
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
변경 후
[openSSH]
sequence = 1111,2222,3333 # 순서대로 1111 2222 3333의 패킷이
seq_timeout = 20 # 20초안에 서버에 도달하면
command = /sbin/iptables -I INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
# 패킷을 발송할 서버의 IP가 방화벽에 등록된다.
tcpflags = syn
/etc/init.d/knockd start
제가 테스트한 서버는 최소 설치만 진행한 상태로 iptables의 룰이 셋팅 되어있지 않습니다.
여기서 icmp 및 22번 포트를 차단해보도록 하겠습니다.
주의 : 이 상태로 하면 knockd를 통해 IP가 22번 포트에 접속할수 있도록 방화벽에서 허용하거나 콘솔로 접속하여
22번 포트를 허용하지 않는이상 PUTTY등으로 SSH 접속을 할수 없게됩니다. 사용전 이 점 꼭 주의하세요.
# icmp 및 22번 포트 차단
iptables -F # iptables의 룰 제거 꼭 사용하지 않아도됩니다.
iptables -A INPUT -p icmp –icmp-type echo-request -j DROP
iptables -A INPUT -p tcp -m tcp –dport 22 -j DROP
윈도우 knock client에서 패킷을 knock 서버로 전송
윈도우로 이동한 후 cmd를 실행한 뒤 knock를 통해 iptables에 IP를 허용할수 있도록 /etc/knockd.conf에서
설정한 [openSSH]의 sequence대로 패킷을 발송합니다.
# 패킷 발송
1. 윈도우에서 cmd를 실행
– Ctrl + R > cmd 입력후 확인
– 시작을 누르고 검색쪽에 cmd를 입력후 엔터
2. knock를 통해 패킷 발송
명령어 : knock 서버 IP 설정해둔 sequence
예시 : knock 111.222.333.444 1111 2222 3333
[openSSH]의 sequence에 맞게 패킷이 발송되면 명령어가 실행되어 서버에 접근할수 있게 되며
iptables 명령어를 통해 IP가 방화벽에 등록이 되어있는 부분을 확인할수 있습니다.
knockd의 응용법
아까 iptables에서 22번을 차단하기전에 icmp를 먼저 차단하였습니다. ping을 확인해보면 ping 확인이
안되는 부분을 확인할수 있습니다. 이번에는 knockd에 다른 설정을 추가하여 허용된 IP만 ping 확인이
가능하도록 설정해보도록 하겠습니다.
리눅스 서버의 /etc/knockd.conf로 이동하여 설정을 진행해보겠습니다. 이번에 추가할것은
패킷이 전송되면 icmp를 허용시켜주는 openicmp와 패킷이 전송되면 icmp를 차단하는 closeicmp입니다.
설정한후에는 꼭 knockd의 재시작이 필요합니다.
kncokd.conf에 별도 설정 추가.
vi /etc/knockd.conf
[openicmp]
sequence = 1212,1313,1414
seq_timeout = 15
command = /sbin/iptables -I INPUT -s %IP% -p icmp –icmp-type echo-request -j ACCEPT
tcpflags = syn
[closeicmp]
sequence = 1515,1616,1717
seq_timeout = 15
command = /sbin/iptables -D INPUT -s %IP% -p icmp –icmp-type echo-request -j ACCEPT
tcpflags = syn
설정후 재시작
/etc/init.d/knockd restart
윈도우로 이동한후 cmd를 실행한 뒤 knock를 통해 iptables에 IP를 허용할수 있도록 /etc/knockd.conf에서
설정한 [openicmp]의 sequence대로 패킷을 발송합니다. 패킷도 아까와 다른 1212 1313 1414 입니다.
패킷 발송
1. 윈도우에서 cmd를 실행
– Ctrl + R > cmd 입력후 확인
– 시작을 누르고 검색쪽에 cmd를 입력후 엔터
2. knock를 통해 패킷 발송
명령어 : knock 서버 IP 설정해둔 sequence
예시 : knock 111.222.333.444 1111 2222 3333
Jul 6 15:04:08 localhost knockd: openSSH: Stage 1
# 패킷 2222가 서버에 발송되어 openSSH의 두번째 패킷과 일치함을 확인
Jul 6 15:04:08 localhost knockd: openSSH: Stage 2
# 패킷 3333가 서버에 발송되어 openSSH의 세번째 패킷과 일치함을 확인
Jul 6 15:04:08 localhost knockd: openSSH: Stage 3
Jul 6 15:04:08 localhost knockd: openSSH: running command: /sbin/iptables -I INPUT -s
-p tcp –dport 22 -j ACCEPT
knockd는 여러모로 유용하게 사용하기 좋은 프로그램이라고 생각합니다. 평소에는 모든 IP의 접속을 차단하고
설정해둔 패킷만 올바르게 받으면 해당 IP만 서버에 접속할수 있게끔 하는 설정도 사용할수 있고 또한 별도의 명령어를
설정해서 사용할수 있다는게 장점이기도 하며 단점이기도 합니다. 한번 이용해보셔도 괜찮을것같습니다.