• 首页
  • 归档
  • 关于
  • 搜索
  • 夜间模式
    ©2026  望时代 Theme by OneBlog

    望时代

    搜索
    标签
    # 教程 # Linux # 脚本 # AI # 影音 # 游戏 # 随笔 # 科技 # 认知
  • 首页>
  • >
  • 正文
  • [莱云-莱栈] 可用于商业化售卖的 Proxmox VE 预先分配端口的 NAT 解决方案

    2026年06月26日 3 阅读 0 评论 5953 字

    [莱云-莱栈] 可用于商业化售卖的 Proxmox VE 预先分配端口的 NAT 解决方案 __2023年7月12日 __3条评论 __251次阅读 __0人点赞 __Tao_Qi 注意:这不是什么新颖高端的技术。您可以随意修改并二次发布我们的代码。
    我们乐于分享自己的解决方案,如果您有需求,可以随时联系我们。 商业化环境 WHMCS Proxmox VE Proxmox Addon。 简述 Proxmox VE 使用 KVM 虚拟化,会带来更小的性能损耗。不过相对于无法扩展的插件来说,使其适配 NAT 会产生一些问题。 这不是一个新颖的解决方案,它有点弯路,但是很实用。 原理 部署或虚拟化一个 NAT 网关,使用预先分配的 iptables 规则,即可完成 NAT 转发。 计算方法
    [code]

    function calculatePortRanges(int $hostNumber, int $startPort = 20000, int $portPerHost = 10)
    {
        // 计算端口范围
        $startPortNumber = $startPort   ($hostNumber * ($portPerHost   1));
        $endPortNumber = $startPortNumber   $portPerHost;
    
        // 输出端口范围
        echo "主机号 {$hostNumber} 对应的端口范围是 {$startPortNumber} 到 {$endPortNumber}。";
    
        $ssh_port = $startPortNumber;
        $rdp_port = $startPortNumber   1;
        $real_start = $startPortNumber   2;
    
        echo "内: 22,3389,{$real_start}-{$endPortNumber}";
        echo "外: {$ssh_port},{$rdp_port},{$real_start}-{$endPortNumber}";
    }
    

    [/code]

    在 calculatePortRanges 的形参中,$hostNumber 为主机号,$startPort 为起始端口,$portPerHost 为每个主机分配的端口个数。 随后,将取分配到该主机号到第一个可用端口用于 SSH,对应 IP 地址的 22 端口,第二个端口用于 远程桌面,对应 IP 地址的 3389 端口。 剩下的端口将映射到 IP 地址的相同端口。
    也就是说,如果内外网端口必须相同。 缺点 此方法无法针对每个主机设置不同的可用端口个数,且后期拓展性差。 但是确实很方便。 生成的 iptables 命令 我们可以将这个计算方法写成一个脚本。随后将它运行在虚拟网关。
    [code]

    #!/bin/bash
    
    if [[ $# -lt 3 ]]; then
        echo "参数错误!请提供正确的网卡名称、网络段、起始端口和每个主机号的端口数量,本机 IP。如果需要测试模式,请在最后加上 test_mode 参数。"
        echo "示例:sudo bash $0 eth0 192.168.0.0/24 21000 10"
        exit 1
    fi
    
    # 解析网络段、起始端口和每个主机号的端口数量
    subnet=$2
    startPort=$3
    portPerHost=$4
    device=$1
    
    # 检测网络段是否 CIDR
    if [[ $subnet != *"/"* ]]; then
        echo "网络段必须是 CIDR 格式!"
        exit 1
    fi  
    
    
    # 验证起始端口和每个主机号的端口数量大于等于0
    if [[ $startPort -lt 0 || $portPerHost -lt 0 ]]; then
        echo "起始端口和每个主机号的端口数量必须大于等于0!"
        exit 1
    fi
    
    
    # 传递的参数:IP地址和起始端口号
    ip=$2
    echo "CIDR 是 ${ip}。"
    
    # 去除 ip 的主机号和网段
    ip=${ip%.*}
    
    portPerHost=$((portPerHost   1))
    
    # 启用IP转发
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
    # 清除旧的iptables规则
    iptables -t nat -F
    iptables -t nat -X
    iptables -t nat -Z
    iptables -F
    iptables -X
    iptables -Z
    
    # 设置默认策略
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -P OUTPUT ACCEPT
    
    iptables -t nat -A POSTROUTING -s ${ip} -o ${device} -j MASQUERADE
    
    
    # 计算每个主机号的端口范围
    function calculatePortRanges() {
        hostNumber=$1
    
        startPortNumber=$((startPort   (hostNumber * portPerHost)))
        endPortNumber=$((startPortNumber   portPerHost - 1))
    
        echo "IP地址 ${ip}.${hostNumber} 对应的端口范围是 ${startPortNumber} 到 ${endPortNumber}。"
    }
    
    # 创建新的iptables规则
    function createPortForwardingRule() {
        set -x
    
        hostNumber=$1
    
        startPortNumber=$((startPort   (hostNumber * portPerHost)))
        endPortNumber=$((startPortNumber   portPerHost - 1))
    
        echo "IP ${ip}.${hostNumber} 的 SSH 端口是 ${startPortNumber}。"
        # SSH端口转发
        iptables -t nat -A PREROUTING -i ${device} -p tcp --dport ${startPortNumber} -j DNAT --to ${ip}.${hostNumber}:22
        iptables -t nat -A PREROUTING -i ${device} -p udp --dport ${startPortNumber} -j DNAT --to ${ip}.${hostNumber}:22
    
        # RDP端口转发
        echo "IP ${ip}.${hostNumber} 的 RDP 端口是 $((startPortNumber   1))。"
        iptables -t nat -A PREROUTING -i ${device} -p tcp --dport $((startPortNumber   1)) -j DNAT --to ${ip}.${hostNumber}:3389
        iptables -t nat -A PREROUTING -i ${device} -p udp --dport $((startPortNumber   1)) -j DNAT --to ${ip}.${hostNumber}:3389
    
        # 实际端口范围转发
    
        startPortNumber=$((startPortNumber   2))
        echo "起始端口号是 ${startPortNumber}。"
        endPortNumber=$((endPortNumber))
        echo "结束端口号是 ${endPortNumber}。"
    
        # 实际端口范围转发
        for ((portNumber = startPortNumber; portNumber  /etc/iptables.rules
    

    [/code]

    调用方法:bash your_name.sh eth0 192.168.1.0/24 21000 10。 注意:此脚本没有计算子网的可用地址数量。 虚拟机网络设置 将虚拟机的网关地址设置为虚拟网关的地址,随后即可开始验证端口连通性。 前端计算 IP 地址对应的端口范围 线上演示:https://stack.laecloud.com/p/ip_calc应用此解决方案您可以随意修改并二次发布我们的代码。Github仓库:https://github.com/iVampireSP/proxmox-ve-pre-defined-port-nat文章:[https://www.laecloud.com/可用于商业化售卖的ProxmoxVE预先分配端口的NAT解决方案](https://www.laecloud.com/%e5%8f%af%e7%94%a8%e4%ba%8e%e5%95%86%e4%b8%9a%e5%8c%96%e5%94%ae%e5%8d%96%e7%9a%84-proxmox-ve-%e9%a2%84%e5%85%88%e5%88%86%e9%85%8d%e7%ab%af%e5%8f%a3%e7%9a%84-nat-%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/)本作品采用[知识共享署名-相同方式共享4.0国际许可协议](http://creativecommons.org/licenses/by-sa/4.0/)进行许可[__点赞](javascript:;)[__分享](javascript:;)[__](javascript:;)[__](javascript:;)[__](javascript:;)[__](javascript:;)[__](javascript:;)[__打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮](javascript:;)__NoTag最后编辑:2023年7月12日[上一篇](https://www.5yyx.com/?p=3706熬夜写的VPS小鸡流量统计网页)[下一篇](https://www.5yyx.com/?p=3717 "披荆斩棘一个月,Debian/Kali 支持 raid 0,1,5,6,10 开发完成")

    1. hostlocmjj说道: 2023年7月12日 下午6:29
    2. Twilight说道: 2023年7月12日 下午6:32
    3. Twilight说道: 2023年7月12日 下午6:33

    发表回复 取消回复电子邮件地址不会被公开。必填项已用 标注 __ __

    本文著作权归作者 [ doudoudoubao ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    Linux
    取消回复

    发表留言
    回复

    Copyright©2026  All Rights Reserved.  Load:0.003 s
    Theme by OneBlog V3.7.1
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。