因为开发的JAVA项目吃掉的内存越来越多,16G的拯救者y9000p 2022款实属力不从心,于是购入单根32G DDR5 4800Mhz,现在我的笔记本是8 + 32的内存组合,也就是40G可用空间!

所以笔者心血来潮,决定在笔记本部署VMware搭建虚拟机集群,为之后毕设做分布式系统做准备,本篇笔记将会对如何在VMware部署Ubuntu24进行教学

前期工作准备

安装VMware

已经有的资讯不需要我二次编辑
所以这里直接贴一下VMware对个人免费的相关资讯
文中的下载链接在图片下面有超链接

可以从文中看到VMware这款超级厉害的软件对个人免费,我们本次就是要使用这款软件的最新免费版本来进行虚拟机的部署

Workstation Pro 17.5.2 下载 (适用于 Windows 桌面上的虚拟化)
Fusion Pro 13.5.2 下载 (适用于 Mac OS 桌面上的虚拟化)

这两个链接会分别跳转到对应的官方下载页面,期间会提示需要注册一个账号才可以进行下载,这里可以选择使用网上的临时邮箱进行注册,也可以使用自己的真实邮箱,正常注册就可以,然后重新访问链接就可以进入官网下载

这里选择最新版本就可以了

之后进行安装即可

下载Ubuntu24镜像

我们直接点击下方蓝字,就可以跳转到Ubuntu官网下载镜像
点击我立即出发下载最新ubuntu镜像!
这里我们选择的是UbuntuServer版本的镜像

下面这个是桌面版本的Ubuntu,请注意分辨

我们这次要部署的是轻量的服务器版本,也就是只有命令行,没有图形化界面,之后我们会使用1Panel进行管理,自然而然就可以进行可视化操作,也会节省很多性能开销

安装虚拟机

接下来我们开始安装虚拟机的部分
请使用管理员身份打开VMware

基础配置部分

点击创建新的虚拟机

选择典型

这里选择我们刚刚下载好的Ubuntu Server,VMware会自动检测到系统

如果你不想之后C盘报红
更改镜像存储的位置

这里请配置磁盘大小,如果选择存储为单个文件,那么VMware就会一次性占用40GB的空间,如果选择拆分为多个文件,那么VMware就会在你使用的过程中逐渐的占用更多的存储

自定义硬件配置

在硬件这里我们需要选择自定义硬件,这一步很重要

内存

因为我有40G的内存,所以这里我会给虚拟机4G的运行内存,这里配置需要考虑到后期我要在虚拟机上面部署微服务,因为微服务也是需要创建JAVA环境运行Springboot编译的文件,所以我们需要将内存给的宽容一些

虚拟化引擎

在处理器配置页面请尽可能打开虚拟化引擎,这对提升虚拟机的性能有实打实的好处

1. 虚拟化 Intel VT-x

  • 解释:Intel VT-x(Intel Virtualization Technology for x86 architecture)是 Intel 提供的硬件虚拟化技术,允许虚拟机直接访问 CPU 资源,从而提高虚拟化性能。EPT(Extended Page Tables)是 Intel 的另一项技术,用于优化虚拟机内存的管理,使其更高效。

  • 启用的好处

    • 启用 VT-x 可以允许虚拟机运行 64 位操作系统。
    • 启用 EPT(扩展页面表)可以提高内存的访问效率,减少内存映射的开销,提高性能。
    • 适用于需要高性能虚拟化、尤其是运行大量 CPU 密集型任务的虚拟机(如运行大型数据库或虚拟化的操作系统)。
  • 是否启用启用,如果你的 CPU 支持 Intel VT-x,并且你希望提高虚拟机的性能,尤其是当你运行 64 位操作系统或需要高性能计算时。

2. 虚拟化 CPU 性能计数器

  • 解释:虚拟化 CPU 性能计数器允许虚拟机使用 CPU 性能计数器来跟踪和测量性能指标(如指令执行周期、缓存命中等)。如果启用此选项,虚拟机将能够访问并使用这些性能计数器,模拟底层硬件的行为。

  • 启用的好处

    • 如果你在虚拟机中运行性能分析工具或调试工具,启用此选项可以让这些工具访问 CPU 性能计数器,以便准确地进行性能分析。
  • 是否启用:如果你需要使用性能分析工具(如 Intel VTune 或其他调试工具),可以启用此选项。如果没有相关需求,通常不启用。

