前提背景
前些天买了个Colo99刀洛杉矶杜甫。E3 1240v3+16G+500G SSD。性价比很高。美中不足的是该机器只有一个IP。想跑PVE开虚拟机,必须要涉及到NAT,开始漫长查找资料,发现了一个大佬给出的方案
参考:https://blog.csdn.net/god_sword_/article/details/128052598
做了一些修改,可以完美实现功能
大体的思路为,1.配置好NAT联网 2.iptables实现端口转发 3.配置开机自动恢复iptables配置
一、配置好NAT联网
PVE网络配置官方文档:https://pve.proxmox.com/wiki/Network_Configuration
配置桥接网卡,使Proxmox VE(PVE)可以同时创建NAT虚拟机和独立IP虚拟机,同时可以使用脚本映射NAT虚拟机的端口到外网。
1、开启ipv4、ipv6转发
vim /etc/sysctl.conf文件最后加入如下配置
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.default.forwarding=1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.eno1.autoconf=0
net.ipv6.conf.eno1.accept_ra=2
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.proxy_ndp=1
net.ipv6.conf.all.proxy_ndp=1配置Proxmox VE网卡文件信息
vim /etc/network/interfaces配置如下,我是一个单IP的杜甫,两个网口,正在使用的是eno1,后面还有个eno2,没有插网线,故不配置
auto lo
iface lo inet loopback
iface eno1 inet manual
auto vmbr0
iface vmbr0 inet static
address 198.46.xxx.xxx/30
gateway 198.46.xxx.xxx
bridge-ports eno1
bridge-stp off
bridge-fd 0
#物理网卡配置一般不做改动,系统模板都是配置好的。
#为虚拟机新建一个虚拟网桥
#内网地址,虚拟机的网关
auto vmbr1
iface vmbr1 inet static
address 192.168.1.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 echo 1 > /proc/sys/net/ipv4/conf/eno1/proxy_arp
#转发IPv4流量到虚拟机,使虚拟机与外网联通。
post-up iptables -t nat -A POSTROUTING -s '192.168.1.1/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.1.1/24' -o vmbr0 -j MASQUERADE
iface eno2 inet manual重启
sudo service networking restart3、 搭建DHCP服务器(这个我没弄)
此处使用的是ubuntu做dhcp服务器
参考地址:https://blog.csdn.net/god_sword_/article/details/128055326
二、配置端口转发
4、 内外网端口映射转发
#新增
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10022 -j DNAT --to-destination 10.10.10.100:22
#删除 (即把新增映射的-A改成-D)
iptables -t nat -D PREROUTING -p tcp -m tcp --dport 10022 -j DNAT --to-destination 10.10.10.100:22
#查看NAT规则,并显示行号
iptables -t nat --list --line-number
#删除指定行号的iptables规则
iptables -t nat -D POSTROUTING 10--------------------------------------------------------以下到分割线结尾本人没有使用,我手动敲上面的命令配的端口转发---------------------------------------------------------------
4.1 使用ufw
Linux原始的防火墙工具iptables由于过于繁琐,所以ubuntu系统默认提供了一个基于iptable之上的防火墙工具ufw。而UFW支持图形界面操作,只需在命令行运行ufw命令即能看到一系列的操作
UFW 全称为Uncomplicated Firewall,是Ubuntu 系统上默认的防火墙组件, 为了轻量化配置iptables 而开发的一款工具。 UFW 提供一个非常友好的界面用于创建基于IPV4,IPV6的防火墙规则。
Linux 2.4内核以后提供了一个非常优秀的防火墙工具:netfilter/iptables,他免费且功能强大,可以对流入、流出的信息进行细化控制,它可以 实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。
但是iptables的规则稍微有些“复杂”,因此ubuntu提供了ufw这个设定工具,以简化iptables的某些设定,其后台仍然是 iptables。ufw 即uncomplicated firewall的简称,
参考地址:https://blog.csdn.net/god_sword_/article/details/128088728
4.2 使用iptables
端口映射可以使用iptables来完整,已经有大佬写了方便的脚本;
脚本名称 iptables.sh
#! /bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
#ConfFile
iptablesconf='/root/iptables.config.sh'
function rootness(){
if [[ $EUID -ne 0 ]]; then
echo "脚本需要以ROOT权限运行!"
exit 1
fi
}
function conf_list(){
cat $iptablesconf
}
function conf_add(){
if [ ! -f $iptablesconf ];then
echo "找不到配置文件!"
exit 1
fi
echo "请输入虚拟机的内网IP"
read -p "(Default: Exit):" confvmip
[ -z "$confvmip" ] && exit 1
echo
echo "虚拟机内网IP = $confvmip"
echo
while true
do
echo "请输入虚拟机的端口:"
read -p "(默认端口: 22):" confvmport
[ -z "$confvmport" ] && confvmport="22"
expr $confvmport + 0 &>/dev/null
if [ $? -eq 0 ]; then
if [ $confvmport -ge 1 ] && [ $confvmport -le 65535 ]; then
echo
echo "虚拟机端口 = $confvmport"
echo
break
else
echo "输入错误,端口范围应为1-65535!"
fi
else
echo "输入错误,端口范围应为1-65535!"
fi
done
echo
while true
do
echo "请输入宿主机的端口"
read -p "(默认端口: 8899):" natconfport
[ -z "$natconfport" ] && natconfport="8899"
expr $natconfport + 0 &>/dev/null
if [ $? -eq 0 ]; then
if [ $natconfport -ge 1 ] && [ $natconfport -le 65535 ]; then
echo
echo "宿主机端口 = $natconfport"
echo
break
else
echo "输入错误,端口范围应为1-65535!"
fi
else
echo "输入错误,端口范围应为1-65535!"
fi
done
echo "请输入转发协议:"
read -p "(tcp 或者 udp ,回车默认操作: 退出):" conftype
[ -z "$conftype" ] && exit 1
echo
echo "协议类型 = $conftype"
echo
iptablesshell="iptables -t nat -A PREROUTING -i vmbr0 -p $conftype --dport $natconfport -j DNAT --to-destination $confvmip:$confvmport"
if [ `grep -c "$iptablesshell" $iptablesconf` != '0' ]; then
echo "配置已经存在"
exit 1
fi
get_char(){
SAVEDSTTY=`stty -g`
stty -echo
stty cbreak
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}
echo
echo "回车继续,Ctrl+C退出脚本"
char=`get_char`
echo $iptablesshell >> $iptablesconf
runreturn=`$iptablesshell`
echo $runreturn
echo '配置添加成功'
}
function add_confs(){
rootness
conf_add
}
function del_conf(){
echo
while true
do
echo "请输入宿主机的端口"
read -p "(默认操作: 退出):" confserverport
[ -z "$confserverport" ] && exit 1
expr $confserverport + 0 &>/dev/null
if [ $? -eq 0 ]; then
if [ $confserverport -ge 1 ] && [ $confserverport -le 65535 ]; then
echo
echo "宿主机端口 = $confserverport"
echo
break
else
echo "输入错误,端口范围应为1-65535!"
fi
else
echo "输入错误,端口范围应为1-65535!"
fi
done
echo
iptablesshelldel=`cat $iptablesconf | grep "dport $confserverport"`
if [ ! -n "$iptablesshelldel" ]; then
echo "配置文件中没有该宿主机的端口"
exit 1
fi
iptablesshelldelshell=`echo ${iptablesshelldel//-A/-D}`
runreturn=`$iptablesshelldelshell`
echo $runreturn
sed -i "/$iptablesshelldel/d" $iptablesconf
echo '配置删除成功'
}
function del_confs(){
printf "你确定要删除配置吗?操作是不可逆的(y/n) "
printf "\n"
read -p "(默认: n):" answer
if [ -z $answer ]; then
answer="n"
fi
if [ "$answer" = "y" ]; then
rootness
del_conf
else
echo "配置删除操作取消"
fi
}
action=$1
case "$action" in
add)
add_confs
;;
list)
conf_list
;;
del)
del_confs
;;
*)
echo "参数错误! [${action} ]"
echo "用法: `basename $0` {add|list|del}"
;;
esac脚本配置文件
名称 iptables.config.sh
#!/usr/bin/env bash上传iptables.sh和iptables.config.sh 脚本到宿主机root目录,或者直接在root目录下创建
赋予iptables.config.sh可执行权限
xxx自行更改,为配置文件的路径
chmod +x /xxx/iptables.config.sh在 iptables.sh目录下执行一下命令根据提示进行添加或删除端口映射
#添加端口映射
bash iptables.sh add
#删除端口映射
bash iptables.sh del 4.3 使用brook 进行统一控制
这样,访问服务器10022端口就会自动转发到虚拟机10.10.10.100的22端口上,实现了外网通过ssh登陆虚拟机的目的。但是,这样做有一个问题,ProxmoxVE自带防火墙,iptables开放22端口,相当于在防火墙上面开了一个洞,而且这个洞不受防火墙的控制,如果需要做安全防护,你还需要单独配置iptables,不是很方便。于是想到一个折中办法,用brook做端口转发,同时利用ProxmoxVE的防火墙进行统一控制。
获取brook,项目地址
#version 版本
wget -O /root/brook https://github.com/txthinking/brook/releases/download/{version}/brook/brook_linux_xxx
wget -O /root/brook https://github.com/txthinking/brook/releases/download/v20221212/brook_linux_amd64将brook移动到你想要放的地方
赋予执行权限
brook路径 需要自行修改
chmod +x /brook路径/brook启动端口转发 from 宿主机端口。to 虚拟机的ip+端口
#前台运行退出终端及结束转发
nohup /root/brook relay --from :10022 --to 10.10.10.100:22
#设置为后台运行
nohup /root/brook relay --from :10022 --to 10.10.10.100:22 > output 2>&1 &
利用命令ps -ef|grep brook来查看转发是否生效,同时在ProxmoxVE防火墙中开放或者关闭10022端口来控制外网对虚拟机的访问。
KVM虚拟机的配置是类似的,创建时选择桥接vmbr0,不论安装的是Linux系统还是windows系统,都需要手动输入IPv4和IPv地址,同时在主机配置IPv6信息和添加端口转发。
若想实现开机自动启动端口映射,可以将上边命令写成shell脚本,并加入系统守护进程,写成service服务。
brook开机自动执行端口转发命令
创建brookforward.sh
vim /root/brookforward.sh写入以下命令
#! /bin/sh
nohup /root/brook relay --from :10022 --to 10.10.10.100:22 > output 2>&1赋予brookforward.sh执行权限
chmod +x brookforward.sh!!! 注意若要使用systemD 将brookforward.sh实现开机自启动,以及服务自启。在.sh文件中nohup命令不能在最后加上&,让nohup命令保持后台运行,加上了该brookforward.service将会启动失败。
创建 SystemD service 配文件
vim /etc/systemd/system/brookforward.service写入以下信息
# /etc/systemd/system/brookforward.service
[Unit]
Description=brookforward
After=syslog.target
After=network.target
[Service]
Type=simple
ExecStart=/root/brookforward.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetReload SystemD 以加载新的配置文件:
systemctl daemon-reload启动 brookforward 服务并设置开机自启:
systemctl enable --now brookforward查看运行状态:
systemctl status brookforward实现开机自启还可以将上边的brookforward.sh文件写入/etc/rc.local中,进行开机启动,但是不能实现服务自动重启。
实现开机自启和服务自动重启还可以借助supervisor, Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。有需要可以自行研究,参考
以下操作因为没有开启ipv6,没有实操,仅供给有需要的参考
这样,一个同时开启了NAT和IPv6的虚拟机就创建好了,但是,还有个问题,IPv6的配置和端口转发是会随着主机重启而失效,我们需要在主机上启动开机自启服务,保证每次开机的时候,虚拟机器都能正常工作。
需要在PVE中开启开机自启服务,创建/etc/rc.local。
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
exit 0赋予执行权限
chmod +x /etc/rc.local启动服务
systemctl start rc-local这样,我们只需要将需要执行的命令写在/etc/rc.local的exit 0前面,就可以在开机后自动执行。
-----------------------------------------------------分割线-------------------------------------------------------
三、母鸡iptables重启恢复
如上操作完成之后,母鸡重启后,iptables配置会全部丢失,进行如下设置配置持久化
使用iptables保存机制
在设置好了iptables规则后,下次重启后还是会被清除,所以我们需要把它保存起来,使用
iptables-save 命令来进行备份。
保存现有iptables规则到 /etc/iptables-rules
iptables-save > /etc/iptables-rules重启后恢复iptables规则
修改网卡文件,当网卡重启的时候自动执行恢复命令
nano /etc/network/interfaces找到vmbr1的那一节,在最后载入恢复命令
pre-up iptables-restore < /etc/iptables-rules配置文件整体如下:
auto lo
iface lo inet loopback
iface eno1 inet manual
auto vmbr0
iface vmbr0 inet static
address 198.46.147.254/30
gateway 198.46.147.253
bridge-ports eno1
bridge-stp off
bridge-fd 0
#物理网卡配置一般不做改动,系统模板都是配置好的。
#为虚拟机新建一个虚拟网桥
#内网地址,虚拟机的网关
auto vmbr1
iface vmbr1 inet static
address 192.168.1.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 echo 1 > /proc/sys/net/ipv4/conf/eno1/proxy_arp
#转发IPv4流量到虚拟机,使虚拟机与外网联通。
post-up iptables -t nat -A POSTROUTING -s '192.168.1.1/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.1.1/24' -o vmbr0 -j MASQUERADE
iface eno2 inet manual查看备份规则
cat /etc/iptables-rules清理当前iptables规则,⚠️ 注意要在已经备份完成的时候进行删除
iptables -F
iptables -X
iptables -Z
iptables重启当前主机,看会不会重置规则
iptables -L -n --line-numbersiptables的规则会在重启或者开机的时候,会自动载入规则,新增iptables规则后建议也执行
iptables-save > /etc/iptables-rules
果博东方客服开户联系方式【182-8836-2750—】?薇- cxs20250806】
果博东方公司客服电话联系方式【182-8836-2750—】?薇- cxs20250806】
果博东方开户流程【182-8836-2750—】?薇- cxs20250806】
果博东方客服怎么联系【182-8836-2750—】?薇- cxs20250806】