fc

事情是这样的,之前我跟斌哥说了一下,我的电脑配置太差,有些测试环境搭建不了,然后斌哥就不知道从哪里搞来了一台小霸王,说是配置挺高的,可以给我当服务器玩玩

我看了一眼这台小霸王,感觉它不太像是一台高配置的小霸王,便上网查了一下这个品牌和型号,没有找到和硬件配置有关的介绍,只知道这是一台网关服务器

我当时就觉得这台小霸王的配置应该没有我的电脑配置高,先不管了,把它拆了接个显示器装个系统再看看吧

# 安装 Esxi Server

刚好前段时间下载了 Esxi 7.0b 的镜像,还没有玩过,于是就决定了盘它

我找了一个闲置的 4G 优盘,用 UltraISO 这个软件把镜像刻录到优盘,就屁颠屁颠开始装系统了

插优盘,开机,启动,这是什么鬼???

upload successful

Initial menu has no LABEL entries ???

马上百度,发现是 UltraISO 软件刻录的问题,用 rufus 软件刻录镜像即可

于是马上下载了个 rufus-3.14 , 重新把 Esxi 镜像刻录到优盘,再把优盘插到小霸王的 USB 接口,开机顺利进入系统安装界面

Esxi 安装过程就不写了吧,和普通的操作系统安装没有太大区别,安装完系统后,发现系统没有识别到网络,查看网络适配器信息,所有网卡的状态都是 Disconnected ,但是网口的灯是亮着的,初步判断是驱动问题

upload successful

PE 查看网卡型号,发现管理网卡型号是 Realtek RTL8168/8111

upload successful

百度了一下发现是 Esxi 不包含 Realtek RTL8168/8111 驱动,需要自己手动把驱动添加到镜像中

因为懒惰的原因的,我直接找了个别人已经封装好 Realtek RTL8168/8111 驱动的 Esxi 6.7 镜像,因为我实在是找不到现成的 7.0 镜像 😂

安装完 Esxi 6.7 的镜像后,发现网络已经能够正常获取到 IP 地址了,查看网络适配器信息, vmnic12 这个接口已经显示已连接了

upload successful

用浏览器访问 Esxi 主机地址登录服务器,查看硬件信息

upload successful

老古董了,二代 I7, 8G 内存,1000G 机械硬盘

上传文件慢得要死,一个 4G 左右的镜像文件上传要半个小时,作为一个体验过固态硬盘带来快感的男人,真的无法接受这个速度🙃

upload successful

# 环境部署

这台服务器计划将来要部署 10 台虚拟机用于日常测试,但是目前内存严重不足,需要让斌哥帮我升级一下,最低也得 32G 吧

考虑到今后可能在外网也需要访问这台服务器,便打算把这台 Esxi 发布到外网,百度了一下 Esxi 有哪些方案可以通过外网访问,最终决定了用 frp 端口转发这套方案

  • 简单说一下我的环境

Esxi服务器内网IP地址:192.168.1.100
frp客户机内网IP地址 :192.168.1.31
域名 :esxi.0xhex.cn (地址解析到阿里云服务器)

首先在 Esxi 服务器新建一台 CentOS 8 虚拟机,配置 frp 客户端作为中转站,并安装 nginx 服务

upload successful

# frp 客户端

# nginx 代理配置

安装好后用 xshell 连接进去,先用 yum 命令安装 nginx 服务

  • yum install nginx -y

upload successful

安装完后启动 nginx,并添加开机启动

  • systemctl start nginx && systemctl enable nginx

upload successful

启动 nginx 后,我们在 nginx/conf.d 目录下添加一个新的 server 配置,用来转发本地 8000 端口流量到 esxi 的 443 端口

  • cd /etc/nginx/conf.d && vi esxi.conf
h
server{
    listen  8000;	# 用于监听本地的端口
    server_name     127.0.0.1;
    location / {
    			# 将本地 8000 端口流量转发到 Esxi 主机的 web 登录地址
            proxy_pass https://192.168.1.100; 
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
    }
}

