博威---云架构决胜云计算

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1126|回复: 0

机房不能访问互联网,轻松搞定系统部署

[复制链接]
发表于 2023-3-20 06:21:48 | 显示全部楼层 |阅读模式
机房不能访问互联网,轻松搞定系统部署Nov 27, 2020 / Technical

本文写于 6 个月之前,如果这是一篇关于计算机技术的文章,那本文内容很有可能已经过期了。
创业这段时间以来,我们的 IoT 系统已经在不少客户的机房做了私有化部署,客户大多都是机加工厂、商业大楼、医院和大学实验室等,客户的机房都有一个相同的特点:私有云,与外网隔离,不能访问互联网。或者更为准确的说,是我们部署的服务器不能访问互联网,在没有互联网访问权限的情况下,系统的包管理工具(yum/apt/docker)都无法使用了,在这种情况下进行系统部署安装,费时费力,而且无法进行远程部署维护,也大大增加了项目的实施成本。
在最近的一个客户项目的实施过程中,看到客户的一些其他供应商在系统部署过程中非常艰难,甚至是 CentOS 系统初始化和 Docker 的安装就花掉了两个礼拜的人力,不排除一些供应商这样折腾会给他的客户留下工作敬业钱花的值的好印象,但对于我们这样的小创业公司来说,这样的时间浪费和低效是无法承担的成本,因为来实操部署的人就是公司老板本人了,我也不想出差在客户这里待上两个礼拜。
在工作完成之后,想想可以把解决问题的方法记录一下,也许能给遇到相同问题的同行一些启发和帮助。好了,废话不多说,接下来我们就来解决这个无外网的部署问题,顺便再解决一下远程维护的问题。
一、面临的问题
在部署和维护一个私有化企业内部使用且无互联网访问的系统中,可能会面临以下问题:
  • 机房服务器无法访问 Internet
  • 可通过接入企业内网来访问服务器,而从服务器无法直连办公室网络,即机房和办公室在不同的网段
  • 无互联网访问权限的情况下,无法直接使用系统的配置工具,如 yum/apt/docker 等,配置系统和部署服务费时费力
  • 无法远程进行维护
客户内网拓扑示意图,此处省略了防火墙,简化拓扑图的复杂度,如下:
网络拓扑图说明:
  • 机房和办公室不在一个网段
  • 机房网段假设为 172.22.0.0/16,办公室内网 WiFi 的网段为 192.168.137.0/24
  • 机房服务器之间是互通的,办公室可以 ping 通机房服务器,在机房服务器上无法 ping 通办公室部署控制主机,这里假设办公室网络作为一个 NAT 放在上层交换机后面
  • 内网没有互联网访问权限,包括机房服务器和办公室内网 WiFI
二、解决问题的方法
既然是由于机房服务器没有互联网访问权限,不能联网下载安装包,那就想办法让机房服务器可以连接互联网或者搭建内网的软件包镜像服务,于是想到一些方法来达到目的:
  • 告知客户问题,申请开通互联网访问权限,可以限定为指定的网址和协议(HTTP/HTTPS),需要远程维护的化,还需要申请可以连接到服务器的 VPN。这个方法在需要客户的进行审批,可能时间比较长。我们的客户中有不少都没有自建 VPN,或这不方便给我们开通 VPN,另外也无法开通需要我们部署的服务器的互联网访问权限,所以不能使用这个方法
  • 在客户机房放置可以通过 4G 上网的堡垒机,堡垒机接入客户机房网络。在客户机房放一个堡垒机,虽然说是堡垒机,但可能客户那边的机房管理也还是不容许放置这样的机器的,所以也不能使用这个方法
  • 搭建 yum(CentOS)/apt(Debian/Ubuntu)/docker 的内网镜像服务,搭建内网镜像服务可能就是一个比较艰巨的任务,难以接受给自己又添加了一个艰难的任务,此方法也作罢
  • 通过在办公室网里放置部署控制机,同时连接内网和 4G 路由器提供的外网(互联网),在部署控制机上搭建 SDWAN 或者 HTTP 代理,yum/apt/docker 都支持 HTTP 代理,这样修改系统配置之后,就可以通过代理安装部署服务,这个方法比较简单,而且几乎不需要客户的参与就可以完成。不过也有一些前置条件,例如:
    • 办公室中主机可以接入客户网络
    • 客户服务器允许办公室网络中主机通过 TCP 或者 UDP 访问其任意或者指定的端口
    • 客户办公室的 4G 网络信号要足够好,这样可以提供更好的外网速度
    • 拥有服务器的 root 管理员权限(需要安装软件和修改系统配置)