3. 虚拟化 IOMMU

  • 解释:IOMMU(Input-Output Memory Management Unit)是一项硬件技术,允许设备直接访问内存(例如网络卡、显卡等外部设备),并且在访问内存时进行虚拟化隔离。虚拟化 IOMMU 使虚拟机能够直接访问外部硬件设备,增强对设备的直接控制,特别是在支持设备直通(PCI passthrough)的场景下。

  • 启用的好处

    • 启用虚拟化 IOMMU 可以支持虚拟机中的设备直通(PCI passthrough),使虚拟机能够直接访问物理硬件设备(如显卡、网络适配器等)。
    • 对于高性能应用、GPU 虚拟化、或需要直接访问硬件的工作负载(如虚拟化高端显卡、网络设备等),启用此选项可以大幅提高性能。
  • 是否启用:只有在你需要将物理设备(例如 GPU、网卡等)直接分配给虚拟机时,才需要启用此选项。如果没有这类需求,通常不启用。


总结:

  • 虚拟化 Intel VT-x/EPT:启用,提高虚拟化性能,特别是对于 64 位操作系统和需要高 CPU 性能的任务。
  • 虚拟化 CPU 性能计数器:启用,只有在需要运行性能分析工具时才启用,通常不需要启用。
  • 虚拟化 IOMMU:启用,适用于需要设备直通(PCI passthrough)或直接访问硬件设备的场景。

是否启用:

  • 如果你的 CPU 和主板支持这些功能,通常 推荐启用,尤其是 Intel VT-x/EPT,因为它大大提升虚拟机的整体性能。
  • 虚拟化 CPU 性能计数器虚拟化 IOMMU 只有在特定的工作负载中(如设备直通或性能调优)才需要启用。如果不需要这类特性,通常可以不启用。

网络适配器(划重点)

在这里我要敲敲屏幕,画个重点,着重讲一下桥接模式和NAT模式的区别

什么是桥接模式和NAT模式?

我们的虚拟机需要和外界的网络设备产生通信,而我们的网络适配器允许我们选择虚拟机与外界网络设备通信的模式

这是我使用drawio绘制的网络流程图

可以清晰的看到,如果我们选择了NAT模式的网络,那么虚拟机的流量将会经过我们宿主机的网络堆栈,也会应用宿主机的系统代理来访问外界网络

而当我们使用桥接模式时,虚拟机的流量则会直接使用宿主机的物理网卡来和当前局域网的网关产生数据交互,也就不会应用当前宿主机的网络堆栈包括代理等等

如果你希望先进行实操,那么可以暂时略过下面的网络流程分析与GPT说

网络流程分析:

在我们选择了NAT模式之后,我们的VMware将会创建一个子网,在这个子网里面对虚拟机进行IP地址分配,这个子网一般是和宿主机所在的网络环境不同,是隔离开的网络环境,VMware统一管理虚拟子网里面的设备网络请求,与宿主机产生交互,宿主机再携带着这些请求与主网关交互,这就是NAT模式,在NAT模式下,虚拟机无法直接与宿主机产生交互,因为处于两个不同的子网,需要设置端口映射才行!也就是把虚拟子网里面的虚拟机的某一个端口,通过VMware转发到宿主机的真实端口上面,这样我们才可以进行访问,具体的操作我们后面会一起做,很简单的!

而当我们使用桥接模式,我们的虚拟机将会被本地局域网网关的DHCP服务分配一个全新的局域网IP地址可以直接和局域网内的设备沟通交流,非常的方便,这是通过将请求直接给宿主机的物理网卡,让其转发请求到主网关实现的,如果我们需要连接到处于桥接模式的虚拟机,只需要使用ip+端口就可以啦!非常非常方便,是我喜欢的方式

GPT说

这里为了方便读者了解具体的原理,我让GPT从OSI网络模型的角度详细的讲解了一下两种网络模式的实现,作为可选读物

