步骤
配置nat小鸡自动获取ip地址
1️⃣ 首先先更新一下系统组件

apt update && apt upgrade

2️⃣ 编辑/etc/network/interface文件后保存

nano /etc/network/interfaces
auto lo
iface lo inet loopback

auto eno1
iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
        address 149.202.**.**/24
        gateway 149.202.**.**
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0

auto vmbr1
iface vmbr1 inet static
        address 192.168.100.1
        netmask 255.255.255.0
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up iptables -t nat -A POSTROUTING -s '192.168.100.0/24' -o vmbr0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '192.168.100.0/24' -o vmbr0 -j MASQUERADE

✅ 重启网络服务使其生效

systemctl restart networking

3️⃣ 安装dhcp服务(安装默认无法启动,需要配置后方能启动)

apt-get install isc-dhcp-server

4️⃣ 配置dhcp服务

nano /etc/default/isc-dhcp-server
INTERFACESv4="vmbr1"
INTERFACESv6=""
nano /etc/dhcp/dhcpd.conf
ddns-update-style none;
authoritative;

option domain-name "ks2.topwuan.tech";
option domain-name-servers 8.8.8.8, 8.8.4.4;

default-lease-time 600;
max-lease-time 7200;

subnet 192.168.100.0 netmask 255.255.255.0 {
    range 192.168.100.5 192.168.100.230;
    option subnet-mask 255.255.255.0;
    option domain-name-servers 8.8.8.8, 8.8.4.4;
    option domain-name "ks2.topwuan.tech";
    option routers 192.168.100.1;
    option netbios-name-servers 192.168.100.1;
    option netbios-node-type 8;
    get-lease-hostnames true;
    use-host-decl-names true;
    default-lease-time 600;
    max-lease-time 7200;
}

5️⃣ 重启dhcp服务并检查服务是否正常

systemctl restart isc-dhcp-server
systemctl status isc-dhcp-server

在创建小鸡时网络接口选择 vmbr1 ,进入系统输入ip a查看ip信息发现已经自动获取到dhcp分配的ip了


🧱 端口转发

宿主机上操作:

1️⃣ 安装 rinetd

apt install rinetd -y

2️⃣ 编辑配置

nano /etc/rinetd.conf

内容如下:

logfile /var/log/rinetd.log
0.0.0.0 2322 192.168.100.6 22

解释:

  • 0.0.0.0 → 绑定宿主机所有网卡(也可以写公网 IP)
  • 2322 → 宿主机监听端口
  • 192.168.100.6 → 虚拟机(Debian)内网 IP
  • 22 → 转发到虚拟机的 SSH 端口
    3️⃣ 重启服务:

    systemctl restart rinetd
    

GPT搓了一个自动同步虚拟机端口放行的版本

特点:

  • 宿主机运行脚本
  • 自动安装 rinetd + 放行宿主机端口
  • 自动通过 SSH 登录虚拟机执行放行命令(无需手动登录虚拟机)
  • 支持多虚拟机、多端口

脚本示例:rinetd_auto_vm.sh

#!/bin/bash
# ==============================================
# PVE9 rinetd + 宿主机 + 虚拟机端口自动放行
# 功能:
# 1. 安装 rinetd 并配置端口映射
# 2. 宿主机 iptables 放行
# 3. 自动 SSH 登录虚拟机放行对应端口
# 4. 适合多虚拟机端口管理
# ==============================================

set -e

# -----------------------------
# 配置 SSH 用户和密钥
# -----------------------------
SSH_USER="root"    # 虚拟机登录用户
SSH_KEY="/root/.ssh/id_rsa"  # 已生成免密钥登录虚拟机

# -----------------------------
# 1. 安装 rinetd
# -----------------------------
echo "========== 安装 rinetd =========="
apt update -y
apt install -y rinetd netfilter-persistent sshpass

RINETD_CONF="/etc/rinetd.conf"
[ -f "$RINETD_CONF" ] && cp "$RINETD_CONF" "${RINETD_CONF}.bak_$(date +%s)"
echo "logfile /var/log/rinetd.log" > $RINETD_CONF

# -----------------------------
# 2. 宿主机端口映射配置
# 格式: 宿主机端口 虚拟机IP 虚拟机端口
# -----------------------------
PORT_MAPPINGS=(
"2322 192.168.100.6 22"
"25701 192.168.100.6 22270"
"52003 192.168.100.6 2003"
"13691 192.168.100.7 3389"
"13025 192.168.100.8 13025"
)

