0%

PVE下通过Openwrt实现FULLCONE NAT(NAT1类型)

将一个公网IP下的局域网设备发送的数据包转换成自身的数据包进行发送
然后再把收到的数据包还给发送请求的局域网设备
这就是NAT(网络地址转换)

NAT类型

那么知道了什么是nat那么为什么nat还分成好几种类型呢?
这是因为出于安全考虑,nat类型越封闭(nat类型越低)你的计算机越安全,
甚至在Windows上,就算你外面是公网地址,出于安全考虑防火墙都能把你的nat类型降低不少

NAT一共分为2大类

  • 第一类是克隆(cone)类型,而克隆又分成
    全克隆(Full Cone)
    ip地址限制型(AddressRestricted Cone)
    端口限制型(Port Restricted Cone)
  • 第二类是对称(Symmetric)类型

而nat类型大多数情况下由网络拓扑直接决定,如果是运营商的网络拓扑比较好的话就能直接享受比较好的起点,但是如果网络运营商的网络拓扑比较差并且拒绝变动的情况下,那么短板效应将直接影响nat类型。
简单来说就是你的上级路由越少,你的网络拓扑越短,nat类型也相对也就越高,为什么用相对呢?
因为你的路由设置也将决定你的nat类型。

而为什么我们这么在意nat类型?
因为nat类型间接反应了我们的网络质量,nat类型越高,网络质量相对也就越好,越稳定,对于P2P下载用户,PS4、XBOX用户,以及玩联机游戏的用户等等,nat类型则显得尤为重要。

这里都是我个人的理解,如果有什么说错的地方还请大佬们留言指正,我会随时查看~

PVE(Proxmox Virtual Environment)

Proxmox Virtual Environment是一种基于QEMU/KVM和LXC的开源服务器虚拟化管理解决方案。您可以使用集成的,易于使用的Web界面或CLI管理虚拟机,容器,高可用性群集,存储和网络。
这里就不过多介绍了,可以直接理解成系统级的虚拟机程序,这里还分为全虚拟化、半虚拟化、准虚拟化,不过多解释了,如果感兴趣的可以自行 百度 Google哦。

PVE安装Openwrt x86

Openwrt不过多介绍了,可以理解成一个路由器定制Linux系统
这篇文章介绍如何在PVE下安装Openwrt,并实现NAT1类型

通过VM安装PVE

没错。。。你没有看错,环境是Windows10安装了VM之后继续安装了PVE。。。。
没办法,我身边只有一台电脑,又不可能为了一个演示重做系统,所有就采用了这种嵌套虚拟化的方法啦~

下面我先给出VM的网络配置图
注意:这里你需要将VMnet1的 使用本地DHCP服务将IP地址分配给虚拟机 项取消勾选,因为这个网络接口是作为LAN口给Openwrt的,由Openwrt来提供DHCP服务。

VM

继续上VM里PVE虚拟机的设置
这里添加了两个网络适配器,VMnet0作为Openwrt的WAN口,VMnet1作为LAN口,给宿主机也就是windows10和PVE下其他的虚拟机来提供局域网。

PVE

安装没什么可说的,这里只需要注意的是访问pve的管理页需要输入完整的网址,比如我这里是
https://192.168.1.159:8006
https和端口号8006都是不可少的。

继续给出PVE的网络设置,这里你需要新建一个Linux Bridge,用以连接你的Openwrt和其他虚拟机
注意下,这里的vmbr0是PVE默认生成的,而vmbr1是我手动添加的,桥接端口务必是你的LAN口,作为区分你可以在备注里添加LAN标识。
这里我还给这个LAN网桥设置了IP地址和子网掩码,因为如果你丢失了上级路由的连接,也可以通过Openwrt的网段来连接PVE。
这意味这,你可以在PVE或者PVE下的虚拟机内只要是和PVE同一网段,来通过使用frp来连接PVE甚至是Openwrt。

PVE-network

