news 2026/3/20 14:06:03

iptables 结合敲门技术实现端口隐藏

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
iptables 结合敲门技术实现端口隐藏

iptables 结合敲门技术实现端口隐藏

敲门技术(Port Knocking)是一种通过特定顺序连接多个端口来动态打开防火墙端口的安全机制。以下是使用 iptables 实现端口隐藏的完整方案:

一、敲门技术原理

基本工作流程

客户端 → [发送秘密敲门序列] → 服务器 1. 连接端口 1111 (失败) 2. 连接端口 2222 (失败) 3. 连接端口 3333 (失败) 4. 服务器检测到正确序列,动态打开 SSH 端口 5. 客户端连接 SSH 端口 22 (成功)

架构图

┌─────────┐ 敲门序列 ┌─────────┐ │ 客户端 │ ──────────> │ 服务器 │ │ │ 1111→2222→3333 │ │ └─────────┘ └─────────┘ ↓ ↓ 连接端口22 临时开放端口22

二、基于 iptables 的敲门实现

方法1:使用 iptables + 日志监控

1.初始防火墙设置
#!/bin/bash# knock-init.sh - 初始化防火墙规则# 清除现有规则iptables -F iptables -t nat -F iptables -t mangle -F# 设置默认策略iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT# 允许本地回环iptables -A INPUT -i lo -j ACCEPT# 允许已建立的连接iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 允许ICMP(ping)iptables -A INPUT -p icmp -j ACCEPT# 记录所有连接尝试(用于敲门检测)iptables -A INPUT -p tcp --dport1111-j LOG --log-prefix"KNOCK1: "iptables -A INPUT -p tcp --dport2222-j LOG --log-prefix"KNOCK2: "iptables -A INPUT -p tcp --dport3333-j LOG --log-prefix"KNOCK3: "# 默认拒绝并记录iptables -A INPUT -p tcp -j LOG --log-prefix"DENIED: "iptables -A INPUT -p udp -j LOG --log-prefix"DENIED: "# 保存规则iptables-save>/etc/iptables/knock.rules
2.敲门检测脚本
#!/bin/bash# knock-watch.sh - 监控敲门序列LOG_FILE="/var/log/knock.log"KNOCK_SEQUENCE="1111:2222:3333"KNOCK_TIMEOUT=30# 秒SSH_PORT=22ALLOW_IP=""ALLOW_TIMEOUT=300# 允许访问的时间(秒)# 监控系统日志tail-F /var/log/syslog|whilereadlinedo# 检测第一个敲门ifecho"$line"|grep-q"KNOCK1: ";thenIP=$(echo"$line"|grep-o"SRC=[0-9.]*"|cut-d=-f2)TIME=$(date+%s)echo"$TIME:KNOCK1:$IP">>$LOG_FILE# 启动敲门序列检测check_knock_sequence"$IP"&fidone&# 敲门序列检测函数check_knock_sequence(){localip=$1localstart_time=$(date+%s)localsequence=""while[$(($(date+%s)-start_time))-lt$KNOCK_TIMEOUT];do# 检查日志中的敲门事件iftail-n100$LOG_FILE|grep"KNOCK1:$ip">/dev/null;thensequence="1111"# 等待第二个敲门sleep1iftail-n100$LOG_FILE|grep"KNOCK2:$ip">/dev/null;thensequence="$sequence:2222"# 等待第三个敲门sleep1iftail-n100$LOG_FILE|grep"KNOCK3:$ip">/dev/null;thensequence="$sequence:3333"# 验证敲门序列if["$sequence"="$KNOCK_SEQUENCE"];thenecho"$(date): Valid knock sequence from$ip">>$LOG_FILEopen_port_for_ip"$ip"breakfifififisleep1done}# 为特定IP开放端口open_port_for_ip(){localip=$1# 添加临时规则允许SSH访问iptables -I INPUT1-p tcp -s$ip--dport$SSH_PORT-j ACCEPTecho"$(date): Opened SSH port for$ip">>$LOG_FILE# 设置定时删除规则(sleep$ALLOW_TIMEOUTiptables -D INPUT -p tcp -s$ip--dport$SSH_PORT-j ACCEPTecho"$(date): Closed SSH port for$ip">>$LOG_FILE)&# 记录允许的IPALLOW_IP=$ip}

方法2:使用 iptables + recent 模块(推荐)