# -----------------------------
# 3. 配置 rinetd + 放行宿主机端口
# -----------------------------
echo "========== 配置 rinetd 并放行宿主机端口 =========="
for mapping in "${PORT_MAPPINGS[@]}"; do
    HOST_PORT=$(echo $mapping | awk '{print $1}')
    VM_IP=$(echo $mapping | awk '{print $2}')
    VM_PORT=$(echo $mapping | awk '{print $3}')

    if ss -tuln | grep -q ":$HOST_PORT "; then
        echo "⚠️ 宿主机端口 $HOST_PORT 已被占用,跳过"
        continue
    fi

    echo "0.0.0.0 $HOST_PORT $VM_IP $VM_PORT" >> $RINETD_CONF

    # 放行宿主机端口
    if ! iptables -C INPUT -p tcp --dport $HOST_PORT -j ACCEPT 2>/dev/null; then
        iptables -I INPUT -p tcp --dport $HOST_PORT -j ACCEPT
    fi
done

netfilter-persistent save

# -----------------------------
# 4. 启动 rinetd
# -----------------------------
systemctl enable rinetd
systemctl restart rinetd
systemctl status rinetd --no-pager

# -----------------------------
# 5. 自动放行虚拟机端口
# -----------------------------
echo "========== 自动 SSH 登录虚拟机放行端口 =========="
for mapping in "${PORT_MAPPINGS[@]}"; do
    VM_IP=$(echo $mapping | awk '{print $2}')
    VM_PORT=$(echo $mapping | awk '{print $3}')

    echo "🔹 尝试在虚拟机 $VM_IP 上放行端口 $VM_PORT"

    ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no $SSH_USER@$VM_IP "
        if ! ss -tuln | grep -q ':$VM_PORT '; then
            echo '⚠️ 端口 $VM_PORT 服务可能未启动'
        fi
        if ! iptables -C INPUT -p tcp --dport $VM_PORT -j ACCEPT 2>/dev/null; then
            iptables -I INPUT -p tcp --dport $VM_PORT -j ACCEPT
            echo '✅ 端口 $VM_PORT 已放行'
        else
            echo 'ℹ️ 端口 $VM_PORT 已放行'
        fi
        netfilter-persistent save
    "
done

echo "========== 完成 =========="
echo "宿主机和虚拟机端口已同步放行"
echo "rinetd 配置文件:$RINETD_CONF"

📝 使用方法

确保虚拟机已生成 SSH 公私钥免密登录,宿主机可以 ssh root@虚拟机IP 无密码登录。

保存脚本:

nano /root/rinetd_auto_vm.sh

赋权并运行:

chmod +x /root/rinetd_auto_vm.sh
./rinetd_auto_vm.sh

以后新增端口:
编辑 PORT_MAPPINGS 数组

重新运行脚本,一键更新宿主机 rinetd + iptables + 虚拟机端口

💡 优点:

  • 一次运行即可完成宿主机 + 虚拟机端口同步
  • 自动检测端口占用
  • 支持多虚拟机、多端口
  • 无需手动登录虚拟机

1️⃣ 新增端口步骤

你的脚本中,有一个数组:

PORT_MAPPINGS=(
"2322 192.168.100.6 22"
"25701 192.168.100.6 22270"
"52003 192.168.100.6 2003"
"13691 192.168.100.7 3389"
"13025 192.168.100.8 13025"
)

每一行的格式是:
<宿主机端口> <虚拟机IP> <虚拟机端口>


✅ 例如你想新增一个虚拟机服务:

  • 虚拟机 IP:192.168.100.6
  • 虚拟机端口:2005
  • 宿主机希望映射端口:52005
  • 只需在数组里加一行:

"52005 192.168.100.6 2005"

最终数组示例:

PORT_MAPPINGS=(
"2322 192.168.100.6 22"
"25701 192.168.100.6 22270"
"52003 192.168.100.6 2003"
"13691 192.168.100.7 3389"
"13025 192.168.100.8 13025"
"52005 192.168.100.6 2005"
)

2️⃣ 是否需要再次运行脚本

✅ 是的

脚本会自动:

  1. 在宿主机 rinetd.conf 添加新端口映射
  2. 放行宿主机 iptables 对应端口
  3. 通过 SSH 自动在虚拟机放行对应端口
  4. 所以每次新增端口,必须修改数组 + 重新运行脚本,才能生效。

3️⃣ 已存在端口重复运行脚本

  1. 脚本会自动检测宿主机端口是否占用
  2. SSH 也会检测虚拟机端口是否已经放行
  3. 所以重复运行不会覆盖或报错,安全可靠

4️⃣ 总结操作流程

  1. 编辑脚本,更新 PORT_MAPPINGS 数组(新增端口)
  2. 保存脚本
  3. 运行脚本:
./rinetd_auto_vm.sh

脚本会自动同步宿主机 rinetd + iptables + 虚拟机端口

文章目录