事情是这样的,之前我跟斌哥说了一下,我的电脑配置太差,有些测试环境搭建不了,然后斌哥就不知道从哪里搞来了一台小霸王,说是配置挺高的,可以给我当服务器玩玩
我看了一眼这台小霸王,感觉它不太像是一台高配置的小霸王,便上网查了一下这个品牌和型号,没有找到和硬件配置有关的介绍,只知道这是一台网关服务器
我当时就觉得这台小霸王的配置应该没有我的电脑配置高,先不管了,把它拆了接个显示器装个系统再看看吧
# 安装 Esxi Server
刚好前段时间下载了 Esxi 7.0b
的镜像,还没有玩过,于是就决定了盘它
我找了一个闲置的 4G 优盘,用 UltraISO
这个软件把镜像刻录到优盘,就屁颠屁颠开始装系统了
插优盘,开机,启动,这是什么鬼???
Initial menu has no LABEL entries ???
马上百度,发现是 UltraISO
软件刻录的问题,用 rufus
软件刻录镜像即可
于是马上下载了个 rufus-3.14
, 重新把 Esxi
镜像刻录到优盘,再把优盘插到小霸王的 USB 接口,开机顺利进入系统安装界面
Esxi
安装过程就不写了吧,和普通的操作系统安装没有太大区别,安装完系统后,发现系统没有识别到网络,查看网络适配器信息,所有网卡的状态都是 Disconnected
,但是网口的灯是亮着的,初步判断是驱动问题
进 PE
查看网卡型号,发现管理网卡型号是 Realtek RTL8168/8111
百度了一下发现是 Esxi
不包含 Realtek RTL8168/8111
驱动,需要自己手动把驱动添加到镜像中
因为懒惰的原因的,我直接找了个别人已经封装好 Realtek RTL8168/8111
驱动的 Esxi 6.7
镜像,因为我实在是找不到现成的 7.0 镜像 😂
安装完 Esxi 6.7
的镜像后,发现网络已经能够正常获取到 IP 地址了,查看网络适配器信息, vmnic12
这个接口已经显示已连接了
用浏览器访问 Esxi
主机地址登录服务器,查看硬件信息
老古董了,二代 I7, 8G 内存,1000G 机械硬盘
上传文件慢得要死,一个 4G 左右的镜像文件上传要半个小时,作为一个体验过固态硬盘带来快感的男人,真的无法接受这个速度🙃
# 环境部署
这台服务器计划将来要部署 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 服务
# frp 客户端
# nginx 代理配置
安装好后用 xshell
连接进去,先用 yum
命令安装 nginx
服务
yum install nginx -y
安装完后启动 nginx,并添加开机启动
systemctl start nginx && systemctl enable nginx
启动 nginx 后,我们在 nginx/conf.d 目录下添加一个新的 server 配置,用来转发本地 8000 端口流量到 esxi 的 443 端口
cd /etc/nginx/conf.d && vi esxi.conf
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
查看 nginx 日志发现是权限问题
tail /var/log/nginx/error.log
百度了一下发现这个是 selinux
的 http 默认端口策略问题,用 semanage
查看 http 端口信息,发现命令找不到,因为我是选择最小化安装的操作系统,用 yum
命令查询发现需要 policycoreutils-python-utils
这个包,用 rpm
命令查看系统果然没有安装这个包,晕死
安装完 policycoreutils-python-utils
包后,再用 semanage
查看跟 http 端口有关的信息
semanage port -l | grep http
可以看到 http 默认监听的端口只有 tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
那我们就把配置里的端口改成 9000 吧,因为 8000 端口已经被 soundd_port_t
占用了,没有办法直接把 8000 端口添加到 http_port_t
里面去,我觉得直接改配置文件里的监听端口是比较合适的
修改完端口后重启 nginx 服务不再报错,9000 端口也处在一个监听的状态,现在我们试一下访问 frp 这台客户端的 9000 端口会不会跳转到 esxi 的 443 端口
发现无法访问,用 telnet 测试 frp 客户端 9000 端口不通
肯定是防火墙的问题,因为前面重启 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 让规则立即生效
添加端口后再次访问 frp 客户端的 9000 端口,发现这次报的是 502 网关错误了
查看 nginx 错误日志发现还是权限问题
用 getsebool
查看和 http 有关的 SELinux
策略
getsebool -a | grep http
发现 httpd_can_network_connect
是 off 状态,我们把它设置成 on 启动状态
httpd_can_network_connect 是脚本和模块与网络连接的开关,nginx 设置代理转发必须开启这条策略
setsebool -P httpd_can_network_connect 1
启用后,再次访问 http://192.168.1.31:9000/,终于可以正常跳转到 Esxi 的登录页面😃
但是此时我们登录 Esxi
会提示请刷新您的浏览器,因为 esxi 不支持 http 登录,所以我们还得通过 frp 这个软件将客户端的 9000 端口映射到我们的云服务器,然后再通过云服务器将本地的 443 端口转发到 frp 的 9000 端口
感觉描述的有点绕,但是大概就是这么个流程
# 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
下载好以后用 tar 命令解压
tar -zxvf frp_0.37.0_linux_amd64.tar.gz
解压完后切换到 frp 目录,删除 frps 相关文件,因为这台是客户端,只需要用到 frpc 相关的文件
cd frp_0.37.0_linux_amd64 && rm -fr ./frps*
编辑 frpc.ini 配置文件
[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 记录,并解析到我们的云服务器地址
然后进入阿里云 SSL 证书服务,先购买一个免费的单域名证书,然后再为我们的 esxi.0xhex.cn
这个域名创建证书,然后下载证书,把证书上传到云服务器的 nginx 目录,创建一个 cert 目录,把证书拷贝到该目录下
我在上一篇文章 hexo 部署到服务器已经描述过如何申请 SSL 证书了,这里就不多描述了
# nginx 转发配置
登录到我们的云服务器,如果没有安装 nginx 服务的首先安装 nginx,我之前已经安装过 nginx 了,和之前客户端配置一样,直接切换到 nginx 安装目录下的 conf.d 目录,添加一个新 server 配置设置代理
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"; | |
} | |
} |
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
下载好以后用 tar 命令解压
tar -zxvf frp_0.37.0_linux_amd64.tar.gz
解压完后切换到 frp 目录,删除 frpc 相关文件,因为这台是服务端,只需要用到 frps 相关的文件
cd frp_0.37.0_linux_amd64/ && rm -rf ./frpc*
编辑 frps.ini 配置文件
[common] | |
bind_port = 7000 # frps 监听端口 | |
vhost_http_port = 9000 # 自己设定的 http 访问端口 |
保存后启动我们的 frps 服务,最后显示 successfully
表示服务启动正常
./frps -c ./frps.ini
frps 服务启动后,我们就可以回到客户端启用 frpc 脚本对接我们的 frps 服务端
客户端进入到 frp 目录,直接执行 frpc 服务即可
./frpc
# 域名访问
现在让我们在本地浏览器测试一下是否能通过我们的域名访问 esxi 服务器了
结果非常 nice,小锁头显示正常,登录正常,远程控制台也正常
最后测试 vmware workstation
的连接服务器,因为浏览器的远程窗口贼不好用
ok,测试到这里就结束了,按着我的操作,理论上不会有太大的问题啦
# 总结
最后做一下总结吧,总得来说把 esxi 映射到域名不会太难,我总结以下几个需要了解的知识点:nginx 代理转发配置、nginx ssl 配置、frp 配置、selinux 策略
把上面几个知识点搞清楚了,这个过程实施起来就没有什么难度了,其中 selinux 策略应该是比较难掌握的,这个一般只能凭经验判断,先猜测这个问题应该是属于哪个范围,然后再根据范围筛选出来的策略名进行判断
例如前面的 httpd_can_network_connect
问题,你首先要先确定这个问题是跟 http
相关的策略,然后再用 getsebool -a | grep http
查看所有的 http 策略,根据策略名进行判断,有的策略名可以很明显看出跟问题有关,你就可以把它开启测试,顶多就是多试几条策略,但是如果你第一步就判断错了,那么后面就瞎忙活了
当然,如果你觉得 SELinux 太麻烦了,你也可以直接关闭 SELinux 一劳永逸,但是我并不推荐,这个问题就好像是你的操作系统出一点小问题,然后你就通过重装系统把这个问题解决掉一样
好了,这个教程就到这吧 🎉🎉🎉