knockd
为自己留个后门,为了可以在不同的环境中连上服务器,为了方便管理,总希望这么做,但是如此一来又得担心安全问题。所以一般我们针对特定的服务都是固定ip访问,所以想要即安全又可以任何环境都可以访问,我们就需要让防火墙在特定的时刻开放目前ip的访问,而我们既无法连接上服务器又要让服务器开放端口,这似乎是不可能的事。而knock就为我们提供了这样的服务,knock与防护墙通过端口访问形成特定的规则,从而使防护墙验证来源安全而自动开放防火墙规则,而knock就是敲门的意思。
knockd的安装
项目地址:http://www.zeroflux.org/projects/knock (需要翻墙)
本站下载:Source Tarball GitHub: https://github.com/jvinet/knock
1 | ~]# tar xf knock-0.7.tar.gz |
2 | ~]# cd knock-0.7 |
3 | ~]# ./configure --prefix=/usr/local/knock |
4 | ~]# make && make install |
knocked 选项:
- -i,–interface 监听的网口
- -d,–daemon 守护模式运行
- -c,–config 指定一个配置文件
- -D,–debug 输出debug信息
- -l,–lookup dns解析
- -p,–pidfile 指定pidfile
- -g,–logfile 指定logfile
- -v,–vebose 输出详细信息
knockd配置文件
默认配置内容
1 | ~]# vim /usr/local/knock/etc/knockd.conf |
2 | [options] |
3 | logfile = /var/log/knockd.log |
4 | |
5 | [openSSH] |
6 | sequence = 7000,8000,10000 |
7 | seq_timeout = 5 |
8 | command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT |
9 | tcpflags = syn |
10 | |
11 | [closeSSH] |
12 | sequence = 10000,8000,7000 |
13 | seq_timeout = 5 |
14 | command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT |
15 | tcpflags = syn |
16 | |
17 | ----------------------------------------------------------------------------------------------------------------------- |
18 | |
19 | |
20 | [options] 全局配置: |
21 | UseSyslog: 日志输出到系统syslog,即/var/log/messages |
22 | LogFile = /path/to/file: 指定日志的输出文件 |
23 | PidFile = /path/to/file: 指定pid的输出文件 |
24 | Interface = interface_name : 指定监听的网口 |
25 | |
26 | [section] 定义knockd的规则: |
27 | Sequence = port1[:tcp|udp],port2[:tcp|udp]...: 定义特殊的端口队列,如果相同的flag的不同端口队列接受,整个队列都会被丢弃。 |
28 | One_Time_Sequences = /path/to/one_time_sequences_file :一次性敲门队列,可以在一个文件中定义一些一次性的敲门队列,每次敲门后,将会在在正在使用的敲门队列前加上#,并启用下一个敲门队列,一旦队列耗尽,整个程序就会退出 |
29 | Seq_Timeout = timeout: 敲门队列完成的超时时间 |
30 | TCPFlags = fin|syn|rst|psh|ack|urg: 验证tcp的敲门信号的flag标志位 |
31 | Start_Command = command: 当收到正确的敲门队列的情况下,执行的命令 |
32 | Cmd_Timeout = timeout: 在Start_Command and Stop_Command之间的执行的超时时间 |
33 | Stop_Command = command: 在Start_Command已经执行,并且Cmd_Timeout已经超时执行 |
knocked测试
1 | #服务端 |
2 | ~]# ./knockd -D -c ../etc/knockd.conf |
3 | config: new section: 'options' |
4 | config: log file: /var/log/knockd.log |
5 | config: new section: 'openSSH' |
6 | config: openSSH: sequence: 7000:tcp,8000:tcp,9000:tcp |
7 | config: openSSH: seq_timeout: 5 |
8 | config: openSSH: start_command: echo '%IP%' >> /tmp/test.txt |
9 | config: tcp flag: SYN |
10 | config: new section: 'closeSSH' |
11 | config: closeSSH: sequence: 9000:tcp,8000:tcp,7000:tcp |
12 | config: closeSSH: seq_timeout: 5 |
13 | config: closeSSH: start_command: /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT |
14 | config: tcp flag: SYN |
15 | ethernet interface detected |
16 | Local IP: 172.19.122.250 |
17 | Adding pcap expression for door 'openSSH': (dst host 172.19.122.250 and (((tcp dst port 7000 or 8000 or 9000) and tcp[tcpflags] & tcp-syn != 0))) |
18 | Adding pcap expression for door 'closeSSH': (dst host 172.19.122.250 and (((tcp dst port 9000 or 8000 or 7000) and tcp[tcpflags] & tcp-syn != 0))) |
19 | |
20 | |
21 | #客户端 |
22 | ~]# ./knock -v 10.211.55.6 7000 8000 9000 |
23 | hitting tcp 10.211.55.6:7000 |
24 | hitting tcp 10.211.55.6:8000 |
25 | hitting tcp 10.211.55.6:9000 |
26 | |
27 | |
28 | #服务端 |
29 | ~]# ./knockd -D -c ../etc/knockd.conf |
30 | .... |
31 | 2017-09-28 09:23:51: tcp: 112.10.95.255:1060 -> 10.211.55.6:7000 78 bytes |
32 | 2017-09-28 09:23:51: tcp: 112.10.95.255:1061 -> 10.211.55.6:8000 78 bytes |
33 | 2017-09-28 09:23:51: tcp: 112.10.95.255:1062 -> 10.211.55.6:9000 78 bytes |
34 | ~]# iptables -L -n |
35 | Chain INPUT (policy ACCEPT) |
36 | target prot opt source destination |
37 | ACCEPT tcp -- 112.10.95.255 0.0.0.0/0 tcp dpt:22 |
38 | ...... |
该工具的客户端支持多种平台使用,甚至手机端也是支持的。