Pve独服单ip开小鸡自动获取nat地址,并将小鸡端口转发到公网ip的端口
步骤
配置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️⃣ 是否需要再次运行脚本
✅ 是的
脚本会自动:
- 在宿主机 rinetd.conf 添加新端口映射
- 放行宿主机 iptables 对应端口
- 通过 SSH 自动在虚拟机放行对应端口
- 所以每次新增端口,必须修改数组 + 重新运行脚本,才能生效。
3️⃣ 已存在端口重复运行脚本
- 脚本会自动检测宿主机端口是否占用
- SSH 也会检测虚拟机端口是否已经放行
- 所以重复运行不会覆盖或报错,安全可靠
4️⃣ 总结操作流程
- 编辑脚本,更新
PORT_MAPPINGS
数组(新增端口) - 保存脚本
- 运行脚本:
./rinetd_auto_vm.sh
脚本会自动同步宿主机 rinetd + iptables + 虚拟机端口
文章目录