如何在Ubuntu上使用Port Knocking隐藏SSH端口

你们都知道这些老流氓电影,一个人在门口使用碰撞序列进入? 端口碰撞正是这个,只为你的服务器。 更改默认的ssh端口不能保证不会被黑客攻击。 在攻击服务器之前,黑客经常使用工具对开放端口进行自动扫描。 端口碰撞是一种可以防御端口扫描器的方式,它拒绝访问受保护的端口,直到客户端以正确的顺序访问其他端口序列。

安装端口碰撞Ubuntu很容易。 我将在本文中介绍如何安装和设置端口碰撞。 本教程中的步骤也适用于Debian 8。

第1步:确保安装了所有必需的软件包

以下所有命令都不能以root用户身份运行。 我不想把所有命令的sudo,所以我使用:

sudo su

成为root用户。 第一步是更新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.digitalocean.com wheezy Release.gpg
Hit http://mirrors.digitalocean.com wheezy Release
Get:4 http://security.debian.org wheezy/updates/main Translation-en [195 kB]
Hit http://mirrors.digitalocean.com wheezy/main amd64 Packages
Hit http://mirrors.digitalocean.com wheezy/main Translation-en
Fetched 635 kB in 1s (358 kB/s)
Reading package lists... Done
root@youcl:~#
root@youcl:~# 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再次使用,以恢复相同的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日志文件 是相当明显的 - 它记录所有碰撞尝试
  • Ungerneath,我们有两个部分 :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将IGNORE与标志不匹配的tcp数据包。

现在启用碰撞。 用nano编辑文件/ etc / default / knockd:

nano /etc/default/knockd

并改变:

START_KNOCKD=0

START_KNOCKD=1

此后保存并退出。 如果您有多个网络适配器或者系统启动时没有自动启动的体验问题,您可以手动指定要通过取消注释和修改第二行KNOCKD_OPTS来监听的网络接口。

然后手动开始碰撞:

service knockd start

这将启动守护进程,并允许您通过碰撞端口序列来更改iptables规则集。

您已经安装了所需的软件包,如果您从服务器断开连接,重新连接,则必须碰撞您按正确顺序定义的端口建立SSH连接。

第3步:碰撞运行时访问服务器

如果您已经按照上述步骤操作,那么您将无法直接连接到SSH服务器,无需端口碰撞。

您应该不会收到服务器的响应,SSH客户端应该超时。 这是因为我们的SSH守护程序当前被iptables阻止。 键入ctrl-C以结束SSH尝试,如果它不会自动超时。

用telnet客户端测试碰撞

对于Linux用户:使用apt安装telnet软件包。

对于Windows用户:您可以通过访问“程序”部分安装Telnet客户端,搜索“打开或关闭窗口功能”,从中启用Telnet客户端。

在命令提示符下键入以下命令(使用自定义序列替换端口序列):

telnet youripaddress 7000
telnet youripaddress 8000
telnet youripaddress 9000

您必须在5秒钟内完成所有操作,因为这是为配置强加的时间限制。 现在,尝试通过SSH连接到您的服务器。 您将可以访问连接。

以相反的顺序执行上述命令关闭SSH服务器。

telnet youripaddress 9000
telnet youripaddress 8000
telnet youripaddress 7000

端口碰撞的最好的部分是您可以配置私钥验证。 如果您配置两者,那么实际上没有机会获得访问或连接,除非他们知道这两个端口和私钥。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