Port knocking

Port knocking 是一种安全方法,它要求在进行特定顺序的端口连接后才授予访问权限,从而保护公网 IP 地址。本文档提供了设置示例,包括将 IP 添加到受信任列表以及阻止可疑端口的防火墙规则配置,并附有关于资源使用的警告。

Port knocking

所有可用的公网 IP 地址都在被机器人和 shodan.io 之类的服务持续进行端口扫描,任何人都可以利用这些信息执行暴力破解攻击并实施任何已知漏洞利用。Port knocking 是一种经济高效的防御方式,它不暴露任何端口,只是监听连接尝试——如果进行了正确顺序的端口连接尝试,客户端就被认为是安全的,并被添加到受信任的地址列表中,从而绕过 WAN 防火墙规则。

设置示例

我们假设你已经设置了一个丢弃所有来自 WAN 端口连接尝试的防火墙,因此你需要在它之前添加额外的规则。 首先,创建一条防火墙规则,监听给定端口并将连接来源 IP 添加到地址列表——这是第一次敲门。

/ip/firewall/filter/add action=add-src-to-address-list address-list=888 address-list-timeout=30s chain=input dst-port=888 in-interface-list=WAN protocol=tcp

然后添加一条在另一个端口上做同样事情的规则,但只批准已经在第一个列表中的 IP。你可以按需重复此步骤任意多次。

/ip/firewall/filter/add action=add-src-to-address-list address-list=555 address-list-timeout=30s chain=input dst-port=555 in-interface-list=WAN protocol=tcp src-address-list=888

最后,最后一次敲门将被添加到受信任的 IP 列表中,任何输入都会被接受。

/ip/firewall/filter/add action=add-src-to-address-list address-list=secured address-list-timeout=30m chain=input dst-port=222 in-interface-list=WAN protocol=tcp src-address-list=555
/ip/firewall/filter/add action=accept chain=input in-interface-list=WAN src-address-list=secured

敲门以获得访问权限

要从 WAN 访问设备,可以使用 port-knocking 客户端,但一条简单的 bash 单行命令配合 nmap 就能完成这项工作。

for x in 888 555 222; do nmap -p $x -Pn xx.xx.xx.xx; done

黑名单

除非你使用大量敲门操作,否则一次简单的端口扫描可能会意外地以正确顺序触发正确的端口,因此建议同时添加黑名单。

在防火墙规则栈的最顶部添加一条针对黑名单的丢弃规则。

/ip/firewall/filter/add action=drop chain=input disabled=yes in-interface-list=WAN src-address-list=blacklist

然后将可疑 IP 添加到黑名单。

错误端口——那些受信任用户永远不会使用的端口,因此具有较高的超时惩罚。

/ip/firewall/filter/add action=add-src-to-address-list address-list=blacklist address-list-timeout=1000m chain=input disabled=yes dst-port=666 in-interface-list=WAN protocol=tcp

那些会显著减慢端口扫描过程、使其变得毫无意义,但永远不会将真实用户锁定太久的端口。这可以包括除“敲门”端口之外的每一个端口。关键在于源 IP 尚未在安全列表中,因此这些端口可以在成功敲门后使用。

/ip/firewall/filter/add action=add-src-to-address-list address-list=blacklist address-list-timeout=1m chain=input disabled=yes dst-port=21,22,23,8291,10000-60000 in-interface-list=WAN protocol=tcp src-address-list=!secured

警告

本节中的黑名单规则以 disabled=yes 添加,以避免将用户锁定在外。一旦有了替代访问方式,就启用这些过滤规则,或使用 <Safe Mode>

为每次敲门使用口令

你还可以更进一步,在每次敲门时发送一个口令。

信息

警告

Layer7 规则非常消耗资源。除非你知道自己在做什么,否则不要使用它们。

<details> <summary>点击打开代码块</summary>

然后创建一个可在敲门规则中请求的 layer7 正则匹配。

/ip/firewall/layer7-protocol/add name=pass regexp="^passphrase/$" /ip/firewall/filter add action=add-src-to-address-list address-list=888 address-list-timeout=30s chain=input dst-port=888 in-interface-list=WAN protocol=udp layer7-protocol=pass

</details>

警告

如需额外的安全层,请参阅暴力破解防护一文:Bruteforce prevention