通过权衡利弊,我们最终使用的是第 4 个方法来搭建的,下面来讲讲搭建的过程。
三、搭建可以访问互联网的部署环境
我们希望使用第 4 个方法来搭建部署的网络环境,通过测试客户的内网环境,几个前置条件都已满足,这样第 4 个方法的搭建过程不需要客户的参与就可以完成。首先要解决的是网络通路问题,我们在客户办公室添加了一台 4G 路由器,添加 4G 路由器之后的网络拓扑图如图:
部署控制主机连接好 4G 路由器之后,获取到一个 192.168.8.106 的 IP,注意 4G 路由器的网段要与办公室网段不同,例如办公室网段是 192.168.137.0/24 (也就是子网掩码为 255.255.255.0),4G 路由器的网段为 192.168.8.0/24,也就是说部署控制主机需要有两个网络接口(网卡):一个接内网,一个接外网(4G 路由器),如果部署控制主机刚好有一个 RJ45 的以太网卡和一个 WiFI 网卡(很多笔记本电脑就是这样),那部署控制主机在硬件上就不需要在添加额外的硬件了。
关于网络搭建过程中的使用到硬件就讲这些,各位读者可以根据自己的情况选用合适的网络设备,比如 4G 无线网卡,带 4G 模块的工控主机等等,原则上只要能建立一个互联网访问的通道就行了。
接下来我们再一起探讨一下如果利用开源软件来搭建互联网访问的通道,如图:
现在解决问题的思路应该更加清晰了:需要在机房服务器和办公室部署控制主机之间建立一个通道。建立通道可以使用的开源软件有不少,相信很多人因为某些原因都或多或少使用过,从我自己长期实际使用的经验来看,frpWireGuard 非常适合用在当前情况下建立通道,gost 也十分容易搭建 HTTP 或者 SOCK5 代理。
可以用一句话来描述搭建的过程:
在机房一台服务器上面安装 frp 或 WireGuard 做服务端,在可以连接外网内网的部署控制主机上安装 frp 或 WireGuard 做客户端,并且在部署控制主机上安装 gost 服务启用 HTTP 代理服务,最后在服务器端的修改系统配置,让 yum 和 docker 拉镜像走 HTTP 代理。
因为部署系统使用 HTTP 代理就够了,这样 frp + gost 的组合可能比 WireGuard + gost 的组合配置起来会更加简单,WireGuard 是一个可以用于 SDWAN 组网的高性能通道软件,本文就不说明如何使用它来搭建,如果对 WireGuard 搭建 SDWAN 感兴趣,可以自行研究一下或者留言私信给我。
以下使用 frp + gost 来说明具体的搭建过程。
3.1 准备需要的软件
请根据自己部署控制主机对应的平台下载需要的软件
如果部署控制主机是 ARM 或者 MIPS 架构的,需要上面两个软件需要下载对应的版本来安装,在使用上没有任何差异。
3.2 配置路由和安装软件
frp 和 gost 安装都比较简单,上传到服务器上解压后就就可以了,我们只需要在其中一台机房服务器上安装 frp 作为服务端启动,机房其它服务器不需要安装 frp,总结一下需要进行的安装步骤:
  • 在部署控制主机上面配置路由,使得部署控制主机可以访问机房网络也可以访问互联网
  • 其中一台机房服务器上安装 frp,作为服务端启动
  • 部署控制主机上安装 gost,启动一个 HTTP 代理服务器
  • 部署控制主机上安装 frp,作为客户端启动
以下部署过程以部署控制主机系统为 MacOS,机房服务器系统为 CentOS 7.6 为例,如果读者在实际部署过程中由于系统与本文不同而遇到问题不知如何解决,比如服务器为 Ubuntu,部署机是 Windows 10,欢迎留言一起探讨。
在部署控制主机上面配置路由
如果部署控制主机和机房服务器在同一个子网,则不需要添加路由。由于本次部署控制主机和机房服务器不在一个子网,在接了两个网卡之后,在部署控制主机上的 IP 包是不知道如何路由到机房网络的,如果不做路由设置,172.22.0.0/16 网段会走系统默认的路由,可能无法访问到机房网络。所以在部署控制主机上( MacOS 系统)添加以下路由:
[backcolor=rgb(248, 248, 248) !important]sudo route add -net 172.22.0.0/16 192.168.137.1

如果部署控制主机为 Linux 或者 Windows 也需要手动添加路由。
在机房任意一台服务器上安装 frp
上传 frp_0.34.3_linux_amd64.tar.gz 到服务器,解压 frp_0.34.3_linux_amd64.tar.gz 安装包
[backcolor=rgb(248, 248, 248) !important]$ tar -zxvf frp_0.34.3_linux_amd64.tar.gzfrp_0.34.3_linux_amd64/frp_0.34.3_linux_amd64/frps_full.inifrp_0.34.3_linux_amd64/frps.inifrp_0.34.3_linux_amd64/frpcfrp_0.34.3_linux_amd64/frpc_full.inifrp_0.34.3_linux_amd64/frpsfrp_0.34.3_linux_amd64/LICENSEfrp_0.34.3_linux_amd64/frpc.ini

进入 frp_0.34.3_linux_amd64 目录并新建 frps-deployment.ini 文件,内容为
[backcolor=rgb(248, 248, 248) !important][common]bind_port = 7000

