Port Knocking 是一种通过在特定顺序下连接到一系列预定义端口来触发防火墙规则的技术。通过正确的端口顺序,用户可以“敲门”以触发特定的操作,比如允许连接到受保护的服务端口。这种技术可以增加网络安全性,隐藏真实的服务端口,以及防止未经授权的访问。

实现 Port Knocking 的条件和因素

  1. 防火墙支持:需要在防火墙上设置规则来响应特定的端口序列。

  2. Knockd 服务:通常使用像 knockd 这样的服务来监听端口敲击序列并触发相应的操作。

  3. 端口序列:定义一个有效的端口敲击序列,以及对应的开启和关闭操作。

Port Knocking 的作用

  1. 增加安全性:隐藏真实的服务端口,使得攻击者难以发现服务的存在。

  2. 防止暴力攻击:通过要求特定的端口顺序,可以减少暴力破解的风险。

  3. 动态访问控制:根据端口敲击序列动态调整防火墙规则,实现临时访问控制。

Port Knocking 的使用场景

  1. 远程访问:用于远程服务器的安全访问,只有知道正确的端口敲击序列的用户才能访问服务。

  2. 网络隐蔽:隐藏真实的服务端口,增加网络安全性。

  3. 动态访问控制:根据端口敲击序列动态开放或关闭服务端口,增加访问控制的灵活性。

安装 Knock 服务

apt install -y knockd

修改配置文件进行配置端口敲门

cat /etc/knockd.conf 

将以下配置粘贴至该文件即可

[options]
	UseSyslog

[openSSH]
	sequence    = 9000,8000,7000
	seq_timeout = 60
	command     = /sbin/iptables -I INPUT -s %IP%  -p tcp --dport 22 -j ACCEPT > /dev/null 2>&1  && /sbin/iptables-save > /dev/null 2>&1
	tcpflags    = syn

[closeSSH]
	sequence    = 9000,8000,7000
	seq_timeout = 5
	command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT && /sbin/iptables-save
	tcpflags    = syn

在配置端口拦截前启动 knock 服务,避免被拦截在外,无法进入服务器

systemctl start knockd.service
systemctl enable knockd.service

成功启动服务后开启端口拦截

使用 iptables 拦截 22 端口

安装 iptables 工具

sudo apt install iptables -y

1、创建一个新的 iptables 链,以便管理 SSH 访问:

sudo iptables -N SSH_ACCESS

2、添加规则,允许已建立的 SSH 连接通过:

sudo iptables -A SSH_ACCESS -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

3、添加规则,禁止所有 IP 访问 22 端口:

sudo iptables -A SSH_ACCESS -p tcp --dport 22 -j REJECT

4、最后,将 SSH_ACCESS 链应用到 INPUT 链上:

sudo iptables -A INPUT -j SSH_ACCESS

保存 iptables 规则

1、保存当前 iptables 规则,以便重启后规则仍然有效:

sudo iptables-save > /etc/iptables/rules.v4

2、确保 iptables 服务在系统启动时加载规则 (对于 Debian/Ubuntu 等系统):

sudo apt install iptables-persistent
sudo apt install netfilter-persistent

sudo systemctl enable netfilter-persistent
sudo netfilter-persistent save