0. 端口敲门
保持服务器特定端口关闭的情况下,仍然允许授权用户连接/访问服务器的这个特定端口。
端口敲门是一种不太常用但却很有趣的网络安全方法,它通过隐藏端点的公开服务来增加额外的防御层,直到进行特定的“敲门”。端口敲门的最早实现使用预定义的数据包序列,而更现代的实现使用称为单数据包授权(SPA)的加密签名,其利用与TLS和其他基于加密的身份验证方案相同类型的公钥基础设施。
1. 安装knockd
apt-get install update
apt-get install knockd -y
2. 配置knockd
2.1 /etc/knockd.conf
[options]
UseSyslog
Interface = ens33
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
参数解析:
参数 | 说明 |
---|---|
sequence | 端口号的集合,"敲门"序列 |
seq_timeout | 序列的有效期 |
command | 一般使用firewalld和iptables等命令,添加一个规则以限制从指定IP地址传入SSH连接。此命令仅在用户启动有效敲门序列时执行 |
tcpflags | 定义敲门连接中接受的TCP数据包类型。在这种情况下,分配SYN类型的TCP分组 |
Interface | 监听网卡 |
那么 [openSSH] 的内容将会被解析为以下内容:
依次访问7000,8000,9000端口,将会执行 /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT ,向 iptables的访问列表头部插入一条允许当前访问IP访问本机22端口的防火墙策略。
那么 [closeSSH] 的内容将会被解析为以下内容:
依次访问9000,8000,7000端口,将会执行 /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT ,向 iptables的访问列表中删除一条允许当前访问IP访问本机22端口的防火墙策略。
2.2 /etc/default/knockd
将 START_KNOCKD 参数的值设置为 1
将 KNOCKD_OPTS 参数 -i 后面的内容设置为监听网卡(此参数也可以不进行设置,默认是注释掉的)
################################################
#
# knockd's default file, for generic sys config
#
################################################
# control if we start knockd at init or not
# 1 = start
# anything else = don't start
#
# PLEASE EDIT /etc/knockd.conf BEFORE ENABLING
START_KNOCKD=1
# command line options
KNOCKD_OPTS="-i ens33"
3. knockd服务
systemctl start knockd.service启动knockd服务
systemctl stop knockd.service终止knockd服务
systemctl status knockd.service 查看knockd服务状态
3.1 START_KNOCKD 参数设置
如果在启动后查看服务状态出现如下内容,可能是 /etc/default/knockd 文件中的 START_KNOCKD 参数并未设置为1。
4. knockd实验
4.1 环境搭建
使用knockd隐藏端口,整个行为是需要动态访问的,所以在这里将要阻止对该端口的默认访问
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
向 INPUT 链添加一条规则,用于接受那些处于 ESTABLISHED 或 RELATED 状态的连接:
-
ESTABLISHED 表示已经建立的连接,即数据包的源地址和目的地址与之前跟踪的连接匹配;
-
RELATED 表示与已建立的连接相关联的连接。
然后需要将默认访问22端口的行为阻止:
iptables -I INPUT -p tcp --dport 22 -j REJECT
4.2 实验过程
4.2.1 开放端口
在 /etc/knockd.conf 中我们设定了一个"敲门"序列,如果依次访问7000,8000,9000端口,那么就会方通"敲门"主机对被敲门"主机的22端口的访问。在此处我使用的时telnet对目标主机的端口进行访问,
telnet [: 服务器 IP] 7000
telnet [: 服务器 IP] 8000
telnet [: 服务器 IP] 9000
也可以通过knock命令对端口进行访问
knock -v [: 服务器 IP] 7000 8000 9000 -d 500
可以看到,在kali主机上一次对Ubuntu主机的7000,8000,9000端口进行访问时,Ubuntu主机的22端口已经成功被打开。在Ubuntu主机上的iptables列表中也能够看到,在列表顶部插入了一条允许192.168.70.206(kali)主机访问本地ssh服务的策略。
4.2.2 过滤访问
在 /etc/knockd.conf 中我们设定了一个"敲门"序列,如果依次访问9000,8000,7000端口,那么就会删除上一个实验中的方通策略。
这一点在Ubuntu主机上的iptables列表中也能够看到:
4.3 访问日志查询
可以通过访问/var/log/syslog知道敲门序列期间服务器中发生了什么
tail /var/log/syslog
也可以通过查看服务状态简单了解敲门序列期间服务器中发生了什么
systemctl status knockd.service
参考
[1] https://goteleport.com/blog/ssh-port-knocking/
原文始发于微信公众号(蟹堡安全团队):Linux隐藏端口--Port knocking
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论