如何在Debian 10中使用端口终止序列隐藏网络端口

如何在Debian 10中使用端口终止序列隐藏网络端口

端口敲除是一种通过“敲除”(即连接)一组预定义端口来动态打开网络端口的方法。这对于从端口扫描隐藏开放的网络端口特别有用,因为除非进行端口敲除序列,否则所讨论的端口是关闭的。足够长的端口敲击序列实际上不可能用蛮力完成。例如,要猜测(用蛮力)三个TCP端口的组合,攻击者必须在每个端口敲除序列之后敲并扫描281万亿种可能的组合中的每一个,以打开端口。您可以想象,这可能需要很长时间。

本指南将帮助您在Debian 10上安装“ knocked”灵活的端口“ knocking”守护程序。出于演示目的,我们将SSH端口配置为隐藏,但是其他端口/服务可以使用此方法保护。

要求条件

  • 运行Debian 10的服务器。
  • 根访问服务器。
  • 您需要设置$ EDITOR环境变量。
  • 第二系统进行测试。

注意:如果使用端口敲门来遮盖SSH端口,请确保您具有其他访问方法(例如控制台)。如果您意外锁定,这将很有用。

在安装knock之前,请使用以下命令确定系统的公共网络接口的名称:

ip link show | grep -v lo
2: ens18:  mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

注意接口名称(在这种情况下为ens18)。稍后您将需要它。

步骤1:安装Knockd

敲门是端口敲门守护程序,它监听连接并相应地打开端口。使用敲入iptables规则来实现端口敲除。安装所需的软件包,如下所示:

apt update
apt install knockd iptables-persistent

步骤2:配置Knockd

Knockd使用单个配置文件/etc/knockd.conf定义敲除序列和其他参数。有两种实用的操作模式。前者需要一个敲门顺序来打开和关闭预定义的端口,而另一个则使用单独的打开和关闭顺序。我们之所以使用前者,是因为用户互动较少。

首先,备份您现有的配置文件。

mv /etc/knockd.conf /etc/knockd.conf.bak

接下来,在文本编辑器中打开配置文件。

$EDITOR /etc/knockd.conf

输入以下配置。

(将ens18替换为网络接口的名称。)

[options]
        UseSyslog
	Interface = ens18
[SSH]
        sequence = 1000,2000,3000
        seq_timeout = 15
        tcpflags = syn
        start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        cmd_timeout = 20

这告诉爆震在收到正确的爆震序列(在这种情况下为1000、2000、3000)之后启用到端口22的流量,并在20秒延迟后再次禁用流量。因此,仅在这20秒钟内接受SSH连接。

接下来,编辑文件/ etc / default / knocked以启用knocked。

$EDITOR /etc/default/knockd

然后将START_KNOCKD设置为1。

START_KNOCKD=1

保存文件并退出。同时将系统单元更改为爆震。为此,请创建一个新的单位文件并覆盖默认文件。

$EDITOR /etc/systemd/system/knockd.service

粘贴以下内容:

[Unit]
Description=Port-Knock Daemon
After=network.target
Requires=network.target
Documentation=man:knockd(1)
[Service]
EnvironmentFile=-/etc/default/knockd
ExecStartPre=/usr/bin/sleep 1
ExecStart=/usr/sbin/knockd $KNOCKD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
Restart=always
SuccessExitStatus=0 2 15
ProtectSystem=full
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN
[Install]
WantedBy=multi-user.target

然后使用以下命令加载并激活新设备:

systemctl daemon-reload
systemctl enable --now knockd.service

步骤3:防火墙规则

至此,Knockd已准备就绪,但默认情况下,所有流量都通过防火墙。创建一个拒绝访问端口22 / tcp的防火墙规则。

以下命令确保现有连接不会中断。

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

以下是删除与端口22 / tcp的连接的规则。

iptables -A INPUT -p tcp --destination-port 22 -j DROP
ip6tables -A INPUT -p tcp --destination-port 22 -j DROP

接下来,保存当前的规则链,并在重新启动期间保留它。

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

步骤4:测试

尝试从另一个系统启动到服务器的新SSH会话。您应该无法连接。可以使用多种工具执行敲门序列,但我们将通过Knock(Knockd附带的敲门客户端)进行演示。如步骤1所示,将拆解的软件包安装在另一个系统上,然后运行命令。

knock server_ip_address 1000 2000 3000
ssh [email protected]_ip_address

SSH连接应该成功。

替代配置

或者,可以将Knockd配置为需要两个不同的顺序来打开和关闭网络端口。如果您想长时间保持端口开放,这将很有用。要以这种方式配置Knockd,请打开其配置文件。

$EDITOR /etc/knockd.conf

然后将现有配置替换为:

[options]
        UseSyslog
        Interface = your_interface
[openSSH]
        sequence = 1000,2000,3000
        seq_timeout = 15
        tcpflags = syn
        start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
[closeSSH]
        sequence = 3000,2000,1000
        seq_timeout = 15
        tcpflags = syn
        start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

然后重新启动服务以加载新配置。

systemctl restart knockd.service

结论

Knockd是解决蛮力攻击的有效解决方案,这种攻击在SSH和其他服务中非常常见。如果失败,systemd会重新启动Knockd,但是使用端口敲门来隐藏SSH端口需要一种始终访问服务器的备份方法。

Source

Sidebar