端口敲门简单介绍
knock: A port-knocking implementation
端口敲门(knock):个人觉得叫芝麻开门更形象,指的是自己的客户端设备向服务器IP发送一系列实现预定好的暗号,而服务器上需要安装相对应接收暗号的服务knockd,服务器在接收到正确的暗号后,会临时性的为敲门者(客户端)开一段时间的门并随后关上,敲门者(客户端)要在这段时间内登录成功并且保持连接,如果断了连接就要重新敲门。
客户端相当于访客,服务端knockd相当于门童,暗号对上后门童临时开门给访客放行,待访客进入后又关上门
这种方法可以作为一种安全隐藏手段
- 项目官网地址
http://www.zeroflux.org/projects/knock
- GitHub地址
https://github.com/jvinet/knock
(图片可放大查看)
具体原理可以参考 《鳥哥的 Linux 私房菜》中的链接
代码语言:javascript复制http://linux.vbird.org/linux_security/knockd.php
下面介绍在腾讯云主机上部署端口敲门Knock服务
1、服务端安装knock-server
CentOS7操作系统的腾讯云轻量服务器一台用于本文的演示
(图片可放大查看)
配置EPEL源,可以在EPEL源中查找到knock
代码语言:javascript复制yum search knock
yum安装
代码语言:javascript复制yum -y install knock-server
(图片可放大查看)
代码语言:javascript复制man knockd
查看配置样例说明及语法手册
(图片可放大查看)
2、配置sshd监听端口
为了演示方便,我这里设置SSHD服务监听端口5522
代码语言:javascript复制vi /etc/ssh/sshd_config
新增如下两行
ListenAddress 0.0.0.0:22
#新增SSHD服务监听端口5522
ListenAddress 0.0.0.0:5522
(图片可放大查看)
(图片可放大查看)
3、修改/etc/knockd.conf配置文件
代码语言:javascript复制vi /etc/knockd.conf
[options]
#UseSyslog
Interface = eth0
LogFile = /var/log/knockd.log
[opencloseSSH]
sequence = 1122:tcp,2233:tcp,3344:tcp
seq_timeout = 20
tcpflags = syn
start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 5522 -j ACCEPT
cmd_timeout = 60
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 5522 -j ACCEPT
(图片可放大查看)
其中sequence = 1122:tcp,2233:tcp,3344:tcp可以理解为暗号序列
[options]中Interface 指定相应的网卡名,如果不配置Interface则默认为eth0
4、启动knockd服务并设置成开机自启动
代码语言:javascript复制systemctl enable knockd.service
systemctl restart knockd.service
(图片可放大查看)
查看knockd.log服务日志 tail -f /var/log/knockd.log
5、云主机安全组规则配置
我这里是腾讯云轻量服务器,操作系统为CentOS7
(图片可放大查看)
(图片可放大查看)
(图片可放大查看)
6、客户端配置及knock功能测试
比如CentOS7主机,测试主机IP 192.168.31.52
- 1)、配置epel源后yum install方式安装knock
(图片可放大查看)
- 2)、先敲门
knock -v HOST_IP 1122:tcp 2233:tcp 3344:tcp
这时可以在腾讯云主机上tail -f /var/log/knockd.log
(图片可放大查看)
可以看到Stage1->Stage2->Stage3阶段完成后,执行iptables命令,插入一条允许客户端IP访问5522端口的防火墙规则
iptables -nvL | grep 5522 可以知道规则生效
(图片可放大查看)
- 3)、然后再客户端SSH登录
(图片可放大查看)
- 4)、1分钟后自动删除防火墙规则 knockd服务在1分钟后会自动执行iptables命令,删除客户端IP访问5522端口的防火墙规则
(图片可放大查看)
可以在/var/log/knockd.log中看到,所以客户端在敲门成功后,需要在这一分钟内登录成功 SSH登录成功后连接不断开就行,如果断了连接就要重新敲门knock
(图片可放大查看)
当然1分钟(60S)你觉得太短,你可以在配置文件中调整cmd_timeout
7、/etc/knockd.conf配置文件改用firewalld
CentOS7默认使用的firewalld防火墙服务,其实这时可以用rich-rule来做 修改成如下配置文件
代码语言:javascript复制vi /etc/knockd.conf
[options]
#UseSyslog
Interface = eth0
LogFile = /var/log/knockd.log
[opencloseSSH]
sequence = 1122:tcp,2233:tcp,3344:tcp
seq_timeout = 20
tcpflags = syn
start_command = /usr/bin/firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="%IP%" port port="5522" protocol="tcp" accept';/usr/bin/firewall-cmd --reload
cmd_timeout = 60
stop_command = /usr/bin/firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="%IP%" port port="5522" protocol="tcp" accept';/usr/bin/firewall-cmd --reload
(图片可放大查看)
同样1分钟后自动删除防火墙规则
(图片可放大查看)
8、Tips
1)、客户端可以使用&&命令
代码语言:javascript复制knock -v HOST_IP:tcp 2233:tcp 3344:tcp && ssh [-p sshd_port] root@HOST_IP
2)、Windows版本的knock客户端程序
knock也提供了Windows版本的knock客户端程序
(图片可放大查看)