保存后重启 nginx 服务发现报错

  • systemctl restart nginx

upload successful

查看 nginx 日志发现是权限问题

  • tail /var/log/nginx/error.log

upload successful

百度了一下发现这个是 selinux 的 http 默认端口策略问题,用 semanage 查看 http 端口信息,发现命令找不到,因为我是选择最小化安装的操作系统,用 yum 命令查询发现需要 policycoreutils-python-utils 这个包,用 rpm 命令查看系统果然没有安装这个包,晕死

upload successful

安装完 policycoreutils-python-utils 包后,再用 semanage 查看跟 http 端口有关的信息

  • semanage port -l | grep http

upload successful

可以看到 http 默认监听的端口只有 tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000

那我们就把配置里的端口改成 9000 吧,因为 8000 端口已经被 soundd_port_t 占用了,没有办法直接把 8000 端口添加到 http_port_t 里面去,我觉得直接改配置文件里的监听端口是比较合适的

upload successful

修改完端口后重启 nginx 服务不再报错,9000 端口也处在一个监听的状态,现在我们试一下访问 frp 这台客户端的 9000 端口会不会跳转到 esxi 的 443 端口

upload successful

发现无法访问,用 telnet 测试 frp 客户端 9000 端口不通

upload successful

肯定是防火墙的问题,因为前面重启 nginx 后,已经用 ss 命令查看过 9000 端口是处于一个监听状态的,先在 frp 客户端的防火墙放行 9000 端口

  • firewall-cmd --get-default-zone # 查看当前应用区域
  • firewall-cmd --zone=public --add-port=9000/tcp --permanent # 添加tcp 9000 端口永久生效
  • firewall-cmd --reload # 重新加载 Firewall 让规则立即生效

upload successful

添加端口后再次访问 frp 客户端的 9000 端口,发现这次报的是 502 网关错误了

upload successful

查看 nginx 错误日志发现还是权限问题

upload successful

getsebool 查看和 http 有关的 SELinux 策略

  • getsebool -a | grep http

upload successful

发现 httpd_can_network_connect 是 off 状态,我们把它设置成 on 启动状态

httpd_can_network_connect 是脚本和模块与网络连接的开关,nginx 设置代理转发必须开启这条策略

  • setsebool -P httpd_can_network_connect 1

upload successful

启用后,再次访问 http://192.168.1.31:9000/,终于可以正常跳转到 Esxi 的登录页面😃

但是此时我们登录 Esxi 会提示请刷新您的浏览器,因为 esxi 不支持 http 登录,所以我们还得通过 frp 这个软件将客户端的 9000 端口映射到我们的云服务器,然后再通过云服务器将本地的 443 端口转发到 frp 的 9000 端口

upload successful

感觉描述的有点绕,但是大概就是这么个流程

# frpc 客户端配置

现在用 wget 命令下载 frp 这个内网穿透神器,frp 下载地址是 https://github.com/fatedier/frp/releases, 根据自己的操作系统选择对应的版本下载

wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz

upload successful

下载好以后用 tar 命令解压

  • tar -zxvf frp_0.37.0_linux_amd64.tar.gz

upload successful

解压完后切换到 frp 目录,删除 frps 相关文件,因为这台是客户端,只需要用到 frpc 相关的文件

  • cd frp_0.37.0_linux_amd64 && rm -fr ./frps*

upload successful

编辑 frpc.ini 配置文件

h
[common]
server_addr = esxi.0xhex.cn	# 你的域名或者云服务器 IP
server_port = 7000		# frps 监听端口,需要在安全组放行
[esxi]
type = http				
local_ip = 127.0.0.1
local_port = 9000		# 本地需要映射的端口
custom_domains = esxi.0xhex.cn	# 需要映射的域名

ok, 客户端这边就算是配置好了,接下来我们配置一下云服务器端的设置就可以了

# 云服务器

# 申请 ssl 绑定域名

以阿里云为例:首先登录阿里云的控制台,在产品与服务这里找到域名服务,然后点击进入域名服务,我们需要给我们的域名添加一条新的 A 记录,并解析到我们的云服务器地址