这里如果你刚创建一个新的网络设备,比如我的vmbr1(LAN)网桥那么你需要重启一次PVE,因为网络设备的更改需要重启来生效,否则在接下来的Openwrt创建中,你将得到无法启动Openwrt的错误。

接着下载已经编译好并开启Turbo ACC的Openwrt-x86
两种方法实现:

  • PVE默认是开启ssh的,可以通过网页上的shell或者其他方式通过ssh连接到PVE的shell并运行下列命令
    1
    2
    wget https://blog.lpxin.com/temp/Openwrt-x86.img.gz
    gzip -d Openwrt-x86.img.gz
  • 点击下载Openwrt-x86.img.gz,通过scp命令上传到你的PVE /root路径下
    1
    2
    cd /root
    gzip -d Openwrt-x86.img.gz
    现在我们已经获得了Openwrt磁盘文件,接下来我们来创建一个Openwrt虚拟机

    登录PVE管理系统

使用浏览器访问 https://youripaddress:8006 并登录PVE管理界面。其中“youripaddress”是在安装PVE时设定的PVE管理接口的IP地址。

创建虚拟机

登录后,点击右上方的“创建虚拟机”即可开始创建OW/LEDE使用的KVM虚拟机。当然,也可以通过浏览器左侧栏的“数据中心”选择“PVE节点”再通过鼠标右键菜单中的“创建虚拟机”来开始创建。

随后会出现创建虚拟机的配置向导,按照该向导提示逐步地进行设置即可完成虚拟机的创建,主要过程如下:

  1. 节点:

此选项选择要创建虚拟机的物理主机,即在已安装有PVE主机中选择一个节点来创建VM,节点名称已在安装过程中指定。通常情况下只有一个已安装好的默认节点可以选择,且已经选上。

  1. VM ID:

此选项设置要创建的虚拟机的ID,在PVE中,VM ID用大于100的数字来标识,且配置文件及所属的设备名称中都会以此ID来命名。

尽管此ID可以随意设置,但我还是建议你制定个命名规则,它可以按照VM类型、OS类型、重要性、用途或喜好来分类,当节点中有多个VM同时存在时会VM列表的排序会显示得更加清晰、友好。

如果没什么特别的需求那么默认就好。

  1. 名称:

此选项指定要创建的KVM虚拟机的名称,需要用连续的字符串来表示,比如“Openwrt”,它会用括号的形式附在VM的ID后面,可以更具体地表示VM。

VM名称可以在VM创建完成后在其选项中进行修改。

  1. 资源池:

资源池是一组逻辑VM或存储的组合,仅在PVE节点中已创建好时才可以进行选择。

操作系统

  1. CD/DVD

因为这里我们是使用的磁盘映像文件,不需要安装介质,所以我们选 不使用任何介质

  1. 访客OS

在此处选择VM的OS类型,PVE主要支持两大类型的OS:Windows和Linux。

Openwrt是Linux操作系统,当前的内核版本均为为4.x,其中17.01.x的内核版本为4.4,trunk的内核版本为4.9,故这里应选择“Linux/其他OS类型”中的“Linux 4.X/3.X/2.6 Kernel”。

系统

  1. 显卡
    默认即可

  2. SCSI控制器
    默认即可

  3. Qemu代理
    不用勾选,默认即可

  • 硬盘

在此处设置VM的硬盘各项参数,包括总线/设备、存储位置、容量大小、缓存方式、是否备份、IO线程等。

由于Openwrt通常用编译好的固件文件来创建磁盘文件系统,并不需要在这里指定硬盘参数,然而在向导模式下又不支持取消硬盘设置,故可以先使用其默认设置以便完成后面的设置,在VM创建完成后再删除此处添加的磁盘。

CPU

在此处设置VM的CPU的相关参数,包括插槽及核心数量、NUMA架构支持和类别选择。

