如何在 Ubuntu 上使用 Port Knocking 来隐藏 SSH 端口
在此页
- 第 1 步:确保安装了所有必需的软件包
- 第 2 步:向 iptables 添加规则
- 第 3 步:在 knockd 运行时访问服务器
- 使用 telnet 客户端测试敲门
你们都知道那些老黑帮电影里,一个人用敲门的顺序进入吗?端口敲门就是这样,仅适用于您的服务器。更改您的默认 ssh 端口并不能保证您不会被黑客攻击。黑客在攻击服务器之前经常使用工具对开放端口进行自动扫描。端口敲门是一种保护自己免受端口扫描器攻击的方法。它拒绝访问受保护的端口,直到客户端以正确的顺序预先访问一系列其他端口。
在 Ubuntu 上安装 port knocking 很容易。我将在本文中向您展示如何安装和设置端口碰撞。本教程中的步骤也适用于 Debian 8。
第 1 步:确保安装了所有必需的软件包
以下所有命令均未以 root 用户身份运行。我不想对所有命令都使用 sudo,所以我使用:
sudo su
成为根用户。第一步是更新 Ubuntu 软件包列表:
apt-get update
然后安装 SSH 服务器(如果尚未安装)。
apt-get install openssh-server
现在安装 knockd 软件,它是控制端口碰撞的守护进程。
apt-get install knockd
Get:1 http://security.debian.org wheezy/updates Release.gpg [1,554 B]
Get:2 http://security.debian.org wheezy/updates Release [102 kB]
Get:3 http://security.debian.org wheezy/updates/main amd64 Packages [336 kB]
Hit http://mirrors.linux教程 wheezy Release.gpg
Hit http://mirrors.linux教程 wheezy Release
Get:4 http://security.debian.org wheezy/updates/main Translation-en [195 kB]
Hit http://mirrors.linux教程 wheezy/main amd64 Packages
Hit http://mirrors.linux教程 wheezy/main Translation-en
Fetched 635 kB in 1s (358 kB/s)
Reading package lists... Done
:~# apt-get install openssh-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
openssh-client
Suggested packages:
ssh-askpass libpam-ssh keychain monkeysphere rssh molly-guard ufw
The following packages will be upgraded:
openssh-client openssh-server
2 upgraded, 0 newly installed, 0 to remove and 32 not upgraded.
Need to get 1,364 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue [Y/n]?按 Y 然后输入继续。
安装软件包后,您必须安装 iptables 内核防火墙。跑步:
apt-get install iptables
第 2 步:向 iptables 添加规则
首先,我们刷新现有的防火墙规则并确保传出连接不会被丢弃。
iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptables --policy OUTPUT ACCEPT我们要确保允许所有已建立的连接和正在进行的会话通过防火墙,否则,防火墙会阻止当前的 SSH 会话:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
注意:上述规则在 STABLISHED,RELATED 中的逗号两边没有空格。
然后使用以下规则阻止传入端口 22 (SSH):
iptables -A INPUT -p tcp --destination-port 22 -j DROP
建立 iptables 规则后,您可以使用 iptables-persistent 在重启时自动执行恢复过程。我们可以从 Ubuntu 的默认存储库下载:
apt-get install iptables-persistent
Current iptables rules can be saved to the configuration file ?
? /etc/iptables/rules.v4. These rules will then be loaded automatically ?
? during system startup. ?
? ?
? Rules are only saved automatically during package installation. See the ?
? manual page of iptables-save(8) for instructions on keeping the rules ?
? file up-to-date. ?
? ?
? Save current IPv4 rules?Current iptables rules can be saved to the configuration file ?
? /etc/iptables/rules.v6. These rules will then be loaded automatically ?
? during system startup. ?
? ?
? Rules are only saved automatically during package installation. See the ?
? manual page of ip6tables-save(8) for instructions on keeping the rules ?
? file up-to-date. ?
? ?
? Save current IPv6 rules?安装过程中,程序会提示你保存当前的iptables规则(ipV4和ipV6),两者都选择是即可。
使用 iptables-save 命令将当前规则集保存到一个文件中。 iptables-restore 稍后可以使用此文件来恢复相同的 iptables 设置:
iptables-save
# Generated by iptables-save v1.4.14 on Tue Feb 23 04:59:28 2016
*filter
:INPUT ACCEPT [1:40]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17:1976]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
COMMIT
# Completed on Tue Feb 23 04:59:28 2016现在,您将保持与现有连接的连接,同时阻止 SSH 端口上的其他连接。
接下来,我们必须配置 knockd。
要配置服务,我们必须编辑配置文件 /etc/knockd.conf。使用 nano 打开文件:
nano /etc/knockd.conf
您将看到如下所示的部分。
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A 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- 在“选项”部分,我们看到指令名称
UseSyslog
。日志文件相当明显——它记录了所有敲门尝试 - 在下面,我们有两个部分:openSSH 和 closeSSH。第一个将允许门环访问端口 22 (SSH),第二个将在门环完成时关闭端口。
- knockd 自动将 %IP% 替换为发送敲门的客户端的 IP 地址,因此您可以只向授权客户端打开端口。
sequence = 9000,8000,7000
这意味着如果同一 IP 在端口 7000 上请求连接,然后直接请求端口 8000,最后请求端口 9000,则这组规则将匹配。强烈建议更改默认端口及其顺序,因为默认顺序很好攻击者也知道。
seq_timeout = 5
\seq_timeout\ 选项以秒为单位定义您有多少时间为敲门提供所有数字。如果您自动生成敲击声,此默认值应该没问题,不会成为问题。
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
指定当客户端进行正确的端口敲门时要执行的命令。 %IP% 的所有实例都将替换为门环 IP 地址。
tcpflags = syn
注意必须用于设置此标志的数据包,在本例中为 syn 数据包。使用 TCP 标志时,knockd 将忽略与标志不匹配的 tcp 数据包。
现在启用敲门声。使用 nano 编辑文件 /etc/default/knockd:
nano /etc/default/knockd
START_KNOCKD=0
到
START_KNOCKD=1
保存并退出后。如果您有多个网络适配器或遇到 knockd 在系统启动期间未自动启动的问题,您可以通过取消注释并修改第二行 KNOCKD_OPTS 来手动指定要监听的网络接口。
然后手动启动 knockd:
service knockd start
这将启动守护进程并允许您通过敲击端口序列来更改 iptables 规则集。
您已经安装了所需的软件包,如果您与服务器断开连接,要重新连接,您必须按正确的顺序敲击您定义的端口以建立 SSH 连接。
第 3 步:在 knockd 运行时访问服务器
如果您按照上述步骤进行操作,那么您将无法在不进行端口敲门的情况下直接连接到 SSH 服务器。
您应该没有收到来自服务器的响应,并且 SSH 客户端应该超时。这是因为我们的 SSH 守护进程当前被 iptables 阻止了。如果没有自动超时,请键入 ctrl-C 结束 SSH 尝试。
使用 telnet 客户端测试敲门
对于 Linux 用户:使用 apt 安装 telnet 包。
对于 Windows 用户:您可以通过访问“程序”部分安装 Telnet 客户端,搜索“打开或关闭 Windows 功能”,从那里启用 Telnet 客户端。
在您的命令提示符中键入以下命令(将端口序列替换为您的自定义序列):
telnet youripaddress 7000
telnet youripaddress 8000
telnet youripaddress 9000您必须在 5 秒内完成所有这些,因为这是配置的时间限制。现在,尝试通过 SSH 连接到您的服务器。您将能够访问该连接。
以相反顺序运行上述命令以关闭 SSH 服务器。
telnet youripaddress 9000
telnet youripaddress 8000
telnet youripaddress 7000端口敲门最好的部分是您可以将其与私钥身份验证一起配置。如果您同时配置两者,那么几乎没有人可以访问或连接,除非他们知道端口和私钥。