1.更高效的实现方案
#!/bin/bash# knock-iptables.sh - 使用 iptables recent 模块# 敲门端口序列PORT1=1111PORT2=2222PORT3=3333SSH_PORT=22TIMEOUT=10# 敲门序列必须在10秒内完成ACCESS_TIMEOUT=300# SSH访问超时时间# 清除现有规则iptables -F iptables -X# 创建自定义链iptables -N KNOCKING iptables -N KNOCK1_CHECK iptables -N KNOCK2_CHECK iptables -N KNOCK3_CHECK iptables -N PASSED# 设置默认策略iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT# 允许本地回环和已建立连接iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT# 将敲门端口的流量重定向到敲门链iptables -A INPUT -p tcp --dport$PORT1-j KNOCK1_CHECK iptables -A INPUT -p tcp --dport$PORT2-j KNOCK2_CHECK iptables -A INPUT -p tcp --dport$PORT3-j KNOCK3_CHECK# === 敲门检查链 ===# 第一步:检查端口1111iptables -A KNOCK1_CHECK -m recent --name KNOCK1 --set -j DROP# 第二步:检查端口2222(必须在KNOCK1列表中存在)iptables -A KNOCK2_CHECK -m recent --name KNOCK1 --remove -j KNOCK2_CHECK_2 iptables -A KNOCK2_CHECK_2 -m recent --name KNOCK2 --set -j DROP# 第三步:检查端口3333(必须在KNOCK2列表中存在)iptables -A KNOCK3_CHECK -m recent --name KNOCK2 --remove -j KNOCK3_CHECK_2 iptables -A KNOCK3_CHECK_2 -m recent --name KNOCK3 --set -j DROP# 第四步:敲门成功后处理iptables -A KNOCK3_CHECK_2 -m recent --name KNOCK3 --remove -j PASSED# === 通过验证后的处理 ===iptables -A PASSED -m recent --name ALLOWED --set -j LOG --log-prefix"KNOCK_SUCCESS: "iptables -A PASSED -j DROP# === 允许通过验证的IP访问SSH ===iptables -A INPUT -p tcp --dport$SSH_PORT-m recent --name ALLOWED --rcheck --seconds$ACCESS_TIMEOUT-j ACCEPT# === 敲门超时处理(使用定时任务清理)===# 添加定时清理任务echo"*/1 * * * * root /usr/local/sbin/knock-cleanup">/etc/cron.d/knock-cleanup
2.清理脚本
#!/bin/bash# knock-cleanup.sh - 清理过期的敲门记录# 清除超过10秒的敲门记录iptables-save|grep"recent.*KNOCK"|whilereadline;do# 提取IP地址ip=$(echo$line|grep-o'[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+')if[!-z"$ip"];then# 从敲门列表中删除echo$ip>/proc/net/xt_recent/KNOCK1echo$ip>/proc/net/xt_recent/KNOCK2echo$ip>/proc/net/xt_recent/KNOCK3fidone# 清除超过5分钟的允许记录iptables-save|grep"ALLOWED"|whilereadline;do# 这里可以添加更复杂的清理逻辑echo"Cleaning old knock entries"done

方法3:完整的敲门服务

