密码学敲门:防止对特定的网络服务进行探测和扫描

273 天前
 testcaoy7
在逛 Arch Wiki 的时候(虽然我不是 Arch 用户),看到了一个有意思的 Topic:Port Knocking

然后文章的最底下提到了一个叫 fwknopd 的程序,它可以实现基于发送单个数据包,完成用户身份认证,并让防火墙自动开放端口

然后很巧的是,这个程序 Ubuntu/Debian 都有打包,用 apt 安装就是了,于是乎就拿来玩一下,以下是过程:

1 、在客户端执行:fwknop -D 11.22.33.44 -k --use-hmac --save-rc-stanza
-D ,即服务器地址,可以是域名,也可以是 ip
-k ,生成密钥
--use-hmac ,生成消息认证码
--save-rc-stanza ,保存参数到配置文件(.fwknoprc )

2 、在服务器上编辑/etc/fwknop/access.conf 文件
首先在文件靠近底部的地方有填写密钥和消息认证码的地方,把客户端刚刚生成的 BASE64 编码的密钥和 HMAC 都填写进去;然后在下面再加一行 FW_ACCESS_TIMEOUT 3600;(注意;符号不要漏掉),不加的话,默认敲门后只开门 30 秒

3 、在服务器上编辑/etc/fwknop/fwknopd.conf 文件
在文件的末尾加上 PCAP_INTF ens5; 这是设置监听的网卡,如果要保护服务的网卡不是 eth0 ,则要加

4 、配置防火墙默认丢弃数据包(这里要保护的协议/端口是 tcp/443 )
iptables -I INPUT 1 -i ens5 -p tcp --dport 443 -j DROP
iptables -I INPUT 1 -i ens5 -p tcp --dport 443 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

5 、在服务器运行 fwknop 服务器( fwknopd ),可以用 fwknopd -S 来检查服务器是否已运行

6 、敲门前,在客户端运行 nmap -sS -p 443 11.22.33.44 ,由于没有敲门,结果应该是 filtered

7 、敲门,在客户端运行 fwknop -n 11.22.33.44 -A tcp/443 -s
-n 查询.fwknoprc 文件中的主机名
-A 要访问的协议和端口
-s 告诉服务器在敲门成功的情况下为敲门数据包的来源地址开门

敲了门之后运行在 11.22.33.44 ,tcp/443 上的服务应该可以被正常访问了,按照之前的设置,3600 秒之后需要重新敲门,所以可以用 crontab 每小时敲门

fwknop 默认使用 UDP/62201 进行敲门,可以配置为其他协议( tcp, tcp_raw_socket, icmp ),以及其他端口,具体可以看 manpage

这里需要特别说明,敲门时指定的参数-s 相当于告诉服务器,只要身份核验通过,就为敲门数据包的来源地址放行,方便,但可以被 MiTM 攻击,当很清楚自己的出口 ip 的时候,应该将-s 参数替换为 -a <自己的公网 ip>
1037 次点击
所在节点    奇思妙想
2 条回复
iqoo
272 天前
其实都不用客户端命令,Web 版都可以实现: https://www.etherdream.com/port-knocking/
azio7
272 天前
很老的技术了,几年在一本旧书上见过

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/964006

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX