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

这篇具有很好参考价值的文章主要介绍了Proxmox VE 网络配置 NAT共享IP 端口映射iptables、brook。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PVE网络配置官方文档:跳转

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

此处使用的是ubuntu做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

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

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的简称,
参考地址

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 &

proxmox ve 网络配置,Proxmox VE,网络,tcp/ip,linux
利用命令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

proxmox ve 网络配置,Proxmox VE,网络,tcp/ip,linux

实现开机自启还可以将上边的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前面,就可以在开机后自动执行。

参考

Proxmox VE同时配置NAT共享IP和独立IP虚拟机

PVE服务器网络配置

单IP服务器利用ProxmoxVE建立IPv4-NAT和IPv6虚拟机

brook安装使用参考文章来源地址https://www.toymoban.com/news/detail-829866.html

到了这里,关于Proxmox VE 网络配置 NAT共享IP 端口映射iptables、brook的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 核心网络技巧:一键学会如何使用NAT实现端口映射

    数据来源 1、ipv4地址严重不够用了         X.X.X.X X 0-255     A、B、C类可以使用    D组播     E科研 2、IP地址分为 公网IP 和私网 IP 公网IP只能在公网上使用 私网IP只能在内网中使用 公网上不允许出现私有IP地址 私网IP可以重复在内网使用         1)私有地址范围  

    2024年02月14日
    浏览(45)
  • 基于静态NAT的中小企业服务器网络端口映射与实现(完整文档+思科拓扑图)

    大家好,我是小华学长,一名计算机领域的博主。经过多年的学习和实践,我积累了丰富的计算机知识和经验,在这里我想与大家分享我的学习心得和技巧,帮助你成为更好的程序员。 作为一名计算机博主,我一直专注于编程、算法、软件开发等领域,在这些方面积累了大量

    2024年02月04日
    浏览(52)
  • iptables实现docker容器动态端口映射实操

    之前在《Docker 动态修改容器端口映射的方法》一文中,说明了如何使用修改配置和加防火墙规则实现动态端口映射。但是没有具体分享加防火墙实现动态端口映射的实际案例。今天就分享一下实际操作案例,供大家参考。 动态端口映射的用途 容器端口的动态映射,是用于实

    2024年04月25日
    浏览(43)
  • 华为eNSP:静态NAT、动态NAT、端口NAT的配置(NAPT)-网络地址转换

    一、拓扑图  二、路由器的配置 1、配置端口IP AP1: AP2: 2、静态NAT的配置 方法一:在全局下配置nat 方法二:直接在接口下配置nat 三、测试 未配置静态NAT前,PC1无法ping通外网  配置静态nat后,PC1可以ping通外网 可以看到抓包到地址1.1.1.2转换为1.1.1.10   因为只配置了192.168.1.1地

    2024年02月02日
    浏览(42)
  • 新手小白安装aio小主机布置家庭网络-3-proxmox-ve安装pvetools工具换源+去除订阅

    ivanhao大神的pvetools工具 https://github.com/ivanhao/pvetools 一键无脑安装: 后期进入pvetools工具  命令

    2024年02月07日
    浏览(57)
  • iptables、共享上网SNAT、端口转发DNAT

    封端⼝,封ip 实现NAT功能 共享上⽹ 端⼝映射(端⼝转发),ip映射 硬件:整个企业入口 软件:开源软件 网站内部 封ip iptables 云防火墙 安全组 NAT网关 waf应用防火墙 容器、表、链、规则 1.防⽕墙是 层层过滤 的,实际是按照配置规则的 顺序从上到下 ,从前到后进⾏过滤的。 2.如

    2024年02月10日
    浏览(36)
  • 【云原生】k8s 前置环境 网络配置 VMware Linux共享上网(iptables forward)

    本文介绍了如何使用 Linux iptalbes 来使其他内网主机进行上网。 解释说明:一般情况下,VMware安装好后会出现两张网卡,vmnet1 与 vmnet8 。其中vmnet1 为仅主机模式(虚拟机之间可通信,虚拟机与宿主机可通信,不能上网);vmnet8 为 NAT 模式(虚拟机之间可通信,虚拟机与宿主机

    2024年02月21日
    浏览(55)
  • 新手小白安装aio小主机布置家庭网络-4-proxmox-ve安装LXC、pve创建ct容器安装docker。

    PVE是使用Debian系统作为底层。我们创建Debian LXC容器。 下载Debian11DE  ct模板 创建CT,一定把无特权容器前面的勾去掉。我们需要一个特权的容器。勾选嵌套。完成后不要启动! 。 开启ct102容器前,进入pve shell 设置ct102容器设置 添加代码 ctrl+x保存配置,y确认,回车。

    2024年02月15日
    浏览(48)
  • iptables修改目的IP和端口

    iptables NAT表的OUTPUT链用于对由本机发起的数据包进行目标IP地址和端口号的修改。DNAT指令可以用于将数据包的目标IP地址和端口号替换为指定的IP地址和端口号。在OUTPUT链中使用DNAT指令可以实现对本机发送的数据包进行目标地址的转换,将数据包发送至指定的目标地址。用法

    2024年02月05日
    浏览(46)
  • iptables指定ip访问指定端口

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包