找到 frps 命令后启动:
[backcolor=rgb(248, 248, 248) !important]$ ./frps -c frps-deployment.ini2020/11/30 06:53:01 [I] [service.go:128] frps tcp listen on 0.0.0.0:70002020/11/30 06:53:01 [I] [root.go:190] Start frps success
如果服务无法启动,可能是 7000 端口已经被占用或者是 frps 没有执行权限,请注意具体的报错信息。
在部署控制主机上安装 gost
解压 gost 包,并且添加执行权限
[backcolor=rgb(248, 248, 248) !important]$ gunzip gost-darwin-amd64-2.11.1.gz$ chmod +x gost-darwin-amd64-2.11.1
启动 HTTP 代理, 在端口 18080 上监听
[backcolor=rgb(248, 248, 248) !important]$ ./gost-darwin-amd64-2.11.1 -L http://:18080
在控制主机上安装 frp
解压 frp 安装包后在目录中新建 frpc-deployment.ini 文件,内容为
[backcolor=rgb(248, 248, 248) !important][common]server_addr = 192.168.52.79server_port = 7000[gost]type = tcplocal_ip = 127.0.0.1local_port = 18080remote_port = 18080
作为客户端启动 frpc
[backcolor=rgb(248, 248, 248) !important]$ ./frpc -c frpc-deployment.ini2020/11/30 14:59:30 [I] [proxy_manager.go:300] proxy removed: []2020/11/30 14:59:30 [I] [proxy_manager.go:310] proxy added: [gost]2020/11/30 14:59:30 [I] [proxy_manager.go:333] visitor removed: []2020/11/30 14:59:30 [I] [proxy_manager.go:342] visitor added: []2020/11/30 14:59:30 [I] [control.go:246] [f51d0bf5d26ef627] login to server success, get run id [f51d0bf5d26ef627], server udp port [0]2020/11/30 14:59:30 [I] [control.go:169] [f51d0bf5d26ef627] [gost] start proxy success
至此通道就搭建完成了,如图所示。
3.3 启用代理
机房服务器使用的都是 CentOS 7.6 的系统,需要用到的 yum 和 docker 也都支持通过 HTTP 代理进行软件包和容器镜像的下载,如果使用的是 ubuntu 系统,通过 apt 也可以配置为通过 HTTP 代理下载软件包,以下还是以 CentOS 7.6 系统为例。
yum 启用 http 代理
修改 /etc/yum.conf 文件,添加代理配置
[backcolor=rgb(248, 248, 248) !important]proxy=http://127.0.0.1:18080
我们测试一下代理是否成功
[backcolor=rgb(248, 248, 248) !important]$ sudo yum makecacheLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfileepel/x86_64/metalink                                                                                                                                                                                                 |  23 kB  00:00:01 * base: mirrors.neusoft.edu.cn * epel: ftp.iij.ad.jp * extras: ftp.sjtu.edu.cn * updates: ftp.sjtu.edu.cnbase                                                                                                                                                                                                                 | 3.6 kB  00:00:00docker-ce-stable                                                                                                                                                                                                     | 3.5 kB  00:00:00epel                                                                                                                                                                                                                 | 4.7 kB  00:00:00extras                                                                                                                                                                                                               | 2.9 kB  00:00:00updates                                                                                                                                                                                                              | 2.9 kB  00:00:00(2/3): epel/x86_64/primary_db                                                                           20% [===================                                                                          ] 790 kB/s | 4.6 MB  00:00:22 ETA
代理看起来没有问题,我们来安装 git 试试。
[backcolor=rgb(248, 248, 248) !important]$ sudo yum install -y gitLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile * base: mirrors.neusoft.edu.cn * epel: d2lzkl7pfhq30w.cloudfront.net * extras: ftp.sjtu.edu.cn * updates: ftp.sjtu.edu.cnResolving Dependencies--> Running transaction check---> Package git.x86_64 0:1.8.3.1-23.el7_8 will be installed--> Processing Dependency: perl-Git = 1.8.3.1-23.el7_8 for package: git-1.8.3.1-23.el7_8.x86_64--> Processing Dependency: perl(Git) for package: git-1.8.3.1-23.el7_8.x86_64--> Running transaction check---> Package perl-Git.noarch 0:1.8.3.1-23.el7_8 will be installed--> Finished Dependency ResolutionDependencies Resolved============================================================================================================================================================================================================================================ Package                                                 Arch                                                  Version                                                            Repository                                           Size============================================================================================================================================================================================================================================Installing: git                                                     x86_64                                                1.8.3.1-23.el7_8                                                   base                                                4.4 MInstalling for dependencies: perl-Git                                                noarch                                                1.8.3.1-23.el7_8                                                   base                                                 56 kTransaction Summary============================================================================================================================================================================================================================================Install  1 Package (+1 Dependent package)Total download size: 4.5 MInstalled size: 22 MDownloading packages1/2): perl-Git-1.8.3.1-23.el7_8.noarch.rpm                                                                                                                                                                          |  56 kB  00:00:01(2/2): git-1.8.3.1-23.el7_8.x86_64.rpm                                                                                                                                                                               | 4.4 MB  00:00:06--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Total                                                                                                                                                                                                       669 kB/s | 4.5 MB  00:00:06Running transaction checkRunning transaction testTransaction test succeededRunning transaction  Installing : perl-Git-1.8.3.1-23.el7_8.noarch                                                                                                                                                                                         1/2  Installing : git-1.8.3.1-23.el7_8.x86_64                                                                                                                                                                                              2/2  Verifying  : git-1.8.3.1-23.el7_8.x86_64                                                                                                                                                                                              1/2  Verifying  : perl-Git-1.8.3.1-23.el7_8.noarch                                                                                                                                                                                         2/2Installed:  git.x86_64 0:1.8.3.1-23.el7_8Dependency Installed:  perl-Git.noarch 0:1.8.3.1-23.el7_8Complete!
太令人激动了,我们的代理起作用了,接下来可以愉快的安装软件了。
docker 启用 http 代理
首先需要通过 yum 安装 docker 服务,关于 docker 的安装本文不再说明,请参考官方文档 Install Docker Engine on CentOS。安装完 docker 服务之后,通过以下步骤来配置Docker 服务使用 HTTP 代理
创建目录和文件
[backcolor=rgb(248, 248, 248) !important]sudo mkdir -p /etc/systemd/system/docker.service.dsudo touch /etc/systemd/system/docker.service.d/http-proxy.conf
添加以下内容到配置文件 http-proxy.conf 中
[backcolor=rgb(248, 248, 248) !important][Service]Environment="HTTP_PROXY=http://127.0.0.1:18080"Environment="NO_PROXY=localhost,127.0.0.1"
重启 docker 服务,使得配置生效
[backcolor=rgb(248, 248, 248) !important]sudo systemctl daemon-reloadsudo systemctl restart docker
验证配置
[backcolor=rgb(248, 248, 248) !important]sudo systemctl show --property=Environment dockerEnvironment=HTTP_PROXY=http://127.0.0.1:18080 NO_PROXY=localhost,127.0.0.1
我们来运行一个 docker 镜像试试
[backcolor=rgb(248, 248, 248) !important]$ sudo docker run hello-worldUnable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-world0e03bdcc26d7: Pull completeDigest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323Status: Downloaded newer image for hello-world:latestHello from Docker!This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.    (amd64) 3. The Docker daemon created a new container from that image which runs the    executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it    to your terminal.To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID: https://hub.docker.com/For more examples and ideas, visit: https://docs.docker.com/get-started/
通过代理拉取 docker 镜像也成功了,这样就可以直接从我们的公网上搭建的 docker registry 服务拉取待部署的镜像,真是太省事了。
命令行全局启用代理
也可以在 shell 中启用 HTTP 代理,请根据需要启用
[backcolor=rgb(248, 248, 248) !important]$ export HTTP_PROXY=”http://127.0.0.1:18080
在机房其它服务器上使用 HTTP 代理
我们是把 frp 安装到 172.22.121.110 这台服务器上并启动了 frps 服务,通过 frp 的穿透,相当于在 172.22.121.110 这台服务器上启动了一个 HTTP 代理,在 172.22.121.110 本机上使用 http://127.0.0.1:18080 来使用 HTTP 代理,在机房其它服务器上则需要使用 http://172.22.121.110:18080 来使用 HTTP 代理。
四、实验测试环境的搭建
需要 CentOS 7 环境,且虚拟机不能访问外网
  • 使用 vagrant 启动一个 centos/7 虚拟机,并且使用桥接模式获取局域网 IP, 例如 IP 为 192.168.52.79
  • 在网关路由器上进行配置使得测试的 CentOS 7 虚拟机无法访问互联网,如果网关路由器是个 linux based 的系统则可以尝试用 iptables 限制虚拟机访问互联网: iptables -A FORWARD -s 192.168.52.79 -j DROP
五、远程维护
通过前面关于 frp 的使用,不难看出来,只要在部署控制主机再启动一个 frp 客户端,把机房或者部署控制主机的 SSH 端口映射到到公网中的 frp 服务器可以了。当然这种情况下还在需要多做一些配置工作,比如在部署控制主机上配置好服务的自启动,然后把部署控制主机放在客户的办公室,在需要远程维护的时候,开机就好。
对于远程维护,使用 frp 可能不太安全,毕竟直接把 SSH 端口暴露在公网之中,所以在这种情况下,推荐使用 WireGuard 进行 SDWAN 组网,把部署控制主机加入到自建的私有网络中。
(完)
本文为原创文章,转载需注明出处,网站 https://lewang.dev


您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|boway Inc. ( 冀ICP备10011147号 )

GMT+8, 2024-4-19 19:53 , Processed in 0.092728 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表