概要
端口敲门是一种用于保护端口免受未经授权用户访问的方法。通过在一组预先指定的关闭端口上生成连接尝试,打开端口的方法是打开防火墙上的端口。一旦收到正确的连接尝试序列,防火墙将打开以前关闭的端口。端口爆震的主要目的是防御端口扫描程序。更改默认的ssh端口不是保护服务器的安全方法,因为攻击者经常在攻击服务器之前使用端口扫描程序对打开的端口进行自动扫描。因此,敲除端口是保护SSH服务器的最佳方法。
例如,如果要设置端口22的端口断开功能,则仅当您依次请求端口10001、10002、10003时,此端口才会打开。正确完成序列后,防火墙将为您打开端口22。
系统要求
- 运行安装了ssh的Ubuntu 16.04的服务器。
- 在您的服务器上设置了root密码。
入门
开始之前,建议使用以下命令将存储库更新为最新版本:
apt-get update -y
更新存储库后,请重新启动系统以应用所有更改。
安装和配置iptables
默认情况下,UFW防火墙安装在Ubuntu 16.04服务器中。因此,在安装iptables之前,你需要禁用UFW。可以使用以下命令禁用UFW:
ufw disable
接下来,通过运行以下命令来安装iptables:
apt-get install iptables iptables-persistent
一旦安装了iptables,你将需要允许所有已建立的连接和正在进行的会话通过iptables。可以使用以下命令执行此操作:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
接下来,使用以下命令阻止传入的SSH端口22:
iptables -A INPUT -p tcp --dport 22 -j REJECT
接下来,使用以下命令保存防火墙规则:
netfilter-persistent save
netfilter-persistent reload
接下来,你可以通过从远程系统发出命令来测试SSH端口是否被阻止
安装和配置Knockd
默认情况下,Ubuntu 16.04默认存储库中可使用 knocked。你可以通过运行以下命令来安装它:
apt-get install knockd -y
一旦安装了端口敲门服务后,你将需要启用敲门服务才能使用。可以通过编辑 /etc/default/knockd 文件来做到这一点:
vim /etc/default/knockd
更改行从
START_KNOCKD=0
变更为
START_KNOCKD=1
完成后保存并关闭文件。
接下来,你可以通过编辑 /etc/knockd.conf 文件来配置敲门:
vim /etc/knockd.conf
根据你的需求更改 [openSSH] 和 [closeSSH] 部分的默认敲门端口:
示例1:通过指定序列 打开 或 关闭 SSH的22端口
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 10001,10002,10003
seq_timeout = 20
tcpflags = syn
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
[closeSSH]
sequence = 10003,10002,10001
seq_timeout = 20
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
示例2:通过指定序列 打开 SSH的22端口,并在指定时间后 关闭 SSH的22端口,同时不影响现有SSH会话
[options]
logfile = /var/log/knockd.log
[opencloseSSH]
sequence = 2222:udp,3333:tcp,4444:udp
seq_timeout = 15
tcpflags = syn,ack
start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 --syn -j ACCEPT
cmd_timeout = 5
stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 --syn -j ACCEPT
完成后保存文件,然后启动敲门服务以应用以下更改:
systemctl start knockd
设置开机启动敲门服务
systemctl enable knockd
注意:
* sequence = 10001,10002,10003 :当从客户端计算机完成序列时,Knock将**打开SSH端口**。
* seq_timeout = 20 :此选项定义您有**多长时间**来完成敲门音序。
* command = /sbin/iptables -I INPUT -s %IP% -p tcp –dport 22 -j ACCEPT :此命令将**打开端口22**。
* sequence = 10003,10002,10001 :当从客户端计算机完成序列时,Knock将**关闭SSH端口**。
* command = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEPT :此命令将**关闭端口22**。
从客户端系统测试敲门
现在该测试客户端系统的敲门事件了。您可以使用Telnet,Nmap或Knockd客户端测试敲门。
在这里,我将使用Telnet客户端测试敲门。因此,你需要将Telnet安装到客户端系统。运行以下命令以安装Telnet:
apt-get install telnet -y
接下来,在20秒内以正确的顺序运行以下命令:
telnet X.X.X.X 10001
telnet X.X.X.X 10002
telnet X.X.X.X 10003
一旦所有命令都成功。Knockd将通过为客户端系统添加防火墙规则来打开SSH端口。
你还可以通过在服务器上运行以下命令来查看已删除的日志。
tail -f /var/log/knockd.log
输出:
[2020-12-23 09:11] X.X.X.X: openSSH: Stage 1
[2020-12-23 09:12] X.X.X.X: openSSH: Stage 2
[2020-12-23 09:13] X.X.X.X: openSSH: Stage 3
[2020-12-23 09:13] X.X.X.X: openSSH: OPEN SESAME
[2020-12-23 09:13] openSSH: running command: /sbin/iptables -I INPUT -s X.X.X.X -p tcp --dport 22 -j ACCEPT
现在,您可以从客户端系统通过SSH连接服务器。
完成所有工作后,要关闭IP的SSH端口。在20秒内以正确的顺序运行以下命令:
telnet X.X.X.X 10003
telnet X.X.X.X 10002
telnet X.X.X.X 10001
一旦所有命令都成功。Knockd将通过为客户端系统添加防火墙规则来关闭SSH端口。
结论
恭喜你!你已成功测试过Ubuntu 16.04的端口敲门功能。现在,您可以轻松地通过SSH从任何位置或任何系统访问服务器。
评论