在虚拟化技术中,NAT(Network Address Translation)模式和桥接模式是两种常见的网络连接方式,它们在虚拟机的网络访问、通信方式及与物理主机的关系上有所不同。为了更好地理解它们对虚拟机的影响,可以从OSI(开放系统互联)模型的角度出发,分析它们在不同层次上的区别。

1. OSI模型简述

OSI模型是一个分层的网络协议模型,包括七个层次,从底层到顶层依次为:

  1. 物理层:负责数据的物理传输。
  2. 数据链路层:负责节点之间的数据传输和帧的组织。
  3. 网络层:负责路由选择和逻辑地址(IP地址)的分配。
  4. 传输层:负责端到端的通信和数据传输的可靠性。
  5. 会话层:管理应用之间的会话。
  6. 表示层:处理数据的格式化和加密。
  7. 应用层:直接与应用程序交互。
2. NAT模式与桥接模式的基本区别
  • NAT模式(网络地址转换):虚拟机通过主机的网络接口与外界通信,主机作为“网关”提供网络连接。虚拟机的IP地址是一个私有IP(通常是内网地址),外部网络访问虚拟机时,需要通过主机的公网IP和NAT进行地址转换。

  • 桥接模式:虚拟机直接连接到物理主机的网络接口,虚拟机的网络配置与物理网络一致。虚拟机获取的是与主机同一网络段的IP地址,可以像物理机器一样直接与其他设备进行通信。

3. NAT模式与桥接模式对虚拟机的影响

(1)物理层(Layer 1)和数据链路层(Layer 2)

  • NAT模式
    • 虚拟机和物理网络之间存在间接通信,虚拟机的MAC地址不会直接暴露在物理网络中。
    • 虚拟机只能通过主机的网络接口与外界通信,网络链路层上的流量首先需要经过主机的网络堆栈进行处理。
    • 由于NAT是通过地址转换进行的,虚拟机在外部网络中看不到自己的真实MAC地址。
  • 桥接模式
    • 虚拟机在数据链路层上直接与物理网络相连,虚拟机会分配一个与物理网络相同子网的IP地址,MAC地址也直接暴露在物理网络中。
    • 这种模式下,虚拟机看起来像是物理主机上的一个独立设备,具有与其他物理设备相同的网络层次关系。

(2)网络层(Layer 3)

  • NAT模式

    • 虚拟机获得一个私有IP地址,通常在私有网络范围内(例如:192.168.x.x10.x.x.x172.16.x.x等)。
    • 当虚拟机需要访问外部网络(如互联网)时,虚拟机的IP地址会被主机的公共IP地址替代,NAT会将所有外出请求的源地址转换成主机的IP地址。
    • 外部网络无法直接访问虚拟机的私有IP,所有对虚拟机的访问都需要通过主机的NAT配置来进行转发。
  • 桥接模式

    • 虚拟机直接从物理网络获取一个IP地址,通常是通过DHCP自动分配,虚拟机的IP地址与主机在同一子网中。
    • 虚拟机在网络层上与物理设备处于同一个网络,可以直接进行相互通信。外部网络设备可以通过虚拟机的IP地址直接访问虚拟机。

(3)传输层(Layer 4)

  • NAT模式
    • 虚拟机与外界的通信需要经过主机的NAT路由器。传输层协议(如TCP、UDP)在虚拟机和主机之间传输时,端口号也可能会发生改变,以便正确地映射到虚拟机的内部端口。
    • 虚拟机的端口和外部通信端口不直接对外开放,外部请求需要通过主机的端口转发来进行。
  • 桥接模式
    • 虚拟机的传输层通信与物理主机一致,不需要进行任何地址转换。
    • 虚拟机可以直接暴露服务端口,例如Web服务器或SSH服务,可以直接接受外部的连接请求。
4. 性能和安全性
  • NAT模式

    • 性能上,NAT模式会稍微降低一些,因为所有流量都需要经过主机的网络堆栈进行处理,增加了额外的地址转换和数据包转发。
    • 在安全性上,NAT模式提供了一定程度的隔离,虚拟机的内部网络不能直接被外部网络访问,外部只能通过特定的端口转发访问虚拟机。这种方式相对安全,但也可能导致配置的复杂性。
  • 桥接模式

    • 性能上,桥接模式可能稍好一些,因为虚拟机直接与物理网络通信,不需要通过主机进行地址转换。
    • 在安全性上,虚拟机更容易受到外部网络的攻击,因为虚拟机在物理网络中是一个“独立的”设备,外部网络可以直接与其通信。因此,需要更加小心地配置防火墙和访问控制。
