news 2026/3/3 3:26:30

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/3 8:35:25

BongoCat桌面伴侣终极玩法:让呆萌猫咪陪你敲代码打游戏

BongoCat桌面伴侣终极玩法&#xff1a;让呆萌猫咪陪你敲代码打游戏 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作&#xff0c;每一次输入都充满趣味与活力&#xff01; 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 还在为…

作者头像 李华
网站建设 2026/2/27 0:28:51

JPEGsnoop终极指南:5步轻松掌握专业图像分析

JPEGsnoop终极指南&#xff1a;5步轻松掌握专业图像分析 【免费下载链接】JPEGsnoop JPEGsnoop: JPEG decoder and detailed analysis 项目地址: https://gitcode.com/gh_mirrors/jp/JPEGsnoop 想要深入了解JPEG图像内部结构吗&#xff1f;JPEGsnoop就是你的专业助手&am…

作者头像 李华
网站建设 2026/3/2 7:59:35

CRNN OCR高并发处理:应对大规模识别需求的策略

CRNN OCR高并发处理&#xff1a;应对大规模识别需求的策略 &#x1f4d6; 项目简介 在数字化转型加速的今天&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术已成为信息自动化提取的核心工具。从发票扫描到文档归档&#xff0c;从车牌识别到手写笔记转录&#xff0c;O…

作者头像 李华
网站建设 2026/2/27 0:35:14

翻译服务稳定性保障:错误处理与日志监控

翻译服务稳定性保障&#xff1a;错误处理与日志监控 引言&#xff1a;AI 智能中英翻译服务的稳定性挑战 随着全球化进程加速&#xff0c;高质量、低延迟的机器翻译服务已成为多语言内容处理的核心基础设施。在实际部署中&#xff0c;AI 智能中英翻译服务虽然具备高精度和自然表…

作者头像 李华
网站建设 2026/2/28 8:24:34

UE5高斯泼溅插件实战:从零搭建实时渲染场景的完整指南

UE5高斯泼溅插件实战&#xff1a;从零搭建实时渲染场景的完整指南 【免费下载链接】XV3DGS-UEPlugin 项目地址: https://gitcode.com/gh_mirrors/xv/XV3DGS-UEPlugin 想要在Unreal Engine 5中实现令人惊叹的高斯泼溅模型实时渲染吗&#xff1f;XV3DGS-UEPlugin正是你需…

作者头像 李华
网站建设 2026/3/3 5:50:13

能源行业巡检:设备铭牌OCR识别辅助资产管理

能源行业巡检&#xff1a;设备铭牌OCR识别辅助资产管理 &#x1f4cc; 引言&#xff1a;OCR技术在工业资产管理中的价值跃迁 在能源行业&#xff0c;变电站、输电线路、油气管道等基础设施遍布广袤地域&#xff0c;设备数量庞大且运行环境复杂。传统巡检依赖人工记录设备铭牌信…

作者头像 李华