x86的运算能力远远超过了普通家用路由器使用的MIPS、ARM处理器,但其主要服务对象为PC平台,对于路由器系统而言,x86并没有常规路由器那样具有全方位优化的专门设计,但即使这样,路由器上使用普通的单核x86处理器也还是性能过剩,故x86处理器选择单核心的配置即足以满足普通家用环境的日常使用需求,这种情况下Sockets和核数选择默认设置的“1”即可,当然,我们有可能需要带很多的设备,这样的话对于计算需求也会较高,可以多分配几个核心。

PVE下VM的CPU类别默认选择为“kvm64”,以方便虚拟机在不同的物理主机节点之间进行迁移,但我们通常并不需要这样操作OW/LEDE,故建议选择跟物理主机相同的CPU类型即“host”,以获得最佳的硬件特性匹配。

内存

内存设置可以选择两种方式:固定大小和在指定范围内自动分配,此处保持默认即可,通常512MB的默认值足以满足普通家庭环境的需要,若你的内存容量很充裕或者运行了一些比较消耗内存的应用,可以视情况增大内存设置。

网络

做为路由器设备,必须有两个以上的接口才能实现接口间数据转发功能。

PVE虚拟机的网卡与主机网络的连接方式有桥接模式、NAT模式和无网络模式三种,Openwrt虚拟机应选择“桥接模式”来创建LAN和WAN,并分别桥接到物理主机的“vmbr0”和“vmbr1”上,若需要DMZ还可以创建另外的“vmbr2”。

注意:这里我们需要将桥接选择在vmbr1上,因为Openwrt默认使用第一个网络接口为LAN口,如果这里你使用的是vmbr0(WAN)上,那么你启动Openwrt后得到的网关将和你的上级路由网关相同!

PVE虚拟机可使用的网卡模型(模拟的网卡类型)有Intel E1000、VirtIO(半虚拟化)、Realtek RTL8139和VMware vmxnet3四种。建议选用默认的VirtIO(半虚拟化),其性能和效率在KVM中最高。如果你需要使用的是高恪固件,那么这里只能选Intel E1000,因为其他模型高恪不识别,包括在ESXI上也是一样。

因为我们需要实现FULLCONE NAT,所以防火墙这里请取消勾选。

另外,网络设置还有MAC地址、速率限制(MB/s)、和Disconnect(断开连接)等选项,在无特殊需求的情况下保持默认值即可。

确认

在此步骤中,将列出前面所有已设置的选项参数以供检查和确认,若发现有问题可以返回到前面相关的设置选项中修改,确认没有问题后可以点击“完成”来结束整个创建虚拟机的过程。

这里创建后启动不需要勾选,默认也是不勾选,因为我们需要把下载的磁盘文件加入到VM中。

添加LAN口

刚刚我们已经创建了一个Openwrt虚拟机,请点击到刚刚创建的虚拟机,选择硬件-添加-网络设备

  • 添加网络设备
  1. 桥接-vmbr0(也就是我们创建的网桥WAN)

  2. 模型-VirtlO(半虚拟化)

  3. 防火墙-请取消勾选!

  4. 点击添加

删除默认添加的磁盘

选择硬盘(scsi0) local-lvm:vm-100-disk-0,size=32G #如果你是和我一样默认添加的化应该和我是一样的,不是的话请自行确认硬盘。
上方点击分离
“你确定要分离该项’硬盘 (scsi0)’吗?”
请选择“是”
接着硬盘(scsi0)已经没有了,出现了一个未使用的磁盘0,我们接着选择这个未使用的磁盘0,点击上方的删除
“你确定你要删除该项’未使用的磁盘 0’吗? 这将永久删除所有数据。”
请选择“是”
这样我们默认添加的磁盘正式删除了。

上传Openwrt磁盘文件

我们进入PVE的shell中

1
2
3
cd /root
qemu-img convert -f raw -O qcow2 Openwrt-x86.img vm-100-disk-1.qcow2 #将Openwrt磁盘文件转换为qcow2格式
qm importdisk 100 vm-100-disk-1.qcow2 local-lvm #将转换后的Openwrt磁盘文件导入VM的存储中

加载添加的Openwrt磁盘文件