总结
  • NAT模式:适合需要隔离虚拟机与外部网络,或不需要虚拟机直接对外提供服务的场景。它提供了网络层的隔离,适用于简化配置和提高安全性,但对外部访问虚拟机有一定限制。
  • 桥接模式:适合需要虚拟机与外部网络直接通信、并且需要暴露虚拟机服务的场景。它允许虚拟机像物理设备一样被访问,提供了更高的灵活性和性能,但安全性较低。

选择哪种模式取决于虚拟机的使用场景和对安全、性能的需求。

进入实战

这里我们可以根据先需求或者是心情选择一个网络模式,我在下面都会进行演示,教学VMware两种网络模式的虚拟机使用方式

返回我们的向导,进行实战!
为了方便教学,这里我的CPU给的比较宽裕

NAT模式网络实战

因为我最后会选择桥接模式使用,所以这里先演示一下NAT模式网络实战

Ubuntu安装

回车第一个选项

回车

回车

回车

这里显示没有获取到网络,我们先继续回车,稍后进入系统我们一起配置网络

先不配置

没网,继续走下一步

狠狠回车

选择到Done,回车

回车

Continue!

Your name可以有大小写,servers name和username只能小写,password可以有大小写

Continue就完事了

安装Openssh需要回车确认一下,连接要用,然后continue

之后进行稍微的等待

看到最下面出现 reboot now,选中就可以重启了

这个报错是正常的,别管,等个几秒按个回车,自己就会重启好了

重启的时候遇到这个是正常的,等会就行了,是Ubuntu试图在连接网络

配置Ubuntu网络

配置网络适配器

现在我们已经成功登录进来了

但是是没有网络的,这是因为我们没有被dhcp分配ip地址,所以接下来我们要给虚拟机配置网络(桥接就没有这么麻烦,所以我喜欢桥接)

在左上角的编辑点击虚拟网络编辑器

请确保这里有一个NAT类型的网络,设置可以参考我的
子网地址的网段要和你的宿主机不同,比如我的宿主机在192.168.1.1的网段里面,这里的子网ip我就可以设置192.168.x.0(x≠1),x在0到255之间

右键虚拟机
点击设置

在设置里面选择我们的网络适配器,网络连接选择我们刚刚定义的VMnet1,或者你自定义的nat网络

点击确定保存
回到我们的虚拟机,使用ip addr
发现还是没有ip地址

在这个VMware创建的虚拟机里面,ens33是我们虚拟机的网卡,lo是本地环回接口,在 Linux 系统中,lo 代表的是本地回环网络接口,它是一个虚拟的网络接口,用于在同一台机器内部进行网络通信。

接下来我们要进行配置DHCP来获取到IP地址

配置Ubuntu开启指定网卡的DHCP

先使用 sudo -i 切换到root用户

接下来使用 nano /etc/netplan/01-netcfg.yaml来编辑网络配置

配置文件内容如下,请注意空格,yaml文件对空格非常敏感

network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: true

编辑完成之后使用ctrl + x

提示是否保存,输入 y 确认保存

使用回车确认保存文件名称

使用 netplan apply应用配置

重启网络服务:
systemctl restart systemd-networkd

之后使用 ip addr 就可以看到当前获取了正确的ip

这里我的ip是
192.168.39.129
请先记住它

设置虚拟机端口映射

之后我们回到虚拟网络编辑器

选中我们目前虚拟机正在使用的网络后点击NAT设置

点击添加,在映射端口里面填写我们虚拟机在虚拟子网里面的ip,我们刚刚获取到的就是192.168.39.129
这里如实填写,因为ubuntu默认的ssh端口是22,所以我们虚拟机端口填写22,主机端口也就是宿主机要通过哪个端口访问虚拟机的22端口,这里按照你的心情填写1-65535之间的端口,尽可能不要和现在有的端口冲突,一个不行就换一个试试

最后记得确定保存

测试连接

