腾讯云主机上部署端口敲门Knock服务

2021-06-22 09:23:55 浏览数 (1)

端口敲门简单介绍

knock: A port-knocking implementation

端口敲门(knock):个人觉得叫芝麻开门更形象,指的是自己的客户端设备向服务器IP发送一系列实现预定好的暗号,而服务器上需要安装相对应接收暗号的服务knockd,服务器在接收到正确的暗号后,会临时性的为敲门者(客户端)开一段时间的门并随后关上,敲门者(客户端)要在这段时间内登录成功并且保持连接,如果断了连接就要重新敲门。

客户端相当于访客,服务端knockd相当于门童,暗号对上后门童临时开门给访客放行,待访客进入后又关上门

这种方法可以作为一种安全隐藏手段

  • 项目官网地址
代码语言:javascript复制
http://www.zeroflux.org/projects/knock
  • GitHub地址
代码语言:javascript复制
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)、先敲门
代码语言:javascript复制
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客户端程序

(图片可放大查看)

0 人点赞