upload successful

然后进入阿里云 SSL 证书服务,先购买一个免费的单域名证书,然后再为我们的 esxi.0xhex.cn 这个域名创建证书,然后下载证书,把证书上传到云服务器的 nginx 目录,创建一个 cert 目录,把证书拷贝到该目录下

我在上一篇文章 hexo 部署到服务器已经描述过如何申请 SSL 证书了,这里就不多描述了

# nginx 转发配置

登录到我们的云服务器,如果没有安装 nginx 服务的首先安装 nginx,我之前已经安装过 nginx 了,和之前客户端配置一样,直接切换到 nginx 安装目录下的 conf.d 目录,添加一个新 server 配置设置代理

h
server{
        listen  443     ssl;
        server_name     esxi.0xhex.cn;
        ssl_certificate cert/esxi.0xhex.cn.pem; # 证书路径
        ssl_certificate_key     cert/esxi.0xhex.cn.key; # 证书路径
        ssl_session_timeout     5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location / {
        			# 将 esxi.0xhex.cn 的流量转发到本地 9000 端口
                proxy_pass http://127.0.0.1:9000; 
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $host;
                proxy_set_header X-Forward-Proto https;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

upload successful

nginx 就算是配置好了,配置一下 frps 应该就可以正常访问我们内网的 esxi 服务器了

# frps 服务端配置

和上面客户端操作差不多,都是先用 get 下载 frp,然后解压,但是服务器端要用到的是 frps 文件,我们把 frpc 相关的文件删除掉

  • wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz

upload successful

下载好以后用 tar 命令解压

  • tar -zxvf frp_0.37.0_linux_amd64.tar.gz

解压完后切换到 frp 目录,删除 frpc 相关文件,因为这台是服务端,只需要用到 frps 相关的文件

  • cd frp_0.37.0_linux_amd64/ && rm -rf ./frpc*

upload successful

编辑 frps.ini 配置文件

h
[common]
bind_port = 7000	# frps 监听端口
vhost_http_port = 9000	# 自己设定的 http 访问端口

upload successful

保存后启动我们的 frps 服务,最后显示 successfully 表示服务启动正常

  • ./frps -c ./frps.ini

upload successful

frps 服务启动后,我们就可以回到客户端启用 frpc 脚本对接我们的 frps 服务端

客户端进入到 frp 目录,直接执行 frpc 服务即可

  • ./frpc

upload successful

# 域名访问

现在让我们在本地浏览器测试一下是否能通过我们的域名访问 esxi 服务器了

upload successful

结果非常 nice,小锁头显示正常,登录正常,远程控制台也正常

upload successful

最后测试 vmware workstation 的连接服务器,因为浏览器的远程窗口贼不好用

upload successful

ok,测试到这里就结束了,按着我的操作,理论上不会有太大的问题啦

# 总结

最后做一下总结吧,总得来说把 esxi 映射到域名不会太难,我总结以下几个需要了解的知识点:nginx 代理转发配置、nginx ssl 配置、frp 配置、selinux 策略

把上面几个知识点搞清楚了,这个过程实施起来就没有什么难度了,其中 selinux 策略应该是比较难掌握的,这个一般只能凭经验判断,先猜测这个问题应该是属于哪个范围,然后再根据范围筛选出来的策略名进行判断

例如前面的 httpd_can_network_connect 问题,你首先要先确定这个问题是跟 http 相关的策略,然后再用 getsebool -a | grep http 查看所有的 http 策略,根据策略名进行判断,有的策略名可以很明显看出跟问题有关,你就可以把它开启测试,顶多就是多试几条策略,但是如果你第一步就判断错了,那么后面就瞎忙活了

当然,如果你觉得 SELinux 太麻烦了,你也可以直接关闭 SELinux 一劳永逸,但是我并不推荐,这个问题就好像是你的操作系统出一点小问题,然后你就通过重装系统把这个问题解决掉一样

好了,这个教程就到这吧 🎉🎉🎉