因为是使用本地的电脑搭建虚拟机,nat模式会使用本机的网络,所以我们的ip地址是localhost

在cmd使用 ssh -p 2024 alice@localhost 进行登录
按照提示输入 yes密码,然后登录成功

进阶-使用root账户登录:

现在我们只能通过alice这个用户登录主机,虽然可以通过使用
sudo -i 切换到root用户,但是对于我们作为学习用途来使用还是不方便,所以接下来演示如何开放使用root账户的密码直接登录

为了方便,我们直接用cmd操作
先切换到 root 用户

使用
nano /etc/ssh/sshd_config来编辑ssh连接配置

找到PermitRootLogin这一项

取消注释,并且将后面的文字改为yes

ctrl + x 退出,y键保存

回车确认

这里很重要,记得在root的身份下使用passwd重新设置密码,因为root的密码和alice的密码是两个不同的密码,所以需要我们重新设置一下

重启ssh服务

直接使用root登录成功!(ssh -p 2024 root@localhost

那么,我们的NAT模式网络实战就讲到这里,之后如果有新的端口需要使用,也像这样使用端口映射就可以了

接下来讲我最喜欢的桥接模式~~

桥接模式网络实战

创建虚拟机

我们重新创建一个虚拟机

如果这里选择桥接模式,请勾选复制物理网络连接状态,这会同步我们宿主机的网络通断状态,满足绝大多数情况的使用

这里是我现在的配置

因为刚刚已经讲过安装步骤了,所以这里我们稍稍略过
但是到了网络配置这里,我们可以发现已经被自动分配了一个和宿主机同网段的ip地址,这里得到的地址是 192.168.1.106

这是安装前最后的确认页面

之后我们进行常规安装,联网安装会比离线安装稍微慢一点点,因为会涉及到一些更新操作,不过我们只要耐心等待就好了

重启!

重启成功,我们已经顺利进来了

配置ssh并连接

进行常规操作:
先切换到 root 用户

使用
nano /etc/ssh/sshd_config来编辑ssh连接配置

找到PermitRootLogin这一项

取消注释,并且将后面的文字改为yes

ctrl + x 退出,y键保存

回车确认

这里很重要,在root的身份下使用passwd重新设置密码,因为root的密码和alice的密码是两个不同的密码,所以需要我们重新设置一下

重启ssh服务

顺利登录!

进阶-配置代理

因为我们的桥接网络不经过宿主机的网络堆栈代理,所以我们需要配置一下
我的宿主机网络地址如下

开起了系统代理,局域网连接,混合端口是5200
所以我们在ubuntu里面直接输入这段命令来设置系统代理

echo -e "export http_proxy=http://192.168.1.39:5200\nexport https_proxy=http://192.168.1.39:5200\nexport ftp_proxy=http://192.168.1.39:5200" | sudo tee -a /etc/environment && source /etc/environment

这样,虚拟机所有的 HTTP 和 HTTPS 流量都将通过宿主机的代理。

可以通过 env | grep -i proxy 来查看当前网络代理

可以正常得到谷歌的响应

这里要注意,我们配置的是系统代理,绝大多数应用都会走我们的代理,所以如果代理关闭,需要取消代理,取消代理的命令是这个

unset http_proxy https_proxy ftp_proxy && sudo sed -i '/http_proxy/d;/https_proxy/d;/ftp_proxy/d' /etc/environment

之后我们再次查看代理,就发现代理已经被关闭了

代理重要总结

系统代理docker代理是要分开进行设置的

虽然我们刚刚设置了系统代理,但是在拉取docker的时候我们可以发现,还是会出现网络错误的情况

这个时候我们需要给docker也配置网络代理

设置docker代理走宿主机

sudo mkdir -p /etc/systemd/system/docker.service.d && \
echo -e '[Service]\nEnvironment="HTTP_PROXY=http://192.168.1.39:5200"\nEnvironment="HTTPS_PROXY=http://192.168.1.39:5200"\nEnvironment="NO_PROXY=localhost,127.0.0.1"' | \
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf && \
sudo systemctl daemon-reload && sudo systemctl restart docker

查看docker当前的代理

sudo systemctl show docker --property=Environment

预计效果:

可以成功安装啦!

一键取消docker代理

sudo rm -f /etc/systemd/system/docker.service.d/http-proxy.conf && \
sudo systemctl daemon-reload && \
sudo systemctl restart docker

注意:反斜杠后面不可以存在空格

常用代理总结(精华)

系统走代理

echo -e "export http_proxy=http://127.0.0.1:5200\nexport https_proxy=http://127.0.0.1:5200\nexport ftp_proxy=http://127.0.0.1:5200" | sudo tee -a /etc/environment && source /etc/environment

docker走代理

sudo mkdir -p /etc/systemd/system/docker.service.d && \
echo -e '[Service]\nEnvironment="HTTP_PROXY=http://127.0.0.1:5200"\nEnvironment="HTTPS_PROXY=http://127.0.0.1:5200"\nEnvironment="NO_PROXY=localhost,127.0.0.1"' | \
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf && \
sudo systemctl daemon-reload && sudo systemctl restart docker

查看当前系统代理

env | grep -i proxy

查看docker当前的代理

sudo systemctl show docker --property=Environment

取消系统代理

unset http_proxy https_proxy ftp_proxy && sudo sed -i '/http_proxy/d;/https_proxy/d;/ftp_proxy/d' /etc/environment

取消docker代理

sudo rm -f /etc/systemd/system/docker.service.d/http-proxy.conf && \
sudo systemctl daemon-reload && \
sudo systemctl restart docker

Enjoy!

感谢你看到这里!
24.12.5启笔
24.12.5封笔

后日谈部分

24.12.6 ~ 24.12.7

知识点:Linux代理(重要)

Shell 代理是什么?

Shell 代理是指通过配置环境变量,允许命令行下的程序(例如 curl, wget, apt-get 等)通过指定的代理服务器进行网络请求。代理的作用是通过中介服务器转发网络流量,通常用于隐藏用户的真实 IP 地址、突破网络访问限制,或者提高访问速度。

在 Linux 系统中,常见的代理配置是通过设置 HTTP 和 HTTPS 代理来控制命令行程序的网络请求。

Linux 的系统代理有哪些方式?

Linux 系统的代理配置可以通过多种方式进行,具体取决于你希望哪些程序、哪些用户或哪些层级使用代理。

1. Shell 代理配置(局部或全局代理)
  • 环境变量:最常见的代理设置方式是通过设置环境变量 http_proxyhttps_proxyftp_proxy 等来指定代理服务器。通常是在 shell 配置文件(如 ~/.bashrc~/.zshrc)中进行设置。

    示例:

    export http_proxy="http://proxy.example.com:8080"
    export https_proxy="http://proxy.example.com:8080"
    export ftp_proxy="http://proxy.example.com:8080"
    export no_proxy="localhost,127.0.0.1,.mydomain.com"  # 排除不通过代理的地址
    
  • 生效范围:这种方式对当前用户下的 shell 环境有效。也就是说,只有通过该 shell 启动的程序会使用代理。

2. 系统级代理配置
  • /etc/environment 文件:对于需要让整个系统的用户都使用代理,可以将代理设置写入 /etc/environment 文件(这是一个全局配置文件)。这样一来,所有用户在登录时都会加载这些环境变量。

    示例:

    http_proxy="http://proxy.example.com:8080"
    https_proxy="http://proxy.example.com:8080"
    ftp_proxy="http://proxy.example.com:8080"
    no_proxy="localhost,127.0.0.1,.mydomain.com"
    
  • /etc/profile/etc/bash.bashrc:这些是系统级别的 shell 配置文件,可以通过在这里设置代理使得所有 shell 会话都能够使用代理。

3. APT 代理配置(APT 包管理器)

如果你在使用 Debian 系列的 Linux 发行版(如 Ubuntu),并且需要通过代理访问软件包仓库,可以配置 APT 代理。你可以在 /etc/apt/apt.conf.d/ 目录下创建一个配置文件(如 95proxies),并指定代理服务器。

示例:

Acquire::http::Proxy "http://proxy.example.com:8080";
Acquire::https::Proxy "http://proxy.example.com:8080";
4. 其他应用程序的代理配置
  • 浏览器代理:如 Firefox、Chromium 等应用程序的代理配置通常是单独配置的,通常在浏览器的设置界面中进行,而不依赖于系统的环境变量。

  • 网络管理器代理:对于桌面环境(如 GNOME 或 KDE),你可以通过网络管理器设置全局代理,这样所有图形化应用程序都能通过代理进行网络访问。

通过 ~/.bashrc 配置代理会影响哪些层级?

当你在 ~/.bashrc 中配置代理时,这些设置对当前用户的 所有 shell 会话 都会生效。具体来说:

  • 当前用户:修改了 ~/.bashrc 文件后,所有通过该用户登录的 shell 会话都会读取这个配置文件,从而使用代理设置。
  • 命令行工具:如 curlwgetapt-getgit 等工具,会受到代理设置的影响,因为这些工具会检查 http_proxyhttps_proxy 等环境变量。
  • 图形化程序:如果你的图形化程序(如某些桌面应用)没有单独的代理配置界面,那么它们也可能会使用这些代理设置。但是很多图形化应用(尤其是浏览器)通常不直接依赖于 ~/.bashrc 中的代理设置。

总结来说,~/.bashrc 中的代理设置仅影响 当前用户的 shell 会话和命令行工具,不一定影响图形界面的应用程序或其他用户。

为什么 Docker 需要单独代理配置?

Docker 需要单独配置代理的原因如下:

  1. Docker 容器与主机环境隔离

    • Docker 容器在一个独立的网络环境中运行,容器的网络设置和主机的网络设置是隔离的。即使你在宿主机上设置了代理,容器内的进程也不会自动继承这些代理设置。因此,你需要在 Docker 配置中单独指定代理。
  2. Docker 默认没有继承宿主机的环境变量

    • Docker 容器通常不会自动继承宿主机的环境变量,尤其是涉及网络的变量(如代理环境变量)。为了确保容器能够通过代理访问外部网络,你需要显式地在 Docker 中配置代理。
  3. 容器中使用的工具和程序需要代理

    • 容器内部的命令行工具(如 apt-get, yum, curl 等)如果需要访问外部资源,必须通过代理服务器。如果没有为容器配置代理,它们可能无法正常访问外部网络。

配置 Docker 的代理

  • 通过 Docker 启动容器时指定代理: 你可以在运行容器时通过 -e 参数传递代理环境变量:

    docker run -e http_proxy="http://proxy.example.com:8080" -e https_proxy="http://proxy.example.com:8080" my-container
    
  • 为 Docker Daemon 设置代理: 你还可以为 Docker Daemon 配置代理,这样所有容器都会使用相同的代理设置。配置文件一般位于 /etc/systemd/system/docker.service.d/http-proxy.conf 中:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:8080"
    Environment="HTTPS_PROXY=http://proxy.example.com:8080"
修改完后需要重载 systemd 并重启 Docker 服务:
    sudo systemctl daemon-reload
    sudo systemctl restart docker

总结来说,Docker 容器需要单独配置代理,主要是因为容器与宿主机的网络环境是隔离的,且 Docker 本身不会自动继承宿主机的环境变量。

问题1:设备IP变动导致连接困难

问题描述

现在遇见了一个新的场景问题,我的设备经常更改使用的网络场景,比如我在学校宿舍的时候我的网段是192.168.1.x,但是当我在外面上课使用手机热点的时候,我的网段是192.168.81.x,这样就会导致我没有办法“设置一次IP”,“永远一键连接”,所以我需要考虑一种高效简洁的设备识别连接方案

解决思路

为了解决这个问题,我尝试让我的设备可以在局域网通过主机名被直接连接,在我大量查资料之后基本确定了3种方案:

mDNS(本次不采用)

mDNS(Multicast DNS)是一种局域网内的名称解析协议,它不依赖于中心化的 DNS 服务器,而是通过广播来解析设备的主机名。这意味着你在不同的网络中(如家庭网络和移动热点)都能通过主机名(如 alice)直接访问虚拟机,而无需修改设备的配置。

mDNS 通常通过 Avahi(Linux)或 Bonjour(macOS、Windows)提供支持。我们可以在虚拟机中安装 Avahi 来启用 mDNS 服务,使得虚拟机可以通过 alice.local 被局域网中的其他设备解析。

  1. 首先更新系统
sudo apt update
sudo apt upgrade -y
  1. 安装Avahi服务
sudo apt install avahi-daemon avahi-utils libnss-mdns -y
  1. 配置Avahi守护进程
    编辑配置文件:
sudo nano /etc/avahi/avahi-daemon.conf

确保以下行未被注释(去掉前面的#):

publish-addresses=yes
publish-hinfo=yes
  1. 重启Avahi服务
sudo systemctl enable avahi-daemon
sudo systemctl restart avahi-daemon
  1. 验证Avahi状态
sudo systemctl status avahi-daemon
  1. 测试服务
    在虚拟机上运行:
avahi-browse -a
  1. 配置主机名(可选,但建议)
sudo hostnamectl set-hostname alice
  1. 检查mDNS解析
ping alice.local

按照道理来说,现在应该已经成功

但~是!

经过大量的测试,最终可以确定,本方案无法使用在当前的网络环境中,我简单描述一下我当前的网络环境以及遇见的问题

这是我当前的网络环境

我直接说结论吧:
所以主机都可以成功顺利互相通信

除了

宿主机和虚拟机之间

对的,也就是说,宿主机无法和虚拟机通讯,但是其他所有的机器都可以互相通信,你说难受不难受... ...

相信细心的读者应该已经猜出来原因了,宿主机和虚拟机共用一个物理网卡,所以无法通讯... ...

... ...

真相,真的是这样吗?

我不知道... ...
但是我们的大量实验验证了这一点,所有的实验现象都指向这一点,我们只能这样理解了

所以本次不采用这种方案

DDNS(动态域名解析)

这种方案我们简单分析一下就可以pass,这种方案的实现原理是在每次虚拟机运行的时候使用 systemd 来运行一个脚本,让脚本实现更新域名为当前指定网络接口的内网IP地址

这个方案我亲手实践了,认认真真的实践了
但是发现几个很严重,无法避免的问题

TTL值过大,更新延迟过高
这个很好理解,国内的一些域名解析提供商给免费用户的最小TTL值是5分钟,这就意味着就算你的虚拟机已经完成了脚本操作,确实更新了子域名为当前内网IP,也不能第一时间让你的电脑解析到正确的IP,十分影响体验,我在实践的过程中使用的是CloudFlare,我的TTL设置为了1分钟,也就是60秒,我发现这个过程中可能存在部分地区的DNS更新缓慢,导致超过了1分钟我还是不能正确获取到IP地址,这就意味着这种方案的体验极差

所以我果断放弃了这种方案

内网穿透(目前使用中的方案)

目前我采取了这样的方案,本地虚拟机上面部署了FRPC(FRP客户端),服务端是国内的阿里云,我在阿里云上面部署了FRPS,通过TCP端口穿透来使用固定的阿里云IP和指定端口访问我的主机,因为阿里云在国内,延迟较低,所以体验很稳定,很舒服,如果我需要对外提供大流量服务,我会考虑再安装一个FPRC,将服务地址设置为我的海外服务器,然后在海外的服务器上面搭建FRPS,同时在FRPC里面设置TCP穿透代理走本地的系统代理,这样一方面提供了加密,另一方面又享受了海外VPS的大带宽和大流量

但是这种方案在使用ssh连接时的安全性有待探究
现在我不确定我在tcp穿透的时候会不会暴露我的ssh交互信息
tcp穿透应该是明文的

问题2:虚拟机需要开机自启

我希望在windows宿主机开机的时候同时运行我的虚拟机
所以要设置虚拟机开机自启
这一部分来自于腾讯云上面的文章

配置自动启动虚拟机

首先我们要在vmware workstation里面点击配置自动启动虚拟机

勾选需要开机自启动的虚拟机

这步骤设置后,发现每次开机还是没启动,进行下面设置。

设置自动启动服务

任务管理器 -> 服务 -> 找到VmwareAutostartService右键打开服务 -> VMware自动启动服务 -> 右键 -> 常规 -> 启动类型 -> 设置为 -> 自动启动

检查实例路径

我在按照这篇腾讯云的文章实操之后发现还是不能自动运行,于是我尝试了将实例运行的目录中的中文删除,改成英文,于是成功!

开机之后有这个进程就是成功啦!