作者: 启鑫

  • QNAP 安装 iPerf3 教程

    iPerf3 是一款广泛使用的网络性能测试工具,可精确测量 TCP 和 UDP 带宽、延迟、丢包率等关键指标。通过在 NAS 上部署 iPerf3,用户可以轻松测试家庭或企业网络的上传/下载速度,定位瓶颈,优化网络配置,尤其适用于多设备或高负载网络环境的性能评估。通过在 NAS 上安装 iPerf3,用户可以方便地对家庭或办公网络进行性能评估与故障排查,有助于发现潜在瓶颈并优化网络配置。

    一、通过 Entware 安装 iPerf3

    1.下载并安装 Entware QPKG

    1. 下载 Entware 安装包:
      https://download.qnap.com/Storage/tsd/utility/Entware_1.02std.qpkg
    2. 安装 QPKG 文件:
    • 打开 应用中心。
    • 点击右上角的 “手动安装”。
    • 点击 “浏览”,选择已下载的 QPKG 文件。
    • 点击 “安装”。
    • 安装完成后,请确认应用中心中出现 Entware-std 1.02。

    2.使用 SSH 安装 iPerf3

    1. 使用 SSH 登录到 QNAP NAS。
    2. 进入 Entware 的安装目录(以下路径为常见默认路径):
    cd /share/CACHEDEV1_DATA/.qpkg/Entware/bin
    1. 运行以下命令安装 iPerf3:
    ./opkg install iperf3

    3.启动 iPerf3 服务端

    在 NAS 上运行以下命令,启动 iPerf3 为服务端:

    iperf3 -s

    二、客户端进行带宽测试

    在其他设备上运行如下命令进行带宽测试:

    iperf3 -c <NAS_IP地址>

    例如,如果 NAS 的 IP 是 192.168.1.100:

    iperf3 -c 192.168.1.100
  • Debian12使用 Unbound 搭建本地 DNS 服务器

    搭建本地 DNS 服务器能够提升域名解析速度、增强网络安全和隐私保护。Unbound 作为一款高性能、轻量级且支持 DNSSEC 的递归解析器,非常适合用来搭建本地 DNS 服务。通过本地 DNS,用户不仅减少对外部服务器的依赖,还能实现更灵活的管理与控制,提升整体网络体验和安全性。

    1. 更新系统软件包

    确保你的系统软件包是最新的。执行以下命令更新软件包列表:

    apt update

    2. 安装必要的软件包

    我们需要安装 nano(一个轻量级文本编辑器),dnsutils(包含 dig 等DNS调试工具),以及 unbound DNS 服务器。

    apt install -y nano dnsutils
    apt install -y unbound

    3. 启动并启用 Unbound 服务

    安装完成后,启用 unbound 服务并立即启动:

    systemctl enable --now unbound

    4. 配置系统使用本地 DNS

    为了让系统使用刚刚搭建的本地 DNS 服务器,修改 /etc/resolv.conf 文件,将 DNS 服务器地址指向本机:

    echo "nameserver 127.0.0.1" > /etc/resolv.conf

    5. 验证 DNS 服务监听端口

    使用 ss 命令检查本地是否有进程监听 53 端口(DNS 默认端口):

    ss -lnptu | grep 53

    如果看到 unbound 在 53 端口监听,说明服务正常启动。

    6. 测试 DNS 解析功能

    使用 dig 命令向本地 DNS 服务器请求解析 debian.org 域名:

    dig @127.0.0.1 debian.org

    如果查询返回正确的 DNS 解析结果,则 DNS 服务器工作正常。

    7. 配置 Unbound

    编辑主配置文件 /etc/unbound/unbound.conf:

    nano /etc/unbound/unbound.conf

    添加以下配置内容:

    server:
        interface: 0.0.0.0
        access-control: 192.168.1.0/24 allow
        cache-max-ttl: 86400
        cache-min-ttl: 3600
        num-threads: 4 # CPU
        msg-cache-size: 128m
        rrset-cache-size: 256m
        msg-cache-slabs: 4
        rrset-cache-slabs: 4
        infra-cache-slabs: 4
        key-cache-slabs: 4
        auto-trust-anchor-file: "/var/lib/unbound/root.key"
        root-hints: "/var/lib/unbound/root.hints"
        val-clean-additional: yes
        harden-glue: yes
        harden-dnssec-stripped: yes
        hide-identity: yes
        hide-version: yes
        do-ip4: yes
        do-tcp: yes
        do-udp: yes
        tcp-upstream: yes
        prefetch: yes
        prefetch-key: yes
    • interface: 0.0.0.0
      监听的网络接口,0.0.0.0 表示监听所有可用的IPv4接口(即对所有IP开放)。
    • access-control: 192.168.1.0/24 allow
      允许来自这个网段(192.168.1.0 到 192.168.1.255)的客户端访问DNS服务。
    • cache-max-ttl: 86400
      DNS缓存的最大存活时间(TTL),单位是秒。86400秒 = 24小时。缓存中的记录不会超过这个时间。
    • cache-min-ttl: 3600
      DNS缓存的最小存活时间(TTL),单位是秒。即使记录的TTL小于这个值,也会缓存至少3600秒(1小时)。
    • num-threads: 4 # CPU
      用于DNS查询处理的线程数量,通常设置为CPU核心数,这里是4个线程。
    • msg-cache-size: 128m
      DNS消息缓存大小,128MB。缓存解析过的DNS响应消息,提升查询效率。
    • rrset-cache-size: 256m
      RRSet缓存大小,256MB。RRSet是资源记录集合,缓存DNS记录的具体数据。
    • msg-cache-slabs: 4
      将消息缓存分成4个分片,提高并发访问性能。
    • rrset-cache-slabs: 4
      RRSet缓存分成4个分片,同样为了提高并发处理性能。
    • infra-cache-slabs: 4
      基础设施缓存分片数,4个。缓存底层的基础数据,提高性能。
    • key-cache-slabs: 4
      DNSSEC密钥缓存分片数,4个。缓存验证DNSSEC所需的密钥数据。
    • auto-trust-anchor-file: “/var/lib/unbound/root.key”
      DNSSEC自动信任锚文件路径,Unbound用来验证DNSSEC签名的根信任锚。
    • root-hints: “/var/lib/unbound/root.hints”
      根服务器提示文件路径,Unbound用来查找根DNS服务器的地址。
    • val-clean-additional: yes
      启用清理额外信息的DNSSEC验证功能,增强安全性。
    • harden-glue: yes
      加固“胶记录”的安全,防止DNS缓存投毒攻击。
    • harden-dnssec-stripped: yes
      防止中间人去除DNSSEC签名,确保DNSSEC验证的完整性。
    • hide-identity: yes
      隐藏Unbound服务器的标识信息,不向外泄漏服务器名称。
    • hide-version: yes
      隐藏版本信息,避免泄露软件版本给潜在攻击者。
    • do-ip4: yes
      启用IPv4查询支持。
    • do-tcp: yes
      启用通过TCP协议进行DNS查询,UDP有时不能传输大型响应。
    • do-udp: yes
      启用通过UDP协议进行DNS查询。
    • tcp-upstream: yes
      向上游服务器发起TCP连接查询,增强可靠性。
    • prefetch: yes
      启用预取缓存功能,缓存快要过期的记录时提前刷新,减少查询延迟。
    • prefetch-key: yes
      针对DNSSEC密钥的预取缓存功能,提高验证效率。

    8. 检查配置文件正确性

    使用 unbound-checkconf 命令检查配置文件语法是否正确:

    unbound-checkconf

    如果没有错误提示,说明配置有效。

    9. 重启 Unbound 服务

    最后,重启服务使配置生效:

    systemctl restart unbound

  • macOS 手动卸载官方安装的 JDK

    在 macOS 系统中,Java 开发工具包(JDK)可以通过官方安装包进行安装,默认安装路径为 /Library/Java/JavaVirtualMachines/。如果需要卸载已安装的 JDK,可以通过命令行手动删除对应目录

    1. 验证当前 JDK 版本

    在卸载前,建议先确认当前使用的 Java 版本:

    java -version

    如果系统提示 JDK 版本号,说明当前系统中仍有 JDK 被引用。若想卸载当前版本,请在卸载后重新设置默认 JDK,或保留至少一个 JDK 版本供系统使用。

    2. JDK 默认安装路径

    官方安装的 JDK 通常位于以下目录:

    /Library/Java/JavaVirtualMachines/

    3. 查看已安装的 JDK

    使用以下命令查看系统中已安装的所有 JDK 版本:

    ls /Library/Java/JavaVirtualMachines

    命令将列出类似如下内容的目录:

    jdk-17.0.2.jdk
    jdk-24.jdk

    4. 删除指定 JDK

    如果确定需要卸载某个版本,例如 JDK 24,可以执行以下命令:

    sudo rm -rf /Library/Java/JavaVirtualMachines/jdk-24.jdk

    该命令会强制递归删除指定目录。请确保路径和版本号正确,避免误删其他版本。

    5. 确认删除成功

    删除完成后,再次列出 JDK 安装目录,确认指定版本已被移除:

    ls /Library/Java/JavaVirtualMachines

    如果已删除的 JDK 版本不再显示,说明卸载成功。

  • IaC 安全必备利器Checkov 在 DevSecOps 流程中的实践

    随着云计算和自动化技术的快速发展,基础设施即代码(Infrastructure as Code,IaC) 已成为现代软件交付的重要组成部分。与此同时,DevSecOps 的兴起,推动安全理念前移,将安全嵌入开发和运维流程,实现安全与速度的平衡。

    在云原生和自动化时代,IaC 已是基础设施管理的基石,保障其安全性成为必然。借助 Checkov 等工具,结合 DevSecOps 的安全文化,能够有效降低配置风险,提升整体交付质量和安全韧性。推动 IaC 安全从“可选”走向“必需”,是每个现代软件团队迈向成熟的关键一步。

    1. 为什么 IaC 安全不可忽视?

    IaC 通过代码化方式管理基础设施,极大提升了自动化水平和交付效率。但这也带来了新的安全挑战:

    • 配置风险高发
      误配置如开放存储桶、过宽权限或暴露的网络端口,极易被攻击者利用。
    • 敏感信息泄露隐患
      直接在 IaC 代码中硬编码密钥、凭证,存在重大安全漏洞。
    • 合规压力持续增加
      必须满足内部政策与行业法规要求,确保基础设施符合安全规范。
    • 快速部署带来的风险扩散
      自动化频繁部署导致漏洞迅速扩散,若未及时发现,后果严重。

    因此,在 DevSecOps 体系中,必须对 IaC 实施自动化安全扫描,实现“安全左移”,及早识别并修复安全隐患。

    2. Checkov:IaC 静态安全扫描利器

    Checkov 是一款开源的 IaC 静态分析工具,广泛支持主流 IaC 格式和云平台,帮助开发者和安全团队在代码层面发现潜在风险。

    主要功能亮点:

    • 支持多种 IaC 格式:Terraform、CloudFormation、Kubernetes YAML、ARM 模板、Serverless、Helm charts、Dockerfile 等。
    • 针对 AWS、Azure、GCP 等主流云平台内置丰富的安全合规策略。
    • 拥有数百条预置检测规则,覆盖常见安全漏洞和最佳实践。
    • 易于集成,适配本地开发环境和 CI/CD 流水线,实现自动化扫描。

    通过 Checkov,团队能够快速定位配置风险,防止漏洞进入生产环境。

    3. 快速上手 Checkov

    安装

    pip install checkov

    验证

    checkov --version

    扫描示例

    • 扫描单个文件:
    checkov -f main.tf
    • 扫描整个项目目录:
    checkov -d .

    4. 将 Checkov 深度融合到 DevSecOps 流程

    • 早期预警
      鼓励开发者本地运行 Checkov,尽早发现和修复安全问题。
    • CI/CD 自动化
      将 Checkov 作为流水线必经环节,扫描未通过即阻断合并或部署,确保安全代码上线。
    • 持续优化
      定期分析扫描报告,提炼常见风险,持续完善 IaC 模板和安全策略。
    • 跨团队协作
      安全团队与开发团队紧密配合,提升安全意识,共同打造安全可靠的基础设施。
  • 使用 Docker 部署 Greenbone Community Edition(GCE):打造你的本地漏洞扫描平台

    一、GCE 简介

    Greenbone Community Edition(GCE) 是由 Greenbone Networks 维护的开源安全漏洞扫描解决方案,基于知名的 OpenVAS(Open Vulnerability Assessment System) 项目构建。它包括:

    • GSA(Greenbone Security Assistant):图形化 Web 管理界面;
    • GVMD:扫描调度与管理守护进程;
    • OpenVAS Scanner:扫描引擎;
    • Greenbone Community Feed:开源漏洞数据库(每日更新);
    • GVM-Tools:命令行工具,支持远程自动化控制。

    GCE 是企业级 Greenbone GSM 产品的免费替代方案,非常适合中小企业、个人研究人员、DevSecOps 团队部署。

    二、安装Docker

    $ curl -fsSL https://get.docker.com -o get-docker.sh
    $ sudo sh get-docker.sh

    三、部署Greenbone Community Edition(GCE)

    1. 保存 docker-compose.yml 文件
    2. 运行以下命令启动服务:
    docker compose up -d
    1. 容器启动后,访问 Web 管理界面:
    http://<服务器IP>:9392
    登录默认管理员账户/密码:admin

    首次启动可能需要等待几分钟,用于加载漏洞数据库、初始化服务。

    name: greenbone-community-edition
    
    services:
      vulnerability-tests:
        image: registry.community.greenbone.net/community/vulnerability-tests
        environment:
          FEED_RELEASE: "24.10"
        volumes:
          - vt_data_vol:/mnt
    
      notus-data:
        image: registry.community.greenbone.net/community/notus-data
        volumes:
          - notus_data_vol:/mnt
    
      scap-data:
        image: registry.community.greenbone.net/community/scap-data
        volumes:
          - scap_data_vol:/mnt
    
      cert-bund-data:
        image: registry.community.greenbone.net/community/cert-bund-data
        volumes:
          - cert_data_vol:/mnt
    
      dfn-cert-data:
        image: registry.community.greenbone.net/community/dfn-cert-data
        volumes:
          - cert_data_vol:/mnt
        depends_on:
          - cert-bund-data
    
      data-objects:
        image: registry.community.greenbone.net/community/data-objects
        environment:
          FEED_RELEASE: "24.10"
        volumes:
          - data_objects_vol:/mnt
    
      report-formats:
        image: registry.community.greenbone.net/community/report-formats
        environment:
          FEED_RELEASE: "24.10"
        volumes:
          - data_objects_vol:/mnt
        depends_on:
          - data-objects
    
      gpg-data:
        image: registry.community.greenbone.net/community/gpg-data
        volumes:
          - gpg_data_vol:/mnt
    
      redis-server:
        image: registry.community.greenbone.net/community/redis-server
        restart: on-failure
        volumes:
          - redis_socket_vol:/run/redis/
    
      pg-gvm:
        image: registry.community.greenbone.net/community/pg-gvm:stable
        restart: on-failure
        volumes:
          - psql_data_vol:/var/lib/postgresql
          - psql_socket_vol:/var/run/postgresql
    
      gvmd:
        image: registry.community.greenbone.net/community/gvmd:stable
        restart: on-failure
        volumes:
          - gvmd_data_vol:/var/lib/gvm
          - scap_data_vol:/var/lib/gvm/scap-data/
          - cert_data_vol:/var/lib/gvm/cert-data
          - data_objects_vol:/var/lib/gvm/data-objects/gvmd
          - vt_data_vol:/var/lib/openvas/plugins
          - psql_data_vol:/var/lib/postgresql
          - gvmd_socket_vol:/run/gvmd
          - ospd_openvas_socket_vol:/run/ospd
          - psql_socket_vol:/var/run/postgresql
        depends_on:
          pg-gvm:
            condition: service_started
          scap-data:
            condition: service_completed_successfully
          cert-bund-data:
            condition: service_completed_successfully
          dfn-cert-data:
            condition: service_completed_successfully
          data-objects:
            condition: service_completed_successfully
          report-formats:
            condition: service_completed_successfully
    
      gsa:
        image: registry.community.greenbone.net/community/gsa:stable
        restart: on-failure
        ports:
          - 9392:80
        volumes:
          - gvmd_socket_vol:/run/gvmd
        depends_on:
          - gvmd
      # Sets log level of openvas to the set LOG_LEVEL within the env
      # and changes log output to /var/log/openvas instead /var/log/gvm
      # to reduce likelyhood of unwanted log interferences
      configure-openvas:
        image: registry.community.greenbone.net/community/openvas-scanner:stable
        volumes:
          - openvas_data_vol:/mnt
          - openvas_log_data_vol:/var/log/openvas
        command:
          - /bin/sh
          - -c
          - |
            printf "table_driven_lsc = yes\nopenvasd_server = http://openvasd:80\n" > /mnt/openvas.conf
            sed "s/127/128/" /etc/openvas/openvas_log.conf | sed 's/gvm/openvas/' > /mnt/openvas_log.conf
            chmod 644 /mnt/openvas.conf
            chmod 644 /mnt/openvas_log.conf
            touch /var/log/openvas/openvas.log
            chmod 666 /var/log/openvas/openvas.log
    
      # shows logs of openvas
      openvas:
        image: registry.community.greenbone.net/community/openvas-scanner:stable
        restart: on-failure
        volumes:
          - openvas_data_vol:/etc/openvas
          - openvas_log_data_vol:/var/log/openvas
        command:
          - /bin/sh
          - -c
          - |
            cat /etc/openvas/openvas.conf
            tail -f /var/log/openvas/openvas.log
        depends_on:
          configure-openvas:
            condition: service_completed_successfully
    
      openvasd:
        image: registry.community.greenbone.net/community/openvas-scanner:stable
        restart: on-failure
        environment:
          # `service_notus` is set to disable everything but notus,
          # if you want to utilize openvasd directly, remove `OPENVASD_MODE`
          OPENVASD_MODE: service_notus
          GNUPGHOME: /etc/openvas/gnupg
          LISTENING: 0.0.0.0:80
        volumes:
          - openvas_data_vol:/etc/openvas
          - openvas_log_data_vol:/var/log/openvas
          - gpg_data_vol:/etc/openvas/gnupg
          - notus_data_vol:/var/lib/notus
        # enable port forwarding when you want to use the http api from your host machine
        # ports:
        #   - 127.0.0.1:3000:80
        depends_on:
          vulnerability-tests:
            condition: service_completed_successfully
          configure-openvas:
            condition: service_completed_successfully
          gpg-data:
            condition: service_completed_successfully
        networks:
          default:
            aliases:
              - openvasd
    
      ospd-openvas:
        image: registry.community.greenbone.net/community/ospd-openvas:stable
        restart: on-failure
        hostname: ospd-openvas.local
        cap_add:
          - NET_ADMIN # for capturing packages in promiscuous mode
          - NET_RAW # for raw sockets e.g. used for the boreas alive detection
        security_opt:
          - seccomp=unconfined
          - apparmor=unconfined
        command:
          [
            "ospd-openvas",
            "-f",
            "--config",
            "/etc/gvm/ospd-openvas.conf",
            "--notus-feed-dir",
            "/var/lib/notus/advisories",
            "-m",
            "666",
          ]
        volumes:
          - gpg_data_vol:/etc/openvas/gnupg
          - vt_data_vol:/var/lib/openvas/plugins
          - notus_data_vol:/var/lib/notus
          - ospd_openvas_socket_vol:/run/ospd
          - redis_socket_vol:/run/redis/
          - openvas_data_vol:/etc/openvas/
          - openvas_log_data_vol:/var/log/openvas
        depends_on:
          redis-server:
            condition: service_started
          gpg-data:
            condition: service_completed_successfully
          vulnerability-tests:
            condition: service_completed_successfully
          configure-openvas:
            condition: service_completed_successfully
    
      gvm-tools:
        image: registry.community.greenbone.net/community/gvm-tools
        volumes:
          - gvmd_socket_vol:/run/gvmd
          - ospd_openvas_socket_vol:/run/ospd
        depends_on:
          - gvmd
          - ospd-openvas
    
    volumes:
      gpg_data_vol:
      scap_data_vol:
      cert_data_vol:
      data_objects_vol:
      gvmd_data_vol:
      psql_data_vol:
      vt_data_vol:
      notus_data_vol:
      psql_socket_vol:
      gvmd_socket_vol:
      ospd_openvas_socket_vol:
      redis_socket_vol:
      openvas_data_vol:
      openvas_log_data_vol:
  • 自建免费翻译服务:LibreTranslate 安装与运行指南

    对于需要翻译功能但又希望数据掌握在自己手中,或者想避免商业翻译 API 成本的用户而言,开源翻译软件 LibreTranslate 提供了一个绝佳的解决方案。它允许您在自己的服务器上搭建一个功能完善的机器翻译服务,支持多种语言对的机器翻译,且不依赖外部 API,适合在内网或资源受限的环境中使用

    一、创建独立的运行环境 (Conda)

    创建一个名为 libretranslate 的新虚拟环境并激活一个名为 libretranslate 的环境,基于 Python 3.12。

    conda create -n libretranslate python=3.12
    conda activate libretranslate

    二、安装 LibreTranslate

    使用 pip 安装最新版的 LibreTranslate:

    pip install -U libretranslate

    安装完成后,即可通过命令行启动 LibreTranslate 服务。

    三、启动服务

    运行以下命令,启动默认配置的翻译服务:

    libretranslate

    服务启动后,默认会监听本地的 http://127.0.0.1:5000,提供一个 REST API 接口用于文本翻译。

    四、指定加载语言模型

    如果你只需要支持特定语言(比如英文和中文),可以通过 --load-only 参数指定需要加载的模型,从而节省内存和启动时间:

    libretranslate --load-only en,zh

    这将只加载英文(en)和中文(zh)之间的模型。

    五、更新语言模型

    为确保模型为最新版,可以执行以下命令进行更新:

    libretranslate --update-models

    此命令会自动下载并更新本地缓存的翻译模型,确保翻译质量和准确性。