1.Python 敲门服务器
#!/usr/bin/env python3# knock-server.py - 完整的敲门服务器importsysimportsocketimporttimeimportsubprocessimportthreadingfromcollectionsimportdefaultdict# 配置KNOCK_SEQUENCE=[1111,2222,3333]# 敲门序列SSH_PORT=22TIMEOUT=10# 整个序列必须在10秒内完成ACCESS_DURATION=300# 允许访问的时间(秒)# 记录每个IP的敲门状态knock_status=defaultdict(list)defrun_iptables_command(cmd):"""执行 iptables 命令"""subprocess.run(['iptables']+cmd.split(),check=False)defopen_port_for_ip(ip):"""为指定IP开放SSH端口"""# 检查是否已存在规则check_cmd=f"-C INPUT -p tcp -s{ip}--dport{SSH_PORT}-j ACCEPT 2>/dev/null"result=subprocess.run(f'iptables{check_cmd}',shell=True)ifresult.returncode!=0:# 添加规则run_iptables_command(f"-I INPUT -p tcp -s{ip}--dport{SSH_PORT}-j ACCEPT")print(f"[+] Opened SSH port for{ip}")# 设置定时关闭threading.Timer(ACCESS_DURATION,close_port_for_ip,args=[ip]).start()defclose_port_for_ip(ip):"""关闭指定IP的SSH端口"""run_iptables_command(f"-D INPUT -p tcp -s{ip}--dport{SSH_PORT}-j ACCEPT")print(f"[-] Closed SSH port for{ip}")defhandle_knock(data,addr):"""处理敲门请求"""ip=addr[0]current_time=time.time()try:port=int(data.decode().strip())except:return# 清理过期记录knock_status[ip]=[tfortinknock_status[ip]ifcurrent_time-t[1]<TIMEOUT]# 检查敲门序列expected_port=KNOCK_SEQUENCE[len(knock_status[ip])]ifport==expected_port:knock_status[ip].append((port,current_time))print(f"[*]{ip}knocked port{port}")# 检查是否完成完整序列iflen(knock_status[ip])==len(KNOCK_SEQUENCE):# 验证序列是否正确received_ports=[p[0]forpinknock_status[ip]]ifreceived_ports==KNOCK_SEQUENCE:print(f"[+] Valid knock sequence from{ip}")open_port_for_ip(ip)# 清理该IP的记录delknock_status[ip]else:# 错误的敲门,重置该IP的状态ifipinknock_status:delknock_status[ip]print(f"[-] Invalid knock from{ip}")defmain():# 初始化防火墙print("[*] Initializing firewall...")subprocess.run(['iptables','-F','INPUT'])subprocess.run(['iptables','-P','INPUT','DROP'])subprocess.run(['iptables','-A','INPUT','-i','lo','-j','ACCEPT'])subprocess.run(['iptables','-A','INPUT','-m','state','--state','ESTABLISHED,RELATED','-j','ACCEPT'])# 创建UDP服务器监听敲门sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)sock.bind(('0.0.0.0',0))# 随机端口print(f"[*] Knock server listening on port{sock.getsockname()[1]}")print(f"[*] Knock sequence:{KNOCK_SEQUENCE}")whileTrue:try:data,addr=sock.recvfrom(1024)threading.Thread(target=handle_knock,args=(data,addr)).start()exceptKeyboardInterrupt:print("\n[*] Shutting down...")breakexceptExceptionase:print(f"[!] Error:{e}")if__name__=="__main__":main()
2.客户端敲门脚本
#!/bin/bash# knock-client.sh - 客户端敲门脚本SERVER_IP="your_server_ip"KNOCK_PORTS="1111 2222 3333"DELAY=1# 敲门间隔(秒)echo"Knocking on$SERVER_IP..."forportin$KNOCK_PORTS;doecho" Knocking port$port"# 使用nc连接(TCP敲门)nc-z -w1$SERVER_IP$port>/dev/null2>&1# 或者使用nmap(更隐蔽)# nmap -Pn --host-timeout 201 --max-retries 0 -p $port $SERVER_IP > /dev/null 2>&1sleep$DELAYdoneecho"Knock sequence completed. You can now connect to SSH."echo"ssh user@$SERVER_IP"

三、高级敲门技术

1.加密敲门

# 使用加密的敲门序列# 服务器端KNOCK_KEY="secret_key"# 客户端使用哈希生成动态端口#!/bin/bash# encrypted-knock-client.shSERVER_IP="192.168.1.100"SECRET="my_secret_key"TIMESTAMP=$(date+%s)SEQUENCE=$(echo-n"${SECRET}${TIMESTAMP}"|md5sum|cut-c1-12)# 将哈希值转换为端口序列PORT1=$((0x${SEQUENCE:0:3}%1000+2000))PORT2=$((0x${SEQUENCE:3:3}%1000+3000))PORT3=$((0x${SEQUENCE:6:3}%1000+4000))# 执行敲门forportin$PORT1$PORT2$PORT3;donc-z -w1$SERVER_IP$portsleep0.5done

2.单包授权(SPA)

# 使用单个加密包授权# 服务器端使用 iptables 结合字符串匹配iptables -A INPUT -p udp --dport9999-m string --string"SECRET_TOKEN"--algo bm -j ACCEPT

3.使用 fwknop 工具

# 安装 fwknop# Ubuntu/Debianapt-getinstallfwknop-client fwknop-server# CentOS/RHELyuminstallfwknop# 服务器配置 /etc/fwknop/fwknopd.confPCAP_FILTER"udp port 62201";ENABLE_SPA_PACKET_AGING Y;REQUIRE_SOURCE_ADDRESS Y;# 客户端敲门fwknop -A tcp/22 -a192.168.1.100 -D server_ip

四、安全增强措施

1.防暴力破解

# 使用 iptables limit 模块限制敲门尝试iptables -A INPUT -p tcp -m multiport --dports1111,2222,3333 -m recent --set --name KNOCK_ATTEMPT iptables -A INPUT -p tcp -m multiport --dports1111,2222,3333 -m recent --update --seconds60--hitcount5--name KNOCK_ATTEMPT -j DROP

2.IP黑名单

# 创建黑名单链iptables -N BLACKLIST iptables -A BLACKLIST -j LOG --log-prefix"BLACKLIST: "iptables -A BLACKLIST -j DROP# 可疑IP加入黑名单iptables -I INPUT -s192.168.1.100 -j BLACKLIST

3.日志监控

