1.前言众~所周知，在PVE中创建虚拟机可谓是一个繁琐又无聊的工作，你要安装操作系统，你要设置用户名和密码，即使你创建了一个模板，在每次新创建虚拟机时又要进入系统设置不同的hostname和IP地址等一大~堆信息，我们可以用cloud-init工具包来免去这一繁琐项目。2.操作环境虚拟化平台：Proxmox VE 9.2.2模板系统：Ubuntu 24.04 cloud-init minimal3.正式操作首先，为了方便表示，我就不用命令行创建了，第一步需要创建一个UEFI启动的无硬盘和CD驱动器的虚拟机，然后为其添加cloud-init驱动器，总线保持IDE即可，存储位置按照你要使用的存储位置而定，创建完后的效果如下图所示。注：UEFI启动非必须，需要跟随下载的不同镜像使用不同的启动方式，但无硬盘和CD驱动器是必须的。在创建完成后，上传下载到的模板镜像，通常为*.img格式，将其通过PVE网页上传到宿主机存储,我这里上传到了ISO镜像目录。然后，我们需要通过命令行将导入的镜像转化成虚拟磁盘，挂载到目标虚拟机，转到宿主机shell，执行如下命令# qm importdisk <虚拟机ID> <镜像完整path> <目标存储> ,在我的环境中命令如下，请对应替换为你的目录和位置 qm importdisk 40000 /var/lib/pve/local-btrfs/template/iso/ubuntu-24.04-server-cloudimg-amd64.img data-storage等待导入完毕后，转到虚拟机的硬件页，会出现一个新的未使用的磁盘，选中后点击编辑，弹出属性编辑页，点击新增即可。然后再调整下引导顺序，使新增的磁盘可以被引导，同时稍微对磁盘进行一些扩容，就可以直接开机！
1、前言各位好，之前买了辆长安启源A06激光Ultra版，落地15万左右，其实一直很想写一篇关于这个车的一些详细评测也好，深度体验也好，各种各样的乱七八糟的内容，这辆车目前已经开了四万多公里了，半年时间，可以说有很多能聊的部分，作为开了近八年车的老司机，也是长安的忠诚粉丝，接下来给大家逐一说一下它的优点和缺点。我会从驾驶体验、维护保养、售后维修、长时用车等方面详细说明，包括各种遇到的问题，以及对这辆车的不满。2、驾驶体验简要说明下这辆车的驾驶体验，从起步、行驶、包括智能辅助驾驶和语音交互方面说明。2.1、起步首先，这辆车有常见的三种驾驶模式，舒适、标准、以及运动，在这三种模式下，非常正常地动力会阶段性的提升，表现在地板油的启动速度上，但有一点让我非常不满的是，在舒适模式下，它的加速表现非常不平稳，在体感上来说的加速并不像一辆电车，而是感觉像运行在2000转左右起步的油车，体感有不同的加速阶段，而不是线性提升。 而如果要解决这个加速过于急的问题，我必须非常轻地踩加速踏板，轻点到它刚好能解除自动驻车的状态并再略微加速，才能获得一个相对比较“温柔”的起步体验。如果说这个问题可能是由于个人驾驶习惯导致，但同样的问题在朋友的理想I6、小米YU7、领克、丰田不知道什么纯电车型上并未出现，同样的驾驶习惯，其他品牌就是可以带来相对不错的舒适性，不会出现加速一点头，减速一点头的效果。我个人认为可能是这辆车的调教问题，踏板响应曲线之类的杂七杂八的，但作为车主来说，这个起步体验实在是难以让人相信这是一辆十几万的电车，我一直觉得这个起步体验和我之前的长安19款CS75差不多，都是起步一点头。2.2、行驶起步说完了，接下来说说正常行驶，先说行车噪音，这是在正常驾驶过程中影响体验最大的部分。2.2.1、噪音控制这辆车标配的有四门的双层夹胶玻璃，还是无框车门，正常行驶下，不开空调时静谧性可圈可点，胎噪以及风噪控制得可以说很不错，能够在高速驾驶中依旧保持车内正常轻声交谈。但！我就有个疑问了，空调风噪为什么那么大！ 在正常低速区间行驶（30-60Kmh)左右，空调风力从一档开始就清晰可闻，日常夏日驾驶保持凉爽的情况下风力必须要在三档及以上，在这个风速下，车内的空调噪音甚至可以堪比在高速路120Km/h的车外风噪。而如果开到满速八档风力，那基本可以告别车内轻声交谈了，必须要正常音量说话，而即使是日常驾驶，在夏日驾驶体验可以说非常没有体验感了。可怜的车身团队，被空调拖死了体验，拼命优化却被内鬼背刺，拖出去打一顿算了。2.2.2、辅助驾驶这又是另一项让我感觉十分好笑的地方，长安启源销售在销售话术上面模棱两可，以我所在的区域，有一家长安4S店，这家店同时经营长安、长安启源、长安深蓝三个系列的车型，我刚开始看的时候觉得深蓝L06很不错，有城区领航，但启源销售跟我讲说之后A06同样会OTA更新城区领航，后来购车后话术又变为记忆领航给我整不会了，左右脑互博了属于。本身我对128T算力做的智驾就持保留态度，并不看好一家央企能在这个算力下做出多大的成就，事实也的确如此，这辆车的智驾就是个残次品!因为启源A06迟迟未推送城区领航更新，就单说当前版本下支持的高速路以及城市高架快速路来说，现版本的智驾我认为它仍是一个残次品甚至废物，它无法给你足够的信心让你能放心使用，很多人工可以轻易处理的问题它都会胡乱操作一番后交给人工处理，自己开摆。以高速路施工路段为例，各位都知道施工路段有三角锥，反光锥等警戒标识，通常会逐渐将施工车道车辆引导到相邻其他车道，但受限于这辆车的识别距离（大约50-80m)，在接近施工路段，也就是三角锥刚开始的地方，车辆会像刚发现前方障碍一样紧急躲避，而不是提前柔和变道，表现出的具体行为就是：车辆接近施工路段→继续接近→SR发现雪糕筒→立即向右或向左变道。表现得就非常像紧急躲避，而如果恰好此时相邻车道有车，车辆会在尝试急加速抢占车道失败后紧急减速并提醒人工接管，这一点非常让我恼火。另一个场景就是高速巡航，这辆车的智驾非常热衷于躲避大车，但它在躲避完成后并不会转入原车道，而是会一直向最左侧车道避让，直到到达最左侧车道，即使你尝试保持中间车道100Km/h巡航，它仍旧会在遇见下一辆卡车或半挂车后向左变道超车并保持该车道行驶，就像一个脑瘫儿童不知道能向右变道一样。非要在100Km/h下的省电巡航中占用最左侧超车道，为此我没少被候车司机鸣笛闪灯催促。说完高快领航，再说说城市基础辅助驾驶，在当前方向及对向均有马路地标的情况下，它分不出地标的指向，但凡它看到了地标，就统统认为地标指向为当前车道行驶方向，无法分辨出是否是对向车道。而说到车道保持，在地标线清晰的情况下，它可以正常保持车道中心行驶，并加减速跟车，但非常容易受到隔壁车道的非机动车及行人影响，特别是行人，即使远隔一个车道，它也会非常凶地减速让行，完全不顾乘坐体验。同样的，在车道保持模式下，它通常可以正确识别到具有指向的红绿灯，或单红灯/绿灯的信号灯。 也能在SR渲染中正确渲染，但它不会因为识别到了红灯就在路口处停车，如果你开了车道巡航，他就会沿着这条车道一路开到黑。而在经过大型路口，或者单纯一般的路口，但凡它无法识别到仅仅十几米外的车道线，就会提示人工接管，并不会跟随前车轨迹行驶，这导致我日常最常使用车道巡航的时候，就是没有路口的国道，在其他工况下面，这个车道巡航就是残废品一个。2.2.3、语音助手说完了令人头疼的辅助驾驶，再说说语音操作，因为我是传统油车（无语音助手）直接转的电车，所以也是好好体验了一下这辆车的语音助手，总的来说，仍然是个半成品。看得出长安非常想跟随主流产品冲击一下高端，也对语音助手做了非常多的优化，接入了大模型，虽然这个大模型并不是那么的...大，但也足够一般使用，常见的链式命令如：开主驾窗户关副驾窗户开后备箱关前背箱 这种也能够正常识别执行，以及询问AI前面车是什么车这种比较...不常用的用法也可以正常工作，但相比于主流的AI（理想的理想同学，小米的小爱同学）仍有较大的差距，例如无法操控雨刮器（进入工厂模式后发现实际雨刮器在中控可调，但被隐藏了）和车玻璃清洁，以及AI响应迟缓，大模型识别率低，但车价摆在这，我不过多追求，正常开车的时候也就是点个歌开个窗户，够用，但不完美。2.2.4、驾驶员日常操作在正常开车的时候，一般有一些操作是非常常用的，远近灯光、前进后退挂挡、空调调节、舒适性调节等。先说远近灯光，不知道为什么，这辆车的近光...非常近，且左右近光照射距离并不一致，左侧相对更近，长安好像一直有这个传统，说什么防止对对向司机造成炫光，我被迫在很多场景下都切换为远光，特别是玻璃贴膜后，近光基本只能看到前方十几米到二十米的范围，很难提高车速驾驶，但这部分我没研究过国家标准，可能是国家标准导致，不做评价。再说前进后退挂挡，在常用的掉头、泊车等需要频繁打方向和切换前进后退的场景中，这辆车的刹车盘我不知道是不是有什么大病，一旦你踩着刹车打了方向，车轮似乎就会受迫转动，但又受限于刹车盘被刹车片夹住，就会出现刹车和轮子打架的情况，会连带整车发出一种撕宽胶带的那种蹦、蹦的声音，这部分可能是车子的多连杆导致，我不清楚，但非常影响体验，我一直觉得这车跟特么快散架了似的。哦对了补充说明，这辆车在刚购买的那段时间一直会有一个蜂鸣器的滴滴声，一踩刹车就有，售后告诉我属于正常现象，但试驾车无此现象，且此现象在某次OTA升级后消失。空调调节，这个倒还挺正常，通过屏幕底部的风扇图标按住左右拖动就可以调整风量大小，同样方式也可以调节温度，但舒适性调节这块儿我一直有个疑问，既然后排两边门把手上都放了四个开关加两个按钮（前两个开关为后排左右车窗，后两个开关为后排座椅角度调节和天窗遮阳板调节，两个按钮为通风和加热调节，后排两个车门一致），为什么不在主驾和副驾车门也加两个按钮，通风加热调节呢？差那三五块钱吗！每次都要语音控制或进入空调页面，进入座椅子页面，再点击主副驾通风加热开启。舒适性调节方面，我这个版本的车型有氛围灯，但这辆车的氛围灯亮度非常暗，在白天属于不可见状态，必须要在天色暗下来后才略微可见，即使亮度已经拉到了最大，同时，不知道是不是车辆通讯出问题还是如何，在特定（闪烁、呼吸等）需要灯光做开关效果的，它都会从一开始的四门+前排脚部+前排仪表台的一共八个区域的同步闪烁、同步呼吸慢慢变成各闪各的、各玩各的，就像以前的时钟慢慢都会有时差一样，以及经常出现的我明明设置了一个模式，但下次开车又变成了另一个模式或者干脆不亮。我已经不再在乎这破氛围灯是以一个什么鸟样式和颜色去亮了，甚至不在乎它亮没亮。哦对了，还有一个比较常用的雨刮，说起雨刮我就要笑死，在以前我开的车中，雨刮刮的水都会被略高于挡风玻璃的A柱边沿挡住，不会流到主驾车窗上，但这辆车不同，因为它玻璃和A柱齐平，你刚洗好的车，一旦因为停了一晚上落了点灰想开雨刮清洗一下前玻璃，那么你的天窗、主驾窗、主驾车门都会被刮下来的脏水污染，干了以后就是一道道水痕，这点都快给我气笑了。2.3、泊车除了刚才提到的车轮和刹车盘打架，这辆车也有自动泊车可用，这个功能一般情况下都表现不错，只要车位线清晰，基本都可以顺利泊入车位，但必须要求车位线清晰才可用，但凡有点模糊，或者没有车位线，你即使手动指定，它在绝大部分情况下依然会计算路径失败，除非你停到相对开阔的地方，但开阔的地方我用你停？除此之外车辆也有普通的直进直出、远程挪泊功能，直进直出相对好用，远程挪泊和自动泊车一样，必须要求场地相对开阔、车位线清晰可见。在刚买车那段时间，泊车动力是非常小的，倒车的力度小到一个几厘米的小坎都上不去，后来似乎OTA修复了这一点，不再作为问题提出。3、维护保养本身作为纯电车型，这辆车需要保养的部分本就不多，按照官方保养手册正常更换耗材即可，但实际去4S店执行保养，会被推销其他杂七杂八的服务，这属于门店自身行为，无法强行归类给品牌。保养按照正常说明书说明去4S店进行耗材更换就行。4、售后维修终于！到了我最喜欢吐槽的环节了，售后维修！在五月份车辆前方遭受摩托车撞击导致雷达、摄像头以及多数外观件损坏后，车辆进行了长达20天的维修阶段，这个时长可能是由于五一期间大量车损导致的售后资源紧张导致，对于效率高低不做评论，我们单说维修结果。在首次维修后，服务人员告知车辆已经维修完毕，同时手机也可以正常查看环车监控，表明外观件以及电子件已经维修完毕，我前往售后网点取车，本身也没什么，就是一个正常不过的维修后提车。但是！！在取车开上高速后，我照旧拨杆打开辅助驾驶，车机弹出“辅助驾驶不可用”，我就蒙了，这是没修好？随即手动开往最近高速口，用特殊方式打开车机自带诊断系统检查并打电话询问，对方也不知道什么情况，说让我次日开到店里再看看，而诊断系统给的故障码是前雷达有问题，同时，前引擎盖拍一拍开启功能也不可用。次日，在手动驾驶到售后处检查，售后人员在拆除了车前覆盖件后检查线束等配件均未发现问题，顺带一提此过程持续了大约四个小时，同时也被告知了在维修过程中车辆被撞断的最大的一个线束因为更换成本高昂进行了维修而不是更换，我对此表示emmmmm..勉强接受。在长达五个小时诊断未发现问题后，我提议查看下保险丝盒，检查下是不是保险丝有问题，然后修理工哥们(看着二十多岁）拿个工具逐个检查前机盖部分保险丝，发现是一个保险丝烧了，换了保险丝后拍一拍开启前备箱功能恢复，同时故障码变成前雷达未校准。然后校准阶段呢，这哥们又去打电话问该如何校准雷达，问了半天没搞定，说今天下班了（下午六点多了），明天再来。OK，到了第三天，我在车机自带的诊断系统里面自己完成了雷达校准后，发现智能驾驶域的很多参数丢了，填充参数需要售后人员账号，我就又开到4S店，等那哥们打电话询问，半天无果后我过去跟那哥们说我知道怎么搞，你拿诊断电脑过来，然后执行了参数填充，至此智驾恢复。你以为故事结束了吗？完全没有！在之后的驾驶中我发现，前环车摄像头因为更换过的原因，其画面完全对不上环车影响，应该是跟雷达一样完全未进行校准，而校准需要专用的校准地标垫（维修手册中提到是一个白底四角带黑块的校准布），后来我自己按照维修手册在地面划线喷漆重新校准后完成，为什么自己画？ 他售后那里没这玩意儿！甚至不知道更换后要重新进行标定。就以我这段经历而言，我体感上的本地售后，仍然是处在一个只会修油车而对新能源的各种高级特性一无所知的状态，很多情况下都是只知其然而不知其所以然，这种感觉非常难以接受，同时让我觉得这家车企很像领导给了一个命令要迈入高级新能源行列，但手底下没有经验只能东拼西凑一辆出来。5、补充说明在四万多公里的使用中，我个人最深的体验就是，这辆车非常像是一个半成品，很多地方做的很好，但总是会有边角不够完美而打破这辆车给你的完美想象，它给了足够的自由度去探索，但又在很多地方限制你的想象。我在这时间中发现了无数个小问题，没去问售后的原因是售后也给不出合理的解释，我本身也是会修车的，车辆的各种毛病我比售后可能都明白，懂的越多越觉得小问题克服一下就行，但我买车不是为了克服问题的，天天搞出一些刹车盘和轮胎打架、智驾犯脑瘫、软件体验差、奇怪的设计漏洞等。甚至于比A06低端一些的车如Q07等车型有的功能（方向盘自动回正，自定义锁车音效）等能明显提升体验的功能，在A06上全部没有，车机软件商店也都是一些杂七杂八的半成品软件，不在智驾模式下左侧的方向盘多功能按键甚至无任何作用，除了音乐以外软件无法被方向盘控制，我打心底觉得方向盘能一键对外喊话非常好用。打心底觉得长安品牌还可以，没出过什么大的幺蛾子，不像新势力车企谣言新闻满天飞，稳扎稳打也得提提速，别被时代抛下。
1、前言啊~ 久违的写备忘时刻。我什么时候才能不忘掉之前做的操作啊摔！！！最近搞了一台联想的HR650X服务器，想着作为新的计算中心跑点项目，80个框框不用浪费，话说他是真费电啊，随便带点负载就200瓦。神特么的内存什么时候价格能降下去！！现在16G 200+是什么玩意儿，这玩意儿之前就几十块来着！2、环境准备Proxmox版本：9.2.2直通显卡：GTX1050ti客户机版本：Windows 113、初始配置首先，为了能够直通设备给客户机，我们需要禁止宿主机访问该设备，以保证该设备能够完全被客户机独占，同时要在宿主系统中启用IOMMU直通，也就是所谓的硬件直通，这是一切的基础。3.1、修改IOMMU代理方式在PVE中，检查是否有IOMMU启用的方式很简单。dmesg | grep -i iommu #输出如下 root@server:~# dmesg | grep -i iommu [ 0.335107] DMAR-IR: IOAPIC id 12 under DRHD base 0xc5ffc000 IOMMU 6 #注意：下面这一行代表iommu工作在代理模式，同样可以进行直通，但性能略有影响。 [ 1.738440] iommu: Default domain type: Translated [ 1.738440] iommu: DMA domain TLB invalidation policy: lazy mode #注意：通常需要iommu=pt内核参数来使用pass-through域类型，稍后会进行修改可以看到IOMMU现在为开着的状态，但工作模式不对，为了使虚拟机不再使用我们要直通的设备，需要更改下模式。编辑/etc/default/grub文件，添加内核启动参数root@server:~# nano /etc/default/grub # If you change this file or any /etc/default/grub.d/*.cfg file, # run 'update-grub' afterwards to update /boot/grub/grub.cfg. # For full documentation of the options in these files, see: # info -f grub -n 'Simple configuration' GRUB_DEFAULT=0 GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=`( . /etc/os-release && echo ${NAME} )` GRUB_CMDLINE_LINUX_DEFAULT="quiet" GRUB_CMDLINE_LINUX=""找到GRUB_CMDLINE_LINUX_DEFAULT这一行，根据CPU类型改为以下内容#INTEL CPU GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt" #AMD CPU GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"然后更新grub并重启系统。update-grub reboot等待系统重启之后，再次查看下IOMMU的工作状态root@server:~# dmesg | grep -i -e DMAR -e IOMMU -e AMD-Vi ..... [ 1.899627] pci 0000:d7:16.0: Adding to iommu group 157 [ 1.899831] pci 0000:d7:16.4: Adding to iommu group 157 [ 1.900039] pci 0000:d7:17.0: Adding to iommu group 158 [ 2.015975] DMAR: Intel(R) Virtualization Technology for Directed I/O #代表已经启用IOMMU 3.2、禁止宿主机占用指定设备首先，编辑Linux模块文件，以解除宿主机对显卡的占用。root@server:~# nano /etc/modules # /etc/modules is obsolete and has been replaced by /etc/modules-load.d/. # Please see modules-load.d(5) and modprobe.d(5) for details. # # Updating this file still works, but it is undocumented and unsupported. # Generated by sensors-detect on Tue Jun 30 20:16:42 2026 # Chip drivers coretemp在文件末尾追加vfio vfio_iommu_type1 vfio_pci vfio_virqfd然后，需要获取被直通显卡的设备ID，执行如下命令root@server:~# lspci -nn | grep -i nvidia #输出示例 af:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] [10de:1c82] (rev a1) af:00.1 Audio device [0403]: NVIDIA Corporation GP107GL High Definition Audio Controller [10de:0fb9] (rev a1) 记录下显卡和显卡自带声卡的设备id 10de:1c82 和 10de:0fb9，然后创建一个vfio配置文件root@server:~# nano /etc/modprobe.d/vfio.conf #写入以下行使vfio接管pci对应设备 options vfio-pci ids=10de:1c82,10de:0fb9还需要屏蔽开源的 nouveau 驱动和官方的 nvidia 驱动echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf echo "blacklist nvidia_modeset" >> /etc/modprobe.d/blacklist.conf然后更新内核并重启系统update-initramfs -u -k all reboot3.2、验证隔离状态配置完成后，检查当前显卡正在使用的是哪个驱动，看下是否仍然被宿主机所使用。root@server:~# lspci -nnk | grep -A 3 -i nvidia af:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] [10de:1c82] (rev a1) Subsystem: ZOTAC International (MCO) Ltd. Device [19da:2463] Kernel driver in use: vfio-pci Kernel modules: nvidiafb, nouveau, nova_core af:00.1 Audio device [0403]: NVIDIA Corporation GP107GL High Definition Audio Controller [10de:0fb9] (rev a1) Subsystem: ZOTAC International (MCO) Ltd. Device [19da:2463] Kernel driver in use: vfio-pci Kernel modules: snd_hda_intel注意看：Kernel driver in use: vfio-pci 内核驱动已经变成了vfio，也就是说目前宿主机不再使用该设备了。这样就可以直通给虚拟机使用。
1、前言最近服务器托管费要交了，实在是交不起了，所以考虑把服务器撤回来，放到家里的机柜中。但是一般家庭网络是没有公网IP地址的，也同样不开放80、443等敏感端口，所以起了用公有云服务器内网转发的想法。考虑使用IPSec VPN建立一个隧道，让路由器连接到云服务器并开放本地局域网，这样就不必一条一条添加端口映射。写一下具体实施过程和踩到的坑留在这里。2、环境介绍操作系统：Ubuntu 22.04家庭侧路由: RuiJie EG105G-P-E对端云提供商: Aliyun3、家庭侧准备思路是使用IPSec VPN连接到公有云，然后公有云转发所有端口的流量到家庭侧并通过VPN隧道直接透传到目标局域网主机，以下是具体实现3.1、配置路由器首先需要检查下这个路由器所支持的协议，我这款路由器属于比较入门的AC一体机，也支持基础的IPSecVPN客户/服务端，首先配置一个链接，开放10.1.3.0/24网段给公有云。 对应路由器侧配置4、配置公有云在客户端配置完成后，需要根据客户端的IKE策略和协商策略配置服务器端，服务器端操作系统是Ubuntu 22.04，首先安装所需要的套件，这里使用 StrongSwan 来完成服务器建立, 首先安装对应套件sudo apt update && sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins -y由于这个路由器比较低级，不支持使用证书进行身份验证，所以我们不使用证书，转而使用预共享密钥(PSK)来进行身份认证，在StrongSwan安装完成后，编辑对应的配置 /etc/ipsec.confsudo nano /etc/ipsec.conf 配置文件内容config setup uniqueids=no # 允许多个客户端使用相同 ID 同时连接 conn %default # 指定默认配置参数,会被所有后续配置继承 ikelifetime=86400s keylife=3600s rekeymargin=3m keyingtries=1 keyexchange=ikev2 # 根据路由器配置，使用IKEv2协议。 authby=psk # 根据路由器配置，使用预共享密钥(psk) dpddelay=30s # 心跳30秒 dpdtimeout=150s dpdaction=restart conn tlsyserver # 服务器端配置,对应路由器配置项目 left=%defaultroute # 服务器本地网络,使用本地网卡IP地址 leftid=@vpnserver # 服务器本地身份标识 leftsubnet=0.0.0.0/0 # 服务器本地声明子网 right=%any # 对端IP地址(使用%any以允许任意IP地址链接) rightid=@tlsyserver # 对端身份标识 rightsubnet=10.1.3.0/24,10.1.2.0/24 # 对端远程子网 ike=3des-sha1-modp1024 #第一阶段IKE算法 esp=aes128-sha1 #第二阶段ESP算法 pfs=no #不启用完美前向加密 auto=add #启动时加载配置，等待客户端链接然后，写入客户端使用的预共享密钥到/etc/ipsec.secretnano /etc/ipsec.secret @clientid : PSK "pskpasswordhere"配置完成后，重启IPsec服务端ipsec restart等待客户端链接，然后使用ipsec status查看隧道建立状态，如果长时间仍未有任何客户端链接，可以使用journalctl -u strongswan-starter -f来跟踪查看链接日志，或在配置文件中启用charondebug="all"来显示更详细的日志。链接建立后的大概输出如下:root@vpn-hub:~# ipsec status Security Associations (2 up, 0 connecting): tlsyserver[7]: ESTABLISHED 7 hours ago, 172.18.0.24[vpnserver]...61.xx.xx.xx[tlsyserver] tlsyserver{61}: INSTALLED, TUNNEL, reqid 2, ESP in UDP SPIs: c827603a_i c28697cd_o tlsyserver{61}: 10.1.1.0/24 172.18.0.0/18 === 10.1.2.0/24 10.1.3.0/24 lj[4]: ESTABLISHED 7 hours ago, 172.18.0.24[vpnserver]...61.xx.xx.xx[lj] lj{62}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c0cb8666_i c6dcece8_o lj{62}: 10.1.2.0/24 === 10.1.1.0/24此时，链接隧道就被建立，可以尝试ping以下对端网络中的设备看是否能够成功链接root@vpn-hub:~# ping 10.1.3.1 PING 10.1.3.1 (10.1.3.1) 56(84) bytes of data. 64 bytes from 10.1.3.1: icmp_seq=1 ttl=64 time=44.0 ms 64 bytes from 10.1.3.1: icmp_seq=2 ttl=64 time=43.8 ms 64 bytes from 10.1.3.1: icmp_seq=3 ttl=64 time=43.9 ms 64 bytes from 10.1.3.1: icmp_seq=4 ttl=64 time=43.9 ms5、配置流量转发在链接建立成功以后，我们需要将所有访问到该服务器的流量转发到家庭侧主机，通常流量转发我会选最简单的iptables进行转发，最简单也最快捷。5.1、避让ssh端口为了给家庭侧主机让出22端口，需要更改公有云端口到一个不会使用的端口号中，修改/etc/ssh/sshd_config文件。nano /etc/ssh/sshd_config Include /etc/ssh/sshd_config.d/*.conf #在此处取消注释并修改端口 Port 6000 systemctl restart sshd等待ssh服务重新启动，使用新的端口连接到主机，执行下一步操作5.2、全端口流量转发由于我不想为将来的每个端口都配置一条端口转发命令，所以在完成了对ssh端口的避让之后，就可以开始配置iptables的流量转发操作。首先，为了能够让iptables进行流量转发，需要开启Linux的内核转发功能。sysctl -w net.ipv4.ip_forward=1 # 永久生效（可选）： echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf然后，为了避免全端口转发导致云主机ssh和ipsec服务被中断，需要排除掉以下端口和协议网络栈端口用途TCP6000SSH服务(端口更改后)UDP500密钥协商UDP4500NAT穿越/移动端链接GRE-非NAT加密传输ESP-路由转发之后，假设我们要转发到的家庭测目标主机IP地址为10.1.3.3/24，那么就可以使用iptables对任意来源的流量执行DNAT转发，以下是对应的命令：# 转发 TCP 流量（排除 6000 端口） iptables -t nat -A PREROUTING -p tcp ! --dport 6000 -j DNAT --to-destination 10.1.3.3 # 转发所有 UDP 流量，排除 6000、500、4500 端口 (IPSec 常用端口) iptables -t nat -A PREROUTING -p udp -m multiport ! --dports 6000,500,4500 -j DNAT --to-destination 10.1.3.3 # 处理回程路由包以正确回程转发 iptables -t nat -A POSTROUTING -d 10.1.3.3 -j MASQUERADE # 可选: 如果遇到SSH经常断开，图片加载慢，可以使用MSS钳制，限制最大传输包。 # iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # 保存iptables规则 apt update && sudo apt install iptables-persistent -y netfilter-persistent save完成后，我们就可以通过访问云主机的任意端口并成功连接到家庭侧端口啦！备注：本文方案为了兼容老款路由器（Ruijie EG105G-P-E），使用了 3des-sha1 这种较老算法。在 2026 年的今天，这种组合的安全性已降至临界点。如果你的设备支持，建议优先切换到 aes256-gcm 或 chacha20poly1305，以获得更高的传输性能和安全性。参考：strongSwan 文档中心Linux防火墙文档
哦吼吼~ 这个网站已经正式支持IPV6了！（嘛没什么可以写的就这样吧）
前言在之前的工作中，我尝试使用了Pxe网启方式进入PE，然后完成全自动化的操作系统的安装及访问共享等操作，现在把实现思路记下来，以备不时之需。环境介绍服务器操作系统: Ubuntu 22.04 LTSC所需软件包: isc-kea-dhcp4-server ntp tftpd-hpa nginx samba iPXE另外需要两个虚拟机，启动方式分别为 pcbios 和 uefi，用以模拟和测试绝大部分电脑的启动方式 查看软件详细说明isc-kea-dhcp4-server 用于dhcp下发ip地址，告知客户端从哪一台服务器上启动，并通过客户端的RFC标识符(RFC4578)决定给客户端下发什么文件，进行什么样的操作。ntp 用于同步各客户端的时间,在下发ip地址时会告知局域网内存在NTP服务器，同步所有客户端时间至与服务器相同，方便各客户端进行时间调整。tftpd-hpa 用于客户端通过tftp协议下载启动文件，但因tftp速度较慢(即使在局域网环境下)，不适合下发大型镜像，在本案例中仅用于下发iPXE启动固件及选项菜单，不再持有其他镜像文件nginx 用于客户端通过http下载一些资源，在本案例中主要为图片及其他菜单等，同样可用来下发一些中小型镜像及展示服务器主页，不再过多介绍。samba 用于在不同客户端内共享资料，也用于中心化分发软件包和更新项目，用于客户端更新自身资料等。iPXE 主要用于支持一些老电脑原生不支持的高级功能，iPXE会在启动的第一时间被加载，然后读取服务器上的菜单或高级选项等，做进一步的分流/调整，也可以导入部分文件到系统内部等。1.在此之前本文章假定你清楚UEFI以及BIOS的区别，以及网络启动的基本概念，如果你不清楚，请先阅读这一部分，以完全了解两者有何不同，方便更清楚地了解我们在做什么。1.1 UEFI引导和BIOS引导我想你可能知道BIOS是什么，不就是基本输入输出操作系统嘛(Basic Input Output System)，但我们这里讲到的 BIOS 不同于你所理解的，这里的BIOS是指硬件系统的引导方式或类型，它使用经典的BIOS底层执行引导，通常伴随黑色背景的引导屏幕，以及不断闪烁的字符，操作系统以这种方式引导时速度较慢，且它不支持一些较为现代化的硬盘分区格式。那么，UEFI是什么？你可能会问， UEFI是一个相对现代化的系统引导解决方案，在一些较新或最新的主板中，你进入“BIOS”，会看到一个相对华丽的图形UI而不是文字界面，那也是UEFI的一部分，UEFI允许使用新的功能和特性，它更安全也更现代化。通常，在主板的启动设置页面内，BIOS引导方式会作为兼容性选项提供，名称条目一般均包含CSM(Compatibility Support Module 兼容性支持模块)，启用它才可以让主板使用BIOS引导方式，我们不推荐使用这种引导方式，在本文章中同样作为“兼容性选项”进行配置，用于兼容较老的硬件。2.准备软件包本来我是想从操作系统安装开始写，不过相信大家都会，就跳过这一步，首先准备工具链，进行所需软件包的安装2.1.iPXE默认情况下，由于客户端平台的不统一性，不同的主板对于网络启动的支持不尽相同，所以我们需要给各个需要启动的客户端设置一个“起跑线”，以让接下来的步骤能够成功完成，要做到这点，我们就要用到一个对各个平台兼容最强也是网络启动元老级别的固件程序，iPXE，它可以兼容几乎所有市面上的主板，完美实现我们所需要的一个标准起跑线。标准情况下，官方提供了一个官方发布版的iPXE固件程序，可用于UEFI和BIOS引导，名称分别为:ipxe.efi和 undionly.kpxe，但如果你在本实例中使用了官方发布的版本，你可能会陷入无尽的启动死循环中，例如下图以及这个文档所示为了解除这个死循环，我们可以通过两种不同的方式。自行编译iPXE固件通过DHCP服务器识别判断在我的测试中，通过DHCP服务器识别判断会偶尔出现不准确或者配置文件压根就没用的情况，所以我选择自行编译一份新的iPXE固件，使其无论是什么情况下均跳转到指定的入口，而不是自动从服务器上拉取，避免出现死循环。编译iPXE固件编译这个固件的方式相对来说很简单，根据官方文档所示，我们只需要做到以下几点克隆官方仓库修改编译选项执行编译很简单，接下来一步步进行，首先执行以下命令，克隆官方仓库。#如果你没有安装git客户端 sudo apt install git g++ gcc nano #克隆官方仓库 git clone https://github.com/ipxe/ipxe.git然后，创建一份自定义的配置文件，用于编译出我们自己的一个版本。#进入工作区 cd ipxe/src #编辑自定义配置文件 nano demo.ipxe接下来，将配置文件修改成大概下面的样子，#ipxe编译选项 #!ipxe #dhcp拉取地址 dhcp #从tftp服务器链式启动nextboot文件 chain nextboot最后，执行编译，打包出分别应用于UEFI和BIOS的固件包。#编译BIOS固件 make bin/undionly.kpxe EMBED=demo.ipxe #编译UEFI固件 make bin/ipxe.efi EMBED=demo.ipxeOK，如果一切顺利的话，我们就会在bin目录下得到undionly.kpxe文件和ipxe.efi文件，保留好它们，待会儿用。2.2.tftpd-hpa如上所说，tftp服务器用于下发启动时的各种文件，上一步编译得到的文件同样需要在这里用到，先安装它#安装tftp sudo apt install tftpd-hpa然后，修改下它的默认配置和文件存储目录，在这个文档中，我们假定tftp存储目录为 /mnt/boot/tftp，配置文件默认在/etc/default/tftpd-hpa，可参考的文档：WIKI#TFTP用户名,可以不用修改 TFTP_USERNAME="tftp" #TFTP存储目录 TFTP_DIRECTORY="/mnt/boot/tftp/" #TFTP监听端口号 TFTP_ADDRESS=":69" #附加选项 TFTP_OPTIONS="--secure"然后，重载服务，并设置为开机启动sudo systemctl restart tftpd-hpa sudo systemctl enable tftpd-hpa2.3.ntpNTP提供了局域网内的时间同步服务，它并不重要，但很方便，我们不需要对它做过多的配置，简单安装即可。sudo apt install ntp它的配置文件路径是/etc/ntp.conf，我们不需要做什么修改，安装好了就行。2.4.isc-kea-dhcp4-server终于到了重头戏，dhcp服务器提供了一切功能的基础，它负责下发IP地址给接口下的所有客户端，也负责决定客户端会以什么固件启动，在之前，我会选用isc-dhcp-server，但它现在已经停止开发，isc团队给了一个新的选择，isc-kea-dhcp4-sever，用于更好地管理和控制。首先，Ubuntu的默认软件安装源并不包括isc-kea-dhcp4-server这个软件包，我们需要使用到官方发布源，来自于cloud smithm，以下是安装脚本。curl -1sLf 'https://dl.cloudsmith.io/public/isc/kea-2-6/setup.deb.sh' | sudo -E bash在之后，我们就可以执行安装isc-kea-dhcp4-server，由于我们不需要任何其他的功能以及IPV6的支持，所以在这里就不安装团队提供的其他附加安装包，仅使用ipv4的dhcp服务器即可。它的配置文件默认路径为/etc/kea/kea-dhcp4.confsudo apt install isc-kea-dhcp4-server根据官方文档，它同样支持各种配置和骚操作，但默认配置文件有很多无用配置项，我们删除它，并重新创建一份配置文件。sudo rm -rf /etc/kea/kea-dhcp4.conf sudo nano /etc/kea/kea-dhcp4.conf配置文件主要是JSON格式，但支持注释，以下是我们需要填写的字段，以及字段的相应解释，你同样可以复制一份直接使用，同样，你也可以参考官方文档# 配置开始 { # DHCPv4配置开始 "Dhcp4": { #客户端类型定义,如果客户端符合任意成员test字段内条件,则下发该成员内的所有键值,对于默认定义的重复键值,以该成员内的为准 "client-classes":[{ #名称 "name":"ipxe_x64", #条件 "test":"option[93].hex == 0x0000", #启动服务器地址 "next-server": "10.1.0.1", #启动服务器主机名 "server-hostname":"bootserver.cn", #启动文件 "boot-file-name":"undionly.kpxe" }], #接口设置 "interfaces-config": { #要监听的网络接口 "interfaces": [ "ens37" ], #DHCP数据包类型 "dhcp-socket-type": "raw" }, #有效时间 "valid-lifetime": 4000, #更新时间 "renew-timer": 1000, #重绑定时间 "rebind-timer": 2000, #子网配置信息 "subnet4": [{ #启动服务器IP地址 "next-server":"10.1.0.1", #启动文件 "boot-file-name":"ipxe.efi", #地址池 "pools": [ { #地址池 "pool": "10.1.0.2-10.1.254.254", #额外选项 "option-data": [ #DNS服务器 {"name":"domain-name-servers","data":"10.1.0.1"}, #名称服务器 {"name":"name-servers","data":"10.1.0.1"}, #NTP时间服务器 {"name":"time-servers","data":"10.1.0.1"}, #默认网关 {"name":"routers","data":"10.1.0.1"} ] } ], #子网 "subnet": "10.1.0.0/16", #子网编号 "id": 1 }], #日志配置 "loggers": [{ #配置名称 "name": "*", #日志等级 "severity": "INFO" }] } # 配置结束 }配置项中的具体项目，请参考以下文档https://kea.readthedocs.io/en/kea-2.6.0/arm/dhcp4-srv.html#interface-configurationhttps://kea.readthedocs.io/en/kea-2.6.0/arm/dhcp4-srv.html#setting-fixed-fields-in-classificationhttps://kea.readthedocs.io/en/kea-2.6.0/arm/dhcp4-srv.html#standard-dhcpv4-optionshttps://tools.ietf.org/html/rfc4578#section-2.1在之后，我们需要给配置文件中所指定的网卡一个IP地址，作为基准网关地址，在以上配置文件中，地址为10.1.0.1，另外，记得将该地址排除在地址池之外，以免分配冲突，Ubuntu中使用netplan作为网卡配置工具，配置文件为/etc/netplan/00-installer-config.yaml(默认情况下)，修改网卡对应的IP地址，在这个配置文件中是 ens37，network: ethernets: ens37: dhcp4: false addresses: ['10.1.0.1/16'] version: 2配置完成后，应用到网卡#应用配置 sudo netplan apply #查看网卡状态 ip addr #ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 # link/ether 00:0c:29:01:5a:68 brd ff:ff:ff:ff:ff:ff # altname enp2s5 # inet 10.1.0.1/16 brd 10.1.255.255 scope global ens37 # valid_lft forever preferred_lft forever # inet6 fe80::20c:29ff:fe01:5a68/64 scope link # valid_lft forever preferred_lft forever然后重启对应服务，使配置文件生效#重启服务 sudo systemctl restart isc-kea-dhcp4-server #检查服务状态 sudo systemctl status isc-kea-dhcp4-server #● isc-kea-dhcp4-server.service - Kea DHCPv4 Service # Loaded: loaded (/lib/systemd/system/isc-kea-dhcp4-server.service; enabled; vendor preset: enabled) # Active: active (running) since Thu 2024-05-30 06:18:49 CST; 13min ago # Docs: man:kea-dhcp4(8) # Main PID: 54910 (kea-dhcp4) # Tasks: 13 (limit: 4515) # Memory: 3.3M # CPU: 49ms # CGroup: /system.slice/isc-kea-dhcp4-server.service # └─54910 /usr/sbin/kea-dhcp4 -c /etc/kea/kea-dhcp4.conf最难的部分已经完成了，接下来继续我们的操作3.文件环境部署还记得我们在第二部分第一小节编译的两个iPXE文件以及TFTP文件存储路径吗？将两个iPXE文件放到TFTP的存储路径下，同时，在TFTP存储目录下新建一个文件，名称为nextboot，名称与你在编译部分的demo.ipxe文件中chain后面的名称相同，用于iPXE固件加载这个文件。#创建nextboot文件 touch /mnt/boot/tftp/nextboot在完成创建后，我们需要修改它，让其显示一个基本菜单，用于测试BIOS及UEFI启动是否正常。 展开配置文件内容#!ipxe #============== Set Variables =============== #设置默认时间 set menu-timeout 16000 #判断启动平台的方式，设定默认启动项 iseq ${platform} efi && set menu-default win64 || set menu-default win32 #将http用xieyi代替 set xieyi:string http #测试是否存在ip，否则dhcp自动获取 isset ${ip} || dhcp #测试是否存在dhcp服务器，否则指定next-server为192.168.0.101 isset ${next-server} || set next-server 192.168.0.101 #============== Set Menu =============== #菜单开始标记 :start #显示menu标题，并显示平台和ip地址 menu iPXE Boot Menu --${platform}--${ip} #列项，可以指定热键，别名，添加--gap --分割线 item --gap -- -------------------------------- WINPE TOOL --------------------------- item win32 Windows10PE x32 item win64 Windows10PE x64 item --gap -- ----------------------------------- TOOL ------------------------------ item maxdos MaxDOS 9.1 item --gap -- -------------------------------- Advanced ----------------------------- item --key h local [H]Boot from local drive item --key s shell [S] Drop to iPXE Shell item --key r reboot [R] Reboot the Computer item --key x exit [X] Exit iPXE and Continue BIOS Booting item --key c config [C]Configure settings item --key m msboot [M]Enter Windows Boot Manager Menu （BIOS) #在默认时间到时选择默认启动项 choose --timeout ${menu-timeout} --default ${menu-default} selected goto ${selected} #============ Main Menu Options ============= #启动32位PE，将PE32.wim赋值给pefile，并跳转至bootpe :win32 set pefile PE32.wim goto bootpe #启动64位PE，将PE64.wim赋值给pefile，并跳转至bootpe :win64 set pefile PE64.wim goto bootpe #PE镜像启动代码块============================== :bootpe kernel ${xieyi}://${next-server}/boot/wimboot gui || goto retry initrd ${xieyi}://${next-server}/pxeautorun.txt ${next-server}.cmd || goto nextg :nextg initrd ${xieyi}://${next-server}/boot/boot.sdi boot.sdi || goto retry iseq ${platform} pcbios || goto winefi initrd ${xieyi}://${next-server}/bootmgr.exe bootmgr.exe || goto retry initrd ${xieyi}://${next-server}/boot/bxe bxd || goto retry initrd ${xieyi}://${next-server}/boot/${pefile} boot.WIM || goto retry boot || goto retry goto start :retry imgfree prompt Error! press any key to retry goto start #PE镜像启动代码块============================== #启动MaxDOS镜像 :maxdos kernel ${boot-url}/memdisk initrd ${boot-url}/MAXDOS9.img boot #从本地硬盘启动 :local sanboot --no-describe --drive 0x80 #打开命令行 :shell echo Type 'exit' to go back to the menu. shell goto start #重启 :reboot reboot #退出 :exit exit #配置 :config config goto start #更换启动文件 :msboot chain tftp://${next-server}/pxelinux.0 goto start然后保存它，开启一个虚拟机测试是否正常。
问题介绍某个客户要求我上门维修Mssql 数据库置疑，原因是意外的断电导致软件无法正常使用，遂上门查看，发现数据库是上古时代的宝贝，2000版本的MSSQL。这个版本没有过多的文档，有的只是含糊其辞的一段命令，大多数文章的介绍都是在教如何通过 alter database dbName set之类的命令来进入紧急和单用户模式，然后使用dbcc checkdb ('dbName',repair_allow_data_loss) 这样的命令去修复。实际测试按照网站介绍，执行dbcc checkdb之后，数据库仍然是不可用状态，这段内容明天再写我困了修复方法分析我遇到的情况，可能是意外断电导致事务日志没有正确保存，那么只要关闭所有链接，重生成一个事务日志文件就好了，命令如下，注意：在执行命令过程中不要使用Mssql的企业管理器工具。建议执行前重启数据库所在服务器，且在执行前一定事先备份。update sysdatabases set status = -32768 where name = 'dbName' --将数据库置为紧急模式 go alter database dbName set SINGLE_USER --将数据库置为单用户模式 go alter database dbName set online --把数据库拉上线 go dbcc rebuild_log ('dbName','C:\Path\to\logfile.LDF') --重新在指定位置创建事务日志文件，以恢复数据库的可用性 go update sysdatabases set status = 0 where name = 'dbName' --恢复数据库状态 go alter database dbName set MULTI_USER --恢复为多用户模式 go之后便可以正常使用数据库，顺便吐槽那个六条命令开价三百块的所谓数据库维修奸商！
前言因为项目原因，想自建一个内网DNS服务器/公网DNS服务器用于自己用以及项目上能够节省宝贵的外网带宽（哪怕只有一点点）,所以想着自己建立一个DNS服务器来保证稳定性以及实现自定义域名的指向(方便使用域名来指向内网服务器)环境OS：Ubuntu 20.04ENV: Dokcer 24.0.7APP: DNS Server开始部署下载指定的Docker镜像,并根据官方docker file进行配置docker pull technitium/dns-server我不需要用到一些高级特性，例如DNS over http 等，所以仅开放两个端口,使用本地目录而不是docker 卷来进行文件存储。注意:端口53要同时开放 TCP 及 UDP 访问。5380 用于网页面板53 用于DNS服务运行docker镜像，开启服务:sudo docker run -d \ -e DNS_SERVER_DOMAIN=dns.olderfox.com \ -p 5380:5380 \ -p 53:53 \ -p 53:53/udp \ -v /mnt/data/dockers/dnsServer:/etc/dns \ --name DnsServer \ --restart always \ technitium/dns-server视情况不同，你可能会在较新的Ubuntu实例中遇到以下问题：$ sudo docker run -d -e DNS_SERVER_DOMAIN=dns.olderfox.com -p 5380:5380 -p 53:53 -p 53:53/udp -v /mnt/data/dockers/dnsServer:/etc/dns --name DnsServer --restart always technitium/dns-server #fc43291bedcf7e7547bff62338256e4203acb265feb41dacbdd116bb11ecd624 #docker: Error response from daemon: driver failed programming external connectivity on endpoint DnsServer (e7694233517f9e164df3924c5e1096826120d4828507e93ac0c38fbd12080e8b): Error starting userland proxy: listen tcp4 0.0.0.0:53: bind: address already in use.Ubuntu 会告诉你端口已经被占用，但作为公共DNS我们又不能重新指定端口，如果你需要解决此问题，请展开以下部分，如果并没有遇到，请跟随往下 可选步骤:关闭Ubuntu systemd 自带的DNS服务首先停用systemd-resolved, 并取消开机自动启动,接下来修改NetworkManager配置，让它能自动获取dns#禁用开机启动 sudo systemctl disable systemd-resolved.service #关闭服务 sudo systemctl stop systemd-resolved #删除`/etc/resolve.conf对应的软连接` sudo rm -rf /etc/resolv.conf #重新创建新的软连接 sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf之后，修改 /etc/resolv.conf将dns暂改为公共dns服务器以恢复域名解析就可以了。sudo nano /etc/resolv.conf启动docker镜像，此时端口5380所对应的网页面板已经可以访问，若有需要，可以创建对应的反向代理注意:反向代理前建议指定docker容器监听IP为127.0.0.1来避免不可预知的反代绕过初次登录需要创建Administrator的密码。更改完毕后便可以查看一些图表数据，以及创建各种域名解析。记得设置上游DNS服务器，以及允许访问到上游DNS至此：安装完成，更多配置项及详细文档，请参考:官方文档
前言之前接了个单子做一个机房项目，遂大概了解了一下市面上的机房、设备管理程序，思来想去最终选择了NetMap这玩意儿，好用，且功能不算冗杂和沉重，而由于自定义化的安装较为复杂，在此记录以备后查。安装环境介绍使用Ubuntu 22.04 Server(Minimal) 进行安装使用Python 3.9使用PostgreSQL 14.10使用Redis 5不使用Docker以方便后续的代码修改。安装和配置 PostgreSQL 数据库安装为了可扩展性和数据的可迁移性，在这里使用apt安装postgreSQL后重新定义数据存储目录，首先通过apt安装sudo apt update sudo apt install postgresql -y在继续之前，检查自动安装的版本，NetBox需要PostgreSQL 12 或更新:psql -V # psql (PostgreSQL) 14.10 (Ubuntu 14.10-0ubuntu0.22.04.1) 可选步骤:迁移数据库存储目录首先关闭数据库服务sudo systemctl stop postgresql在当前版本，数据库配置文件存放在/etc/postgresql/14/main/postgresql.confsudo apt install nano -y sudo nano /etc/postgresql/14/main/postgresql.conf修改以下键值:data_directory = '/mnt/data/database/postgresql/main' #更改到你要存储的目标位置根据第三方文档的说法，pgsql默认情况下的性能不算特别好,netbox页面展开会卡顿，需要根据自己的设备的配置和情况对配置文件做出最优修改，修改方式参考这里之后将更改配置文件前的数据库迁移回来重要: 不迁移回来会导致pgsql无法启动,但service仍旧正常重启,原因目前未深究sudo cp -r /var/lib/postgresql/14/ /mnt/data/database/postgresql/重新启动pgsqlsudo systemctl restart postgresql sudo pg_isready #/var/run/postgresql:5432 - accepting connections创建数据库创建netbox所需要的数据库，并设置密码和权限sudo -u postgres psql在输入这个命令之后，键入以下命令行执行数据库创建和权限管理，注意每行有一个;符号结尾。CREATE DATABASE netbox; CREATE USER netbox WITH PASSWORD '你要设置的密码'; ALTER DATABASE netbox OWNER TO netbox; #下面两行命令是 PostgreSQL 15 或更新的版本需要输入的 \connect netbox; GRANT CREATE ON SCHEMA public TO netbox;在输入完成后，按 \q 并回车退出数据库命令终端，并使用以下命令测试账户可用性psql --username netbox --password --host localhost netbox #Password: #psql (14.10 (Ubuntu 14.10-0ubuntu0.22.04.1)) #SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) #Type "help" for help. netbox=> \conninfo #You are connected to database "netbox" as user "netbox" on host "localhost" (address "127.0.0.1") at port "5432". #SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) netbox=> \qRedis安装Redis是一个高性能的K-V数据库，通常用于高速缓存，在Ubuntu上的安装也非常简单sudo apt install -y redis-server测试查看Redis版本redis-server -v #Redis server v=6.0.16 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=a3fdef44459b3ad6正常情况下，你可以通过/etc/redis/redis.conf或者/etc/redis.conf去修改Redis的更多配置，不过通常情况下以及在本实例测试中不修改就可以，所以此处省略，深入配置可以参考：这里NetBox安装终于来到高难度的部分，Netbox编写语言是Python，所以要求 Python 3.8, 3.9, 3.10 或 3.11，首先安装Python安装Pythonsudo apt install -y python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev在继续之前，检查下Python所安装的版本是否正确python3 -V #Python 3.10.12下载NetBox下载有两种方式可选，一种是官方发布的Release包，一种是直接下载官方仓库，两种区别不大，这里直接下载官方仓库sudo mkdir -p /opt/netbox/ cd /opt/netbox/如果你的系统上没有安装Git，那么首先先安装下sudo apt install -y git克隆官方仓库到/opt/netbox/sudo git clone -b master --depth 1 https://github.com/netbox-community/netbox.git .创建NetBox系统账户由于NetBox有一部分功能依赖操作系统，所以需要创建几个系统账户sudo adduser --system --group netbox sudo chown --recursive netbox /opt/netbox/netbox/media/ sudo chown --recursive netbox /opt/netbox/netbox/reports/ sudo chown --recursive netbox /opt/netbox/netbox/scripts/更改NetBox配置文件cd /opt/netbox/netbox/netbox/ sudo cp configuration_example.py configuration.py sudo nano /opt/netbox/netbox/netbox/configuration.pyNetBox配置文件详细解释参考这里，但对于全新安装，需要调整的配置只有以下几项ALLOWED_HOSTSDATABASEREDISSECRET_KEY 可选步骤:本地化和时区在更改配置文件时，可以更改以下键值以实现些许本地化，具体来讲就是少部分配置和菜单可以以中文显示(B用没有)ENABLE_LOCALIZATION = True # 开启本地化，让一些选项中文。 TIME_ZONE = 'Asia/Shanghai' # 配置时区 PAGINATE_COUNT = 60 # 配置查看的时候默认分页数量ALLOWED_HOSTS该项目控制可以访问该NetBox主机的列表，必须至少指定一个，但注意这并不会限制访问NetBox主机的位置，它只是简单检查http标头。ALLOWED_HOSTS = ['netbox.example.com', '192.0.2.123']如果你不确定该设置成什么，那么也可以简单设置一个通配符号*以允许任何来源标头ALLOWED_HOSTS = ['*']DATABASE该项目定义Pgsql的基本信息，NetBox需要这些信息才能够连接到数据库并保存信息，如果你的pgsql实例运行在另一个主机，记得相应改动对应的值DATABASE = { 'NAME': 'netbox', # 数据库名称,在本文默认 netbox 'USER': 'netbox', # 数据库用户名,在本文默认 netbox 'PASSWORD': 'J5brHrAXFLQSif0K', # 你设置的数据库密码 'HOST': 'localhost', # 数据库主机地址 'PORT': '', # 数据库主机端口(可选,留空使用默认端口) 'CONN_MAX_AGE': 300, # 最大连接存活时间(秒) }REDISRedis在本项目中用来做高速缓存，它本身并不需要多少配置，下面的值应该足以满足大多数安装的需要，如果你有高级配置需求，请参阅：NetBoxRedis配置说明REDIS = { 'tasks': { 'HOST': 'localhost', # Redis 服务器 'PORT': 6379, # Redis 端口 'PASSWORD': '', # Redis 密码(可选) 'DATABASE': 0, # 数据库ID，Redis一共16个编号可选 'SSL': False, # 启用SSL (可选) }, 'caching': { 'HOST': 'localhost', 'PORT': 6379, 'PASSWORD': '', 'DATABASE': 1, # 唯一编号，不能与上一个编号重复 'SSL': False, } }SECRET_KEY这是一个伪随机字符串，用于帮助加密密码和cookie。此处定义的密钥不应在配置文件之外共享。SECRET_KEY可以随时更改，而不影响存储的数据，但请注意，这样做将使所有已经登录的用户退出登录状态,SECRET_KEY 长度必须至少 50 个字符，并且应包含字母、数字和符号的组合，如果你不知道写什么合适，也可以用netbox的官方脚本生成一个cd /opt/netbox/netbox/netbox/ sudo -u netbox python3 ../generate_secret_key.py开始NetBox安装配置 NetBox 后，我们就可以开始实际安装了。运行打包的升级脚本 ( upgrade.sh) 来执行以下操作：创建Python虚拟环境安装所有必需的 Python 包运行数据库架构迁移在本地构建资料（供离线使用）聚合磁盘上的静态资源文件sudo -u netbox pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple #配置安装时使用清华源进行安装以提升速度(可选) sudo -u netbox /opt/netbox/upgrade.sh #执行安装(耗时约3-6分钟,取决于网络速度) #出现以下字符标志着安装完成 #Completed. #Removing expired user sessions (python3 netbox/manage.py clearsessions)... #Clearing the cache (python3 netbox/manage.py clearcache)... #Cache has been cleared. #Upgrade complete! Don't forget to restart the NetBox services: # > sudo systemctl restart netbox netbox-rq创建管理员账号# 进入虚拟环境 source /opt/netbox/venv/bin/activate #访问脚本文件 cd /opt/netbox/netbox python3 manage.py createsuperuser # 创建管理员 olderfox，输入邮箱和两遍密码，密码不显示 #Username (leave blank to use 'root'): olderfox #Email address: me@olderfox.com #Password: #Password (again): #Superuser created successfully.创建定时任务，有关定时任务的更多信息，请参考这里sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping启动Gunicorn HTTP服务器sudo -u netbox cp /opt/netbox/contrib/gunicorn.py /opt/netbox/gunicorn.py # 复制创建配置文件 sudo -u netbox vim /opt/netbox/gunicorn.py # 可修改配置文件，更改监听端口，默认8001 sudo cp -v /opt/netbox/contrib/*.service /etc/systemd/system/ # 复制到系统服务 sudo systemctl daemon-reload # 重新加载系统服务 sudo systemctl enable --now netbox netbox-rq # 配置启动并开机启动 sudo systemctl status netbox sudo systemctl status netbox-rq # 查看状态配置Nginx 作为反向代理这里不再赘述，我用宝塔的，不过还是扔一份配置文件在这里# 创建配置文件，注意修改netbox.olderfox.com 为自己的域名。反向代理到8001端口 server { listen 80; # CHANGE THIS TO YOUR SERVER'S NAME server_name netbox.olderfox.com; client_max_body_size 25m; fastcgi_connect_timeout 1200s; fastcgi_send_timeout 1200s; fastcgi_read_timeout 1200s; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; location /static/ { alias /opt/netbox/netbox/static/; } location / { proxy_pass http://127.0.0.1:8001; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; } } systemctl enable --now nginx # 配置启动并开机启动 systemctl status nginx # 查看状态至此，安装完成！汉化请参考：这里
前言之前一直想怎么统计一下我的这赛博废墟的访问量，找了一段时间后发现一个比较简单的项目：Ackee它可以比较方便地跟踪一些网站的相关数据，例如设备类型，Refer等，对于我这种简单的需求来说完全足够。安装它遇到了一点点麻烦，在此做个笔记吧安装Ackee提供了很多种安装方式，包括Docker、Docker-compose、Vercel等，也可以直接运行它更为简单，本文使用直接安装，不使用Docker，因为官方提供的Docker镜像需要内联MongoDB，我的数据库里面已经有很多数据，所以不方便操作。故单独运行注意：如果您决定使用Docker安装MongoDB和Ackee，请将MongoDB监听的IP指定为 127.0.0.1，否则会有被攻击者扫描到并删除数据的风险1.克隆项目执行以下命令克隆项目到你想要的目录中git clone https://github.com/electerious/Ackee2.安装Node环境 (可选)由于读者操作系统各不相同，直接扔一个NVM(NodeJS version manager)的连接在这里使用方式： 执行以下两条命令中的任意一条wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashcurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash然后安装NodeJS 20.10.0 LTS版本和NPMnvm install 20.10 nvm install-latest-npm然后安装yarn pm2 并检查安装版本npm install -g yarn npm install -g pm2 yarn --version #1.22.21 pm2 --version #5.3.0注意:某些操作系统下执行pm2/yarn命令会出现command not found错误,是因为环境问题,不再赘述，参考官方文档正式安装Ackee进入到你的Ackee的安装目录，新建一个.env文件并写入以下内容ACKEE_MONGODB=mongodb://localhost:27017/ackee #MongoDB的连接地址 ACKEE_USERNAME=THEUSERNAME #登录Ackee的用户名 ACKEE_PASSWORD=THEPASSWORD #登录Ackee的密码 ACKEE_PORT=3002 #Ackee所监听的端口然后执行 yarn run start 检查是否成功运行，正常输出应该是：[Ackee] › … awaiting Connecting to mongodb://localhost:27017/ackee [Ackee] › ✔ success Connected to mongodb://localhost:27017/ackee [Ackee] › ▶ start Starting the server [Ackee] › … watching Listening on http://localhost:3002证明配置无误，关闭后使用命令pm2 start --name Ackee src/index.js 启动附注: 可以使用pm2 startup 将其设为自动启动项，避免每次手动重启配置反向代理在官方实例中，提到了CROS，也就是跨域的问题，假设Ackee通过反向代理服务在A中，那么如果有一个网站服务的域名是B,此时B网站的访客就无法被Ackee统计到。因为涉及到跨域访问，这在绝大部分浏览器中都是被认为不安全的，除非网站运营方手动开放跨域访问。跨域访问资料参考：https://www.jianshu.com/p/89a377c52b48配置跨域访问网站A:https://trace.olderfox.com网站B:https://www.olderfox.com 在这个实例中，我的网站A作为数据统计网站B作为被统计的网站，目前所做操作均在A网站所对应的Nginx配置文件中.首先，浏览器在检测跨域可用性的方式是发送一个preflight请求，检测对方网站是否允许跨域访问，需要包含一个httpHeader,且返回的状态码需要为204Access-Control-Allow-Origin "$http_origin" always;直接扔一份反向代理配置文件在这：#PROXY-START/ location / { proxy_pass http://127.0.0.1:3002; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_http_version 1.1; # proxy_hide_header Upgrade; #Persistent connection related configuration add_header X-Cache $upstream_cache_status; #Set Nginx Cache set $static_fileIjM89oPq 0; if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" ) { set $static_fileIjM89oPq 1; expires 1m; } if ( $static_fileIjM89oPq = 0 ) { add_header Cache-Control no-cache; add_header Access-Control-Allow-Origin "$http_origin" always; add_header Access-Control-Allow-Methods "GET, POST, PATCH, OPTIONS" always; add_header Access-Control-Allow-Headers "Content-Type, Authorization, Time-Zone" always; add_header Access-Control-Allow-Credentials "true" always; add_header Access-Control-Max-Age "3600" always; } if ($request_method = 'OPTIONS') { add_header X-Frame-Options deny; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; add_header Access-Control-Allow-Origin "$http_origin" always; add_header X-Cache $upstream_cache_status; add_header Access-Control-Allow-Methods "GET, POST, PATCH, OPTIONS" always; add_header Access-Control-Allow-Headers "Content-Type, Authorization, Time-Zone" always; add_header Access-Control-Allow-Credentials "true" always; add_header Access-Control-Max-Age "3600" always; add_header Strict-Transport-Security "max-age=31536000" always; add_header 'Access-Control-Max-Age' 1728000; return 204; } } #PROXY-END/OK，你现在就能用了！晚安玛卡巴卡。