回到PVE的网络管理界面,这时候你会发现又出现了一个新的 未使用的磁盘0,请双击它
添加:未使用的磁盘 点击添加
假设你所以的操作都和我一样,那么你将会得到如下和我类似的界面

启动Openwrt虚拟机

继续点击启动,这个时候下方的控制台应该会打印VM xxx - 启动 状态 OK的信息
接着点击控制台,你将会看到Openwrt的启动过程,当它停止滚动的时候,不要以为它卡住了!
它其实已经启动完成了,请你将鼠标定向到Openwrt控制台,并按下回车,你会发现你得到了Openwrt的shell!

设置网段

使用ifconfig命令你可以得到Openwrt的网关地址,如果界面太小你看不到br-lan的地址,那么你可以使用下面的命令
ifconfig | head -n 20
Openwrt默认的网关是192.168.1.1,如果和你的上级路由网关冲突了,那么你还需要修改br-lan的地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vi /etc/config/network

找到config interface 'lan'这段
将下面的
ipaddr '192.168.1.1'
修改为
ipaddr '192.168.10.1'
这里Openwrt的网段你可以自己指定,其他都不需要修改 :wq 保存退出即可。


/etc/init.d/network restart #重启网络

ifconfig | head -n 20

#你会发现br-lan的ip已经变成了你指定的网段

进入Openwrt后台

接着在浏览器里输入Openwrt的IP地址,因为我这里是使用的是VM虚拟机,所以我这里不得不进入系统的网络连接
将VMnet1的IPv4地址指定为Openwrt的网段,请看下图

不好意思,我发现已经通过DHCP自动分配了IP地址,不用我再手动指定网段啦,如果你是高恪,那么你这里可能不得不自己手动指定一下IP。

注意:这里Openwrt的密码是password

设置宽带信息

到了这里就可以修改Openwrt的WAN口协议为PPPoE - 切换协议
输入你的宽带账号和密码后 点击 保存&应用
Openwrt的设置也就结束了,不需要再设置其他项了

测试NAT类型

这里Openwrt的Turbo ACC是默认开启的,不用设置,默认就好。
如果你需要UPnP,那么你可以在
服务-UPnP内打开。

给出一个测试NAT类型的网站:
http://cc.rtmfp.net/
注意,这个测试需要Flash的支持,建议使用Chrome或者Firefox浏览器,因为目前这两个浏览器还内置Flash,其他例如Edge、IE、360、QQ浏览器好像都已经没有Flash支持了。

下面放出一张我这里测试的截图,注意:如果你是在Windows下测试的,那么请关闭你的所有网络防火墙,因为这会降低你的nat类型

net

如果你测试的结果和我一样,那么表示你的nat类型已经是FULLCONE NAT。

PVE下所有虚拟机实现FULLCONE NAT

估计这一步很多人都不用看就已经知道该怎么操作了
想让PVE创建的每个虚拟机实现FULLCONE NAT,只需要在创建虚拟机的时候网络设备选择vmbr1(LAN)并取消勾选防火墙即可。
如果你是想让虚拟机下的LXD容器实现FULLCONE NAT,也没有什么值得注意的地方,只要跟着我的这篇教程,让LXD init时不创建默认的网桥,而是通过自定义的网桥br0即可

重新编译Openwrt

如果你想修改你的路由器系统来通过硬路由实现FULLCONE NAT,那么你可能需要重新编译Openwrt,这里给出github上openwrt的源码(包括Turbo ACC 网络加速模块,默认是FULLCONE NAT),你可以根据你的需求来修改编译项,因为每个路由器的cpu不同,无法做到一个固件全部适应,并且你可能还需要一个对应你路由器型号的不死固件底包。

写的比较乱,请见谅,我这里因为是演示所以是通过Windows10->VM->PVE->Openwrt来给Windows10实现FULLCONE NAT,你在实际操作中肯定与我的环境不同,请根据你的具体环境来操作。
如果有什么不对,或者你不理解的地方请留言,我会随时查看,感谢你的支持,请多多关注~

end