# 详细的敲门日志iptables -A INPUT -p tcp --dport1111-j LOG --log-prefix"KNOCK1: "--log-level6iptables -A INPUT -p tcp --dport2222-j LOG --log-prefix"KNOCK2: "--log-level6iptables -A INPUT -p tcp --dport3333-j LOG --log-prefix"KNOCK3: "--log-level6# 监控日志tail-f /var/log/syslog|grepKNOCK

五、部署和测试

1.部署步骤

# 1. 安装依赖apt-getinstalliptables-persistent netcat# 2. 配置 iptables 规则chmod+x knock-init.sh ./knock-init.sh# 3. 启动敲门监控nohup./knock-watch.sh>/var/log/knock.log2>&1&# 4. 保存配置iptables-save>/etc/iptables/rules.v4# 5. 设置开机启动echo"./knock-watch.sh">>/etc/rc.local

2.测试敲门

# 从客户端测试./knock-client.sh# 检查服务器日志tail-f /var/log/knock.log# 验证 iptables 规则iptables -L INPUT -n --line-numbers

3.故障排除

# 查看敲门状态cat/proc/net/xt_recent/*# 检查日志dmesg|grep-i knock journalctl -u knock-server# 测试端口连通性nc-zv server_ip22

六、注意事项

  1. 备用访问方式:配置敲门时,务必保留一个备用访问方式(如控制台、第二个网络接口)
  2. 日志监控:定期检查敲门日志,检测异常行为
  3. 序列复杂性:使用复杂、随机、定期更换的敲门序列
  4. 超时设置:合理设置超时时间,避免过短或过长
  5. 端口选择:避免使用常见端口作为敲门端口
  6. 加密通信:考虑使用加密的敲门工具如 fwknop
  7. 多因素认证:结合其他认证方式增强安全性

敲门技术可以有效隐藏服务端口,显著增加攻击者发现和攻击服务的难度。但需要注意,这不能替代其他安全措施,应作为深度防御策略的一部分使用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/10 10:49:13

XV3DGS-UEPlugin实战指南:解锁UE5高斯泼溅渲染新境界

XV3DGS-UEPlugin实战指南&#xff1a;解锁UE5高斯泼溅渲染新境界 【免费下载链接】XV3DGS-UEPlugin 项目地址: https://gitcode.com/gh_mirrors/xv/XV3DGS-UEPlugin 还在为3D模型渲染的复杂流程而烦恼吗&#xff1f;想象一下&#xff0c;只需几个简单步骤就能在Unreal …

作者头像 李华
网站建设 2026/3/12 17:39:00

如何快速掌握BongoCat:新手小白的完整使用指南

如何快速掌握BongoCat&#xff1a;新手小白的完整使用指南 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作&#xff0c;每一次输入都充满趣味与活力&#xff01; 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 想要让单调的电…

作者头像 李华
网站建设 2026/3/4 1:16:01

用CRNN OCR节省70%人工录入成本:企业级部署方案

用CRNN OCR节省70%人工录入成本&#xff1a;企业级部署方案 背景与业务痛点&#xff1a;OCR文字识别的现实挑战 在企业日常运营中&#xff0c;大量非结构化文档&#xff08;如发票、合同、物流单据、身份证件&#xff09;需要转化为可处理的文本数据。传统的人工录入方式不仅效…

作者头像 李华
网站建设 2026/3/15 9:55:44

CRNN在物流行业的应用:运单自动识别系统

CRNN在物流行业的应用&#xff1a;运单自动识别系统 &#x1f4d6; 项目背景与行业痛点 在现代物流体系中&#xff0c;每日产生海量的纸质运单、快递面单和电子回执。传统的人工录入方式不仅效率低下&#xff08;平均每单耗时30秒以上&#xff09;&#xff0c;且错误率高达5%-8…

作者头像 李华
网站建设 2026/3/10 10:04:44

XV3DGS-UEPlugin终极指南:5步实现高斯泼溅模型的UE5实时渲染革命

XV3DGS-UEPlugin终极指南&#xff1a;5步实现高斯泼溅模型的UE5实时渲染革命 【免费下载链接】XV3DGS-UEPlugin 项目地址: https://gitcode.com/gh_mirrors/xv/XV3DGS-UEPlugin 在当今计算机图形学领域&#xff0c;高斯泼溅模型正以其革命性的渲染效果改变着三维重建的…

作者头像 李华
网站建设 2026/3/11 0:41:54

实战案例:发票文档自动识别,OCR镜像部署成本降60%

实战案例&#xff1a;发票文档自动识别&#xff0c;OCR镜像部署成本降60% &#x1f4d6; 项目背景与业务痛点 在企业财务、税务和报销流程中&#xff0c;发票信息的录入长期依赖人工操作&#xff0c;不仅效率低下&#xff0c;还容易因视觉疲劳或字迹模糊导致错录、漏录。传统…

作者头像 李华