메뉴 건너뛰기

imitator

요즘들어 많은 사람들이 보안에 민감해지기 시작했습니다. SSH 설정을 좀더 단단하게 하기도하고

PHP의 기능을 이용해서 웹 디렉토리와 DB를 별도로 보관 하기도하며 사용하는 패스워드를 복잡하게 설정하기도 하죠.


제가 오늘 소개할 프로그램은 제한된 시간 내에 TCP 또는 UTP등의 패킷을 수신 받아서 그 패킷이 

설정한 패킷과 같으면 설정된 내용을 실행시켜주는 knockd 입니다.

이렇게만 들으면 이걸 도대체 어떻게 사용한다는거야? 라고 생각하실수도 있겠지만 자세한 부분은

내용을 천천히 참고해주시기 바랍니다.


주의 : 이 글에서는 iptables 설정을 건들입니다. 잘못설정시 서버에 콘솔로 접근하여 설정을 변경해야할수 있는점 

         주의해주시기 바라며 knockd의 설치 및 설정에 의해 발생하는 문제점은 작업하시는 분의 책임입니다. 

         절대 작성자가 책임을 지지않습니다.


서버 구성 2대

리눅스 OS : Ubuntu 16.04 LTS 64 bit

CPU : 1core

메모리 : 1GB


윈도우 OS : 윈도우 10


윈도우 knock client 설치


1.png


리눅스 서버에 knockd를 설치하기 전에 윈도우 부분을 먼저 셋팅합니다. URL을 통해 이동하여 

Native Win32 Client를 다운로드 받습니다.


다만 자신이 사용하는 컴퓨터 OS가 리눅스거나 또는 knockd에 보낼 패킷을

스마트폰의 어플을 이용하여 보내실경우 이 부분을 진행하지 않으셔도 무방하며

리눅스의 경우 knockd client, telnet, nmap등으로도 패킷을 보낼수 있는점 참고바랍니다.

(윈도우도 telnet이 존재하지만 패킷 전송이 잘되지않는 문제가 있습니다.)


URL: http://www.zeroflux.org/projects/knock


2.png


다운로드 받은 knock-win32의 압축을 해제합니다.


3.png

4.png


압축을 해제한뒤 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 서버 설치


5.png


이번엔 리눅스 서버로 접속하여 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


6.png

7.png


/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


8.png


제가 테스트한 서버는 최소 설치만 진행한 상태로 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 서버로 전송


9.png


윈도우로 이동한 후 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


10.png


[openSSH]의 sequence에 맞게 패킷이 발송되면 명령어가 실행되어 서버에 접근할수 있게 되며

iptables 명령어를 통해 IP가 방화벽에 등록이 되어있는 부분을 확인할수 있습니다.


knockd의 응용법


11.png


아까 iptables에서 22번을 차단하기전에 icmp를 먼저 차단하였습니다. ping을 확인해보면 ping 확인이

안되는 부분을 확인할수 있습니다. 이번에는 knockd에 다른 명령을 추가하여 설정된 IP만 ping 확인이 

가능하도록 설정해보도록 하겠습니다.


12.png


리눅스 서버의 /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


13.png


윈도우로 이동한후 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


15.png
14.png

정상적으로 패킷을 받게되면 명령어가 구동되며 IP가 icmp를 받아올수 있도록 방화벽 설정이 진행되며
ping 확인도 정상적으로 진행할수 있는점을 확인하였습니다.

로그 

16.png

knockd의 로그는 /var/log/syslog에 저장되며 문제가 발생시 해당 로그를 확인해보면됩니다.
이 부분도 리눅스의 telnet으로 패킷을 보낸다는 가정하에 예시를 들어보도록 하겠습니다. 

# 패킷 1111가 서버에 발송되어 openSSH의 첫번째 패킷과 일치함을 확인
root@imitator:~#  telnet 서버 IP 1111

Jul  6 15:04:08 localhost knockd:                          openSSH: Stage 1


# 패킷 2222가 서버에 발송되어 openSSH의 두번째 패킷과 일치함을 확인
root@imitator:~#  telnet 서버 IP 2222

Jul  6 15:04:08 localhost knockd:                          openSSH: Stage 2


# 패킷 3333가 서버에 발송되어 openSSH의 세번째 패킷과 일치함을 확인
root@imitator:~#  telnet 서버 IP 3333

Jul  6 15:04:08 localhost knockd:                          openSSH: Stage 3


# 모든 패킷이 일치함을 확인
Jul  6 15:04:08 localhost knockd:                          openSSH: OPEN SESAME

# 명령어 동작

Jul  6 15:04:08 localhost knockd: openSSH: running command: /sbin/iptables -I INPUT -s                          -p tcp --dport 22 -j ACCEPT


knockd는 여러모로 유용하게 사용하기 좋은 프로그램이라고 생각합니다. 평소에는 모든 IP의 접속을 차단하고 

설정해둔 패킷만 올바르게 받으면 해당 IP만 서버에 접속할수 있게끔 하는 설정도 사용할수 있고 또한 별도의 명령어를

설정해서 사용할수 있다는게 장점이기도 하며 단점이기도 합니다. 한번 이용해보셔도 괜찮을것같습니다.

번호 제목 글쓴이 날짜 조회 수
88 Ubuntu 16.04 apt-get 패키지 설치 오류 발생시 해결방법 file 관리자 2017.10.10 101
87 Ubuntu 16.04 단축 URL을 생성하는 YOURLS 설치 방법 file 관리자 2017.08.11 69
86 Ubuntu 16.04 jar 디컴파일 툴 JD-GUI 설치 file 관리자 2017.08.01 97
85 linux apk를 jar로 디컴파일하는 dex2jar 설치 및 사용 방법 file 관리자 2017.08.01 103
84 우분투 16.04 /var/lib/dpkg/lock 잠금 파일을 얻을 수 없습니다 해결법 [1] file 관리자 2017.07.20 534
» 우분투 16.04 LTS 서버 보안 강화를 위한 knockd 설치 방법 file 관리자 2017.07.06 75
82 CentOS 6 comodo Antivirus for Linux 백신 설치 방법 file 관리자 2017.06.15 90
81 CentOS 6 ssh google-authenticator로 OTP 접속하는 방법 file 관리자 2017.06.09 98
80 vsftpd 호스트로갈 루트가 없음(No route to host) 에러 처리 방법 file 관리자 2017.05.08 641
79 오픈스택 qcow2 이미지 가져오기 secret 관리자 2017.04.17 0
78 let’s Encrypt SSL 무료 인증서 certbot을 통해 설치 및 설정하는 방법 file 관리자 2017.04.13 1151
77 VPN를 악용하는 xe 광고글 작성자를 iptables로 차단하는 방법 [2] file 관리자 2017.03.31 100
76 리눅스 CentOS 마인크래프트 서버 spigot 1.11.2 설치(셋팅)방법 file 관리자 2017.02.27 519
75 CentOS 6.8 네트워크 간혈적으로 끊김 현상 해결 방법 file 관리자 2017.02.20 912
74 오픈스택 미타카 NoValidHost: No valid host was found. There are not enough hosts available. file 관리자 2017.02.15 423
73 umount target is busy 강제 해제하는 방법 관리자 2017.02.10 265
72 리눅스 centos6에서 java 버전 변경하기 관리자 2016.12.26 764
71 ssh-keygen secret 관리자 2016.12.23 0
70 centos 6 tomcat 설치 file 관리자 2016.12.09 751
69 CentOS 6 sendmail 설치 하는 방법 file 관리자 2016.11.16 1029