T-pot蜜罐系统部署实战:从零搭建到稳定运行全记录

发布时间:2026/10/19 10:21:26
T-pot蜜罐系统部署实战:从零搭建到稳定运行全记录 先说结论T-pot蜜罐系统是我这几年在安全建设和威胁观察上投入产出比最高的一套开源蜜罐集成平台但它也是我最不想再重装第二遍的东西。你搜一下T-pot满屏都是攻防地图上小红点乱闪的效果图好像装上就能躺着看攻击表演可真到自己动手从选硬件、拉镜像到调内存、配端口每一环都可能把人劝退。下面这些内容不是官方文档复读是我把自己从头部署、踩坑、调优到上线后稳定运行的全过程拆开揉碎了写给你看适合安全运维、蓝队同学也适合想搭一套自己的威胁情报探针的爱好者。1. 内容整体设计与思路拆解1.1 T-pot到底是什么一套“会演戏”的安全哑铃先说个生活化的类比。蜜罐就像你在门口故意放一个没锁的抽屉里面塞了一张写着“随便看”的假账本抽屉里装了针孔摄像头。正常人路过不会理它但手脚不干净的人一定会去翻翻的动作、翻的时间、先翻哪一层全被拍下来了。T-pot干的就是这件事只不过它把“抽屉”做成了一个规模庞大的诱饵网络而且自动帮你把“监控录像”整理成了带图表和周报的安全报告。具体来说T-pot是一个基于Docker的开源蜜罐集成平台。它不像传统蜜罐那样只模拟一种服务而是把十几种主流蜜罐全部打包到一起跑在一台宿主机的不同容器里再用ELK日志系统统一收集、清洗、展示最后用Grafana和一套攻击地图把数据可视化。我部署的版本里默认就包含了CowrieSSH和Telnet蜜罐、Dionaea针对SMB、HTTP、FTP等协议的蜜罐、Honeyd虚拟多主机蜜罐、GlastopfWeb蜜罐、Suricata流量检测这些主流组件。为什么选T-pot而不是自己一个个部署我在早期也试过单独部署一个Cowrie或Dionaea但很快就发现一个问题单一蜜罐看到的攻击面太窄而且每个蜜罐的日志格式完全不一样有JSON、有syslog、有数据库想看整体趋势还得自己写脚本去解析。T-pot把这些问题全都抹平了它自带一套日志管道所有蜜罐的数据进入同一个索引你只需要在Kibana里搜字段就行。它的本质不是“某个蜜罐”而是一个“蜜罐调度中枢数据加工厂”这个定位让它的搭建复杂度和价值同时被拉得很高。1.2 适用场景与选型理由哪些人值得趟这趟浑水T-pot最典型的应用场景是边界感知。把它部署在公网或者外网入口它模拟出来的那些服务端口比如22、23、80、443、8080就是天然的“诱饵钓点”。正常用户不会去连一个没有任何业务的SSH端口会去试的基本都是扫描器、蠕虫或者手工试探的攻击者。我觉得最有价值的使用人群有三类。第一类是蓝队和安全运维用来做攻击面观察和早期预警很多针对性扫描在真正打进来之前会先在周边地址段“踩点”蜜罐能第一时间记录下这些踩点行为。第二类是攻防演练的组织者或参赛队伍T-pot能在演练期间帮助快速识别扫描来源和常见攻击手法。第三类是安全研究者、学生用来学习攻击者的真实行为模式。这里我也做过一次对比选型结论很明确方案部署成本日志统一程度可视化能力日常维护单个开源蜜罐低低各管各的几乎没有简单自己组合全家桶高要自己粘一堆组件中需要自己写管道自己搭看板繁琐T-pot中高一次部署高默认统一强开箱即用中等需关注资源选型逻辑其实很朴素如果你只是想看某个特定协议的攻击流量单独跑一个Cowrie就够了但如果你想把蜜罐做成一个日常能看一眼、能出报告、能长期运营的安全传感器T-pot是少有的“全家桶”方案。它解决的痛点不是“某个蜜罐好不好”而是“十几种蜜罐怎么协同、数据怎么不打架、看板怎么不重造轮子”。当然这些便利都是有代价的代价就是它对硬件和部署者的耐心都有要求。2. 部署前的筹备与关键抉择2.1 硬件门槛别拿小水管硬扛T-pot的官方文档写的最低配置是4核CPU、8G内存、200GB硬盘。但请记住一句话最低配置能开机不代表能跑稳。我第一次就是信了“最低配置”拿一台只有8G内存的旧机器去装结果Docker内十几个容器一启动内存瞬间耗尽操作系统直接进入OOM状态今天挂掉Elasticsearch明天被系统杀掉Grafana攻击地图时有时无整个面板红红绿绿像圣诞节彩灯完全没法用。我后来稳定运行的实际配置是这样的6核CPU、16G内存、500GB SSD至少也要256GB、千兆网卡。硬盘这块尤其重要ELK的日志索引增长速度非常夸张尤其是网络流量大、扫描器密集的时候一天产生几GB的索引是常态。如果硬盘不够最先崩溃的不是蜜罐而是Elasticsearch的索引写入一旦索引堆积、磁盘写满整个数据链路都会堵住。还有一个多数人容易忽略的点虚拟机嵌套。如果你把T-pot跑在云服务器或VMware虚拟机上CPU的嵌套虚拟化性能损耗不算大但内存的分配要特别注意“过量分配”的问题。我在某公司的一台虚拟机上试过宿主机承诺分配16G结果同一台物理机上还跑着其他业务T-pot一上来就把内存吃光连SSH都变得卡顿。所以物理机部署永远是最稳的实在要用虚拟机也要保证宿主机资源不超卖。另外系统能用Ubuntu 22.04 LTS就不要用更老的版本T-pot的脚本和Docker Compose版本对内核有隐性要求老内核经常出现容器网络不通的毛病。2.2 系统准备与安装模式选择三种方式我全试过一遍T-pot的官方安装方式有几种直接下载ISO刻盘安装的All-in-One模式、在已有Ubuntu系统上跑Docker Compose手动部署、以及官方提供的一键安装脚本。这三种方式我全试过体验差异很大。ISO安装最省心相当于装了一个定制版操作系统开机就是T-pot全家桶适合不想折腾底层的人。但它的缺点是升级麻烦、定制性差而且如果已经有一台跑着业务的Ubuntu服务器你不想重装系统ISO方案就直接出局。手动Docker Compose部署最灵活适合已经把Ubuntu环境当作生产工具的老手。但手动部署的问题在于要手动拉取大量镜像T-pot组件多镜像总大小加起来非常可观在网络环境不理想的时候拉镜像这一步就能折磨你一下午。一键安装脚本是我最终采用的方式。官方脚本本质上还是调用Docker Compose但它会自动检查依赖、自动配置开机自启、自动生成证书、自动设置防火墙规则省去了大量容易出错的细节操作。我的建议是如果你不是有特殊安全合规要求优先用官方一键脚本。毕竟T-pot最大的坑往往不是它本身而是部署过程中那些“看起来很简单但错一处就全家起不来”的琐碎配置。2.3 网络策略危险端口怎么放、管理接口怎么护蜜罐的核心逻辑是“把诱饵暴露出去”所以网络规划比硬件还重要。你要想清楚两件事哪些端口对外开放、管理接口怎么防护。T-pot默认会为各个蜜罐分配一批监听端口常见的有22、23、80、443、8080、25、1433等这些端口分别对应SSH、Telnet、HTTP、HTTPS、代理、邮件、数据库等协议。理论上端口越齐全越像一台真实服务器诱捕效果越好。但端口一旦全开你面对的攻击流量也会成倍上涨对服务器带宽和日志存储的压力很大。我建议初期不要贪多先把22、80、443这三个最常被扫描的端口暴露出去就够用了等运行稳定、摸清数据量级之后再加其他端口。管理接口是另一个重灾区。T-pot的Web管理面板和SSH管理端口默认映射在高位端口上比如Web面板常用64294SSH排障端口是64295。很多人图方便直接把这类高位管理端口也暴露到公网这等于把蜜罐的“后台监控室”大门也打开让人参观。正确做法是管理端口只允许内网或特定管理IP访问用防火墙或云安全组做限制千万不要和蜜罐端口一样对全网开放。另外面向公网的端口映射最好通过防火墙做一层白名单把源IP为内网、云平台健康检查之类的地址挡掉减少无效日志的干扰。3. 实操过程与核心环节实现3.1 从零开搭我实际执行的部署流程我最终落地的部署过程是这样走的每一步都踩过坑我把完整流程和当时的排障思路一起写出来。首先是基础环境准备。我用的是一台Linux服务器安装好Ubuntu 22.04 LTS之后第一件事是更新系统、安装基础工具包并关闭系统自动更新。蜜罐最忌讳的就是半夜自动更新把Docker或内核升级了容器全部重启日志断档一晚上。sudo apt update sudo apt upgrade -y sudo apt install -y git curl wget net-tools sudo timedatectl set-timezone Asia/Shanghai然后是安装Docker和Docker Compose插件。虽然T-pot的一键脚本会帮你装但提前装好能减少脚本跑到一半卡住的概率。Honey pot的很多容器需要Docker的特定网络模式所以Docker版本不要太老我用的Docker Engine版本至少是24以上。sudo apt install -y docker.io docker-compose-v2 sudo systemctl enable --now docker接着就是克隆T-pot的部署仓库并执行安装脚本。我把项目放在/opt/tpot注意整个目录的权限和磁盘空间要提前确认因为后续Docker的镜像和数据都会落到这个分区下。cd /opt sudo git clone https://github.com/telekom-security/tpotce.git cd tpotce sudo ./install.sh脚本运行过程中会有几个交互式确认项比如让你选择部署类型我记得有自动部署、ISO模式、容器模式等选项选自动部署就好。这一步脚本会自动生成各蜜罐的Docker Compose配置、初始化Elasticsearch索引、配置默认账号口令。如果你选择用脚本生成的口令强烈建议第一时间改掉并且在Nginx层加一层访问认证因为T-pot的管理面板本身就是黑客眼中的高价值目标。整个脚本跑完大概需要十到二十分钟主要时间都耗在拉取Docker镜像上。脚本执行完毕后系统会提示重启。重启完成之后Docker会默认启动所有蜜罐相关容器至此基础部署算是完成但这只是“辛酸路程”的开始。3.2 T-pot部署中最容易翻车的4个环节拉取镜像超时是我遇到的第一个拦路虎。T-pot的镜像仓库在国外十几个镜像轮流拉经常拉了几个大的之后直接超时报错。我在网络条件不太理想的环境里反复重试了好几次后来把镜像源配置成国内可访问的加速地址情况才好转。提醒一句加速地址一定选正规公开的不要用不明来源的脚本安全工具被暗埋后门就是天大的讽刺。第二个让我崩溃的问题是内存不足。容器全部启动后我用了docker stats一看十几个容器安稳地吃掉了14G内存。当时的服务器只有16G内存剩余空间几乎为零系统开始疯狂使用swapCPU负载居高不下。后来我对Elasticsearch的内存做了限制默认的JVM堆太大了通过环境变量把它压到2G以内同时把Logstash的堆也调小才勉强稳住。# 在 docker-compose.yml 中给 elasticsearch 添加如下环境变量 environment: - ES_JAVA_OPTS-Xms2g -Xmx2g第三个翻车点是端口冲突。我部署的服务器上原本有一个Web服务占了80端口T-pot的Nginx容器启动失败导致Web面板直接打不开。排查了半天最后在Compose文件里把蜜罐Nginx的80端口映射改成8088才把问题解决。这里也提醒一下T-pot的蜜罐端口多数不是“想改就能随便改”因为有些攻击载荷是按端口识别协议的你如果把80改成8088就可能错过针对80的攻击流量所以事前规划端口很重要。第四个问题是文件句柄和系统内核参数。Elasticsearch启动报错信息很少见但打开日志经常会看到max virtual memory areas vm.max_map_count [65530] is too low。这是ES的典型内核参数要求直接修改系统的sysctl配置sudo sysctl -w vm.max_map_count262144 echo vm.max_map_count262144 | sudo tee -a /etc/sysctl.conf3.3 面板上线的最后三步检查部署完成不等于上线成功我每次重装之后都会按固定顺序做三件事。第一检查容器状态。用docker ps看所有容器是否都处于Up状态如果有Restarting或者Exited的容器先用docker logs 容器名看日志绝大多数问题都能在这里找到线索。第二测试蜜罐端口是否真的对外开放。我习惯用nc或telnet从外部探测几个核心端口比如22和80。如果发现端口不通先排查防火墙再排查监听地址是否绑定了0.0.0.0很多容器默认绑定了127.0.0.1这会导致外部访问不到。第三登录Web面板确认数据链路。用浏览器打开管理面板输入初始账号密码后先在Kibana里查一下是否有tpot-*的索引数据哪怕只有几条扫描记录都说明蜜罐到日志的链路是通的。如果索引完全是空的先别急着怀疑没有攻击去检查Logstash或Vector的管道是不是挂了这一步我吃过很多亏。4. 常见问题与排查技巧实录4.1 我遇到的几个“幽灵问题”及排查思路T-pot跑起来之后真正的“辛酸”才开始因为你会遇到各种运行期怪问题。我印象最深的三个写出来供你少走弯路。第一个是攻击地图不显示或者显示一段时间后彻底消失。这个问题的根源几乎都是内存。攻击地图是Grafana里的一个插件它要读取Elasticsearch里的地理IP库每当新IP进来就做一次地理位置解析非常吃内存。我一开始以为是插件坏了重装了好几次最后用free -h一看内存早就被吃光了Grafana容器一直在被杀掉重启。后来给机器加到了24G内存地图就再也没丢过。第二个是数据断流蜜罐容器明明在跑但Kibana里的数据突然不更新了。我排查后发现是磁盘满了。前面说过ELK的索引增长极快尤其是扫描器密集扫一段地址段时一天几个GB非常正常。T-pot默认没有自动清理索引的策略旧索引会把硬盘占满然后Elasticsearch会进入只读模式所有新数据全部写不进去。解决方法是配置Index Lifecycle Management定期删除30天以前的索引或者每天跑一个crontab清理旧索引。# 每天凌晨3点删除7天前的tpot索引 0 3 * * * curl -X DELETE http://localhost:9200/tpot-$(date -d -7 days %Y.%m.%d)第三个是管理面板访问越来越慢。这不是网络问题是Nginx和Kibana在长久运行后产生大量日志和缓存。你需要在T-pot里定期清理Nginx的access log并给Grafana和Kibana这两个容器设置资源上限防止它们无限制吃内存。我个人的习惯是每隔两周重启一次整套Docker服务清除那些莫名其妙的内存碎片和连接缓存。4.2 常见问题速查表按现象定位原因为了让你排查更省事我把所有高频问题整理成一张速查表这是我在反复“翻车”之后积累出来的经验值。现象常见原因处理方法Web面板打不开Nginx容器挂了或端口映射错误docker ps查看Nginx容器状态看Compose文件端口是否被占用页面能开但没有攻击数据Logstash/Vector管道中断或ES处于只读查容器日志、查磁盘剩余空间、删旧索引攻击地图是空白/花屏Grafana进程OOM或地理IP库加载失败加大内存、重启Grafana容器、检查插件版本系统负载很高但没攻击Logstash解析大量重复流量调整Logstash worker数、减少暴露端口容器反复Restarting内存不足触发OOM调整ES内存、加物理内存或加swap蜜罐端口外部不通防火墙/安全组未放行或绑定127.0.0.1检查iptables、云安全组、compose映射Elasticsearch启动失败vm.max_map_count过低执行sysctl -w vm.max_map_count262144时区差8小时宿主机时区未设置timedatectl set-timezone Asia/Shanghaiwebhook告警没收到告警配置里的URL不正确或网络不通先用curl测试webhook地址再查T-pot告警日志4.3 如何把“失败现场”变成排障经验我踩坑最深的体会是排障一定要从日志出发不要靠猜。很多时候你觉得是T-pot的配置问题结果打开docker logs一看是云平台安全组没有放行端口或者是DNS解析失败导致容器拉取镜像中断。我现在的习惯是每遇到一个异常都会按三个固定步骤走第一先看宿主机状态用df -h、free -h、uptime排除资源问题。第二再看容器状态用docker ps、docker logs找到真正报错的服务。第三最后才看配置文件。多数情况下问题在前两步就已经定位到了根本不用动配置。这套顺序看起来朴素但能避免你在错误的方向上反复折腾。另外我每解决一个“幽灵问题”都会在本地记一个排障笔记把现象、排查过程、最终根因写下来。T-pot这类多组件系统的难点在于组件联动很多问题不是单一服务出错而是A服务挤压了B服务的资源只修B是治标不治本的。比如攻击地图消失你重启了Grafana过两天它又挂最后发现是ES占用了全部内存根本原因是日志索引没有清理策略。这种“症状在A、病根在B”的问题不靠笔记复盘积累模式下次遇到还会像第一次一样手忙脚乱。5. 运行监测与后续扩展5.1 每日巡检与数据价值挖掘T-pot上线稳定之后日常运营的重点就变成了“看数据”。我每天早上到工位的第一件事不是看邮件而是快速巡检四件事内存还剩多少、磁盘是否告警、容器是否全部存活、昨天的攻击趋势有没有异常波动。用几个命令几十秒就能看完。docker ps --format table {{.Names}}\t{{.Status}} | grep -v Up df -h | grep -E sda|vda free -h curl -s http://localhost:8088/api/v1/attack/summary巡检的价值不只是“保证它没挂”更重要的是数据解读。我在运行一段时间后发现T-pot收集到的攻击流量大概分成三类第一类是全网扫描器来自各种扫描平台和僵尸网络特点是IP分散、端口固定、行为单一这类数据价值一般但能反映外部扫描热度第二类是定向探测源IP会在多个端口之间反复试探甚至尝试登录SSH、传一些奇怪的HTTP头这类数据值得仔细看很可能对应特定工具或自动化攻击框架第三类是人为手工试探频率低但行为复杂比如会先访问robots.txt再找后台路径这类数据要重点标记。看懂这三类数据的意义在于你可以根据蜜罐上出现的“先知式扫描”提前做防御。比如某天发现大量针对某个特定端口的扫描突然增多这时候就应该去检查自己真实业务里有没有对应的服务提前加固、上WAF规则或封禁异常IP段。某种程度上T-pot就是一个免费的威胁情报预警源。5.2 从“看热闹”到“防风险”告警联动和威胁情报纯看数据时间长了人会麻木所以必须把T-pot接入告警体系。我最常用的方式是Webhook推送把蜜罐上的异常事件实时转发到内部IM或工单系统。T-pot的告警规则支持自定义我按这个思路配置针对SSH爆破行为同一源IP在5分钟内出现超过10次登录尝试触发紧急告警针对漏洞利用流量在HTTP蜜罐中出现SQL注入、命令注入、路径穿越等特征触发高优先级告警针对大范围扫描同一源IP在1小时内扫描超过50个不同端口触发中优先级告警。这里必须提醒一点蜜罐告警是“参考情报”不是“直接证据”。蜜罐上的攻击行为不代表攻击者真的对你真实业务发起了攻击只能说明他在“踩点”。所以我不建议直接把蜜罐告警接入自动化封禁系统误封风险太高。更合理的联动方式是蜜罐告警触发后人工去查该源IP在真实业务防火墙和WAF里有没有对应访问记录如果有再决定是否封禁。这样既能发挥蜜罐的预警价值又不会因为“反向钓鱼”误伤正常用户。另外从合规和数据安全的角度蜜罐采集到的攻击源IP、载荷内容和会话数据都可能涉及个人信息或恶意代码样本。在把T-pot数据接入威胁情报平台或共享给第三方之前一定要做好脱敏处理去除原始报文中的敏感内容避免把自己变成“数据泄露方”。这块容易被人忽视但属于必须有的边界意识。5.3 后续怎么扩展从单点蜜罐到威胁感知网络T-pot搭好之后只满足于“有一个公网蜜罐”其实有点浪费。我用稳定之后开始逐步扩展现在跑着的这套已经是“1个中心节点3个边缘诱捕节点”的结构。这种结构的好处是攻击者的扫描往往不是单点行为而是对整个IP段做地毯式扫描。如果你只在某一个IP上部署蜜罐扫描器可能只扫到你的某个端口就走了日志价值有限。但如果你在多个不同网段、不同机房部署蜜罐就能拼凑出攻击者的完整扫描路径和战术偏好。边缘节点采集的数据统一回传到中心节点的ELK集群由中心节点统一处理告警和可视化。扩展时可以把边缘节点的日志用Logstash转发或Filebeat采集的方式汇聚到中心如果网络条件差甚至可以定时打包同步。如果对威胁研究更深入还可以在T-pot基础上叠加高交互蜜罐。T-pot默认的蜜罐大多是低交互型只模拟服务但不给攻击者真正的操作系统或命令执行环境。低交互蜜罐安全、省资源但信息量有限。高交互蜜罐则是一台真实的、有漏洞的虚拟机或容器让攻击者真正“打进去”从而观察他进入系统后的行为。这种玩法对隔离和监控要求极高需要严格的网络隔离、快照回滚和全量行为录屏适合有专门安全研究团队的组织不建议个人随意尝试。最后分享一个实际操作中的体会搭T-pot这套东西最让我难受的其实不是技术难点而是“预期管理”。网上那些漂亮的攻击地图和实时攻击视频确实让人心动但你真正部署完就会发现大部分时间它只是安静地跑着一天可能只有几十条扫描记录并不会像演示视频里那样满屏开火。千万不要因为初期数据少就反复重启、乱调配置蜜罐的诱捕效果需要时间积累也需要靠你逐步调整暴露端口和部署位置来优化。我在连续折腾了将近一周、经历了五次重装之后才真正把T-pot跑成一台可长期稳定运行的安全传感器。现在每天看一眼攻击趋势已经成了习惯它带给我的不是“发现了多少攻击”的刺激感而是那种“我知道外面正在发生什么”的踏实感。如果你也在搭建的过程中被某个镜像拉取失败、某个容器反复重启折磨得怀疑人生我想说的是别急所有坑都踩过一遍之后它就老实了。你踩过的每一个坑最后都会变成你对这套系统最透彻的理解。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询