Proxmox VE 网络配置 NAT共享IP 端口映射iptables、brook

配置桥接网卡,使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

2、 配置Proxmox VE网卡文件信息

vim /etc/network/interfaces

新增一个vmbr172网桥,并设置流量转发

auto lo
iface lo inet loopback

iface enp40 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.0.103/24
        gateway 192.168.0.1
        bridge-ports enp40
        bridge-stp off
        bridge-fd 0

#物理网卡配置一般不做改动,系统模板都是配置好的。
#为虚拟机新建一个虚拟网桥
#内网地址,虚拟机的网关
auto vmbr172          
iface vmbr172 inet static
        address  172.16.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 '172.16.1.0/16' -o vmbr0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '172.16.1.0/16' -o vmbr0 -j MASQUERADE

重启

sudo service networking restart

3、 搭建DHCP服务器

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

Pv4是经过内网转发的,所以现在只可以访问外网,而外网却无法访问虚拟机。所以我们需要配置端口转发,将外部的访问转发到虚拟机。一般的做法是通过iptables进行转发。

4.1 使用iptables

#! /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.target

Reload SystemD 以加载新的配置文件:

systemctl daemon-reload

启动 brookforward 服务并设置开机自启:

systemctl enable --now brookforward

查看运行状态:

systemctl status brookforward

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/9431

(0)
郭靖的头像郭靖
上一篇 2023年8月2日 下午4:27
下一篇 2023年8月3日 上午11:34

相关推荐

  • 使用Dockerfile创建镜像,创建容器并运行

    一般情况下并不推荐使用“docker commit”来构建镜像,而应该使用更灵活、更强大的Dockerfile来构建Docker镜像,这里就来说一下使用Dockerfile创建镜像,创建容器并运行的方法。 1 生成镜像1.1 准备Dockerfile文件准备Dockerfile文件内容如下: 由于创建过程用到了java文件,这里要将注意这里要将java文件和…

    2023年8月10日
    53900
  • 局域网IP地址冲突、环路的罪魁祸首是什么?

    中午好,我的网工朋友。 这个时代,网络已经贯穿了人们的生活,对企业而言,办公信息化更是离不开网络支持。 为了提高安全管理和信息化水平,很多企业都建立了完善的办公信息系统,但一些企业在网络建设方面还是会有各种问题存在。 比如说,由于缺乏全面规划,或在选择网络产品时考虑不够周全,导致网络建设未能达到预期效果,随后出现了许多应用问题。 这些问题可能包括网络漏洞,导…

    2024年1月9日
    34900
  • Linux系统VPS云服务器网络速度性能测试一键脚本分享

    收集的一些常用的测试脚本部分经过实际测试,基本可以正常使用,关于脚本测试出来数据的准确性,需要自行甄别,仅供参考。 本站所收集的一键脚本均来自网络,不对其收集的脚本负责,请注意保管并备份资料,建议多尝试几个脚本进行测试。 附件下载测试 秋水逸冰硬件信息/带宽测试 测试VPS基础信息,以及下载速度,来自秋水逸冰:https://bench.sh/ 老鬼硬件信息…

    2022年6月8日
    2.2K00
  • 路由表详解

    1、路由表图解 2、路由表参数详解 1)destination/mask:表示此路由的目的网络地址与网络掩码。将目的地址和子网掩码“逻辑与”后可得到目的主机或路由器所在网段的地址。例如:目的地址为1.1.1.1,掩码为255.255.255.0的主机或路由器所在网段的地址为1.1.1.0。 2)Proto(Protocol):该路由的协议类型,也即路由器是通…

    2024年6月21日
    66800
  • 华为交换机恢复出厂设置的方法

    常用的三种恢复出厂配置的方法:长按PNP键恢复出厂配置、一键式恢复出厂配置,以及通过清空配置文件来恢复出厂配置。 1、长按PNP键恢复出厂配置 对于支持PNP键的设备,用户可通过长按(6秒以上)PNP键,使设备恢复出厂配置并自动重新启动。PNP键如下图所示。 2、一键式恢复出厂配置 在用户视图下,执行命令reset factory-configuration…

    2023年5月8日
    99100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信