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

标签: | 发表时间:2023-03-20 16:20 | 作者:
出处:https://lewang.dev

创业这段时间以来,我们的 IoT 系统已经在不少客户的机房做了私有化部署,客户大多都是机加工厂、商业大楼、医院和大学实验室等,客户的机房都有一个相同的特点:私有云,与外网隔离,不能访问互联网。或者更为准确的说,是我们部署的服务器不能访问互联网,在没有互联网访问权限的情况下,系统的包管理工具(yum/apt/docker)都无法使用了,在这种情况下进行系统部署安装,费时费力,而且无法进行远程部署维护,也大大增加了项目的实施成本。

在最近的一个客户项目的实施过程中,看到客户的一些其他供应商在系统部署过程中非常艰难,甚至是 CentOS 系统初始化和 Docker 的安装就花掉了两个礼拜的人力,不排除一些供应商这样折腾会给他的客户留下工作敬业钱花的值的好印象,但对于我们这样的小创业公司来说,这样的时间浪费和低效是无法承担的成本,因为来实操部署的人就是公司老板本人了,我也不想出差在客户这里待上两个礼拜。

在工作完成之后,想想可以把解决问题的方法记录一下,也许能给遇到相同问题的同行一些启发和帮助。好了,废话不多说,接下来我们就来解决这个无外网的部署问题,顺便再解决一下远程维护的问题。

一、面临的问题 #

在部署和维护一个私有化企业内部使用且无互联网访问的系统中,可能会面临以下问题:

  • 机房服务器无法访问 Internet
  • 可通过接入企业内网来访问服务器,而从服务器无法直连办公室网络,即机房和办公室在不同的网段
  • 无互联网访问权限的情况下,无法直接使用系统的配置工具,如 yum/apt/docker 等,配置系统和部署服务费时费力
  • 无法远程进行维护

客户内网拓扑示意图,此处省略了防火墙,简化拓扑图的复杂度,如下:

network-topo

网络拓扑图说明:

  • 机房和办公室不在一个网段
  • 机房网段假设为 172.22.0.0/16,办公室内网 WiFi 的网段为 192.168.137.0/24
  • 机房服务器之间是互通的,办公室可以 ping 通机房服务器,在机房服务器上无法 ping 通办公室部署控制主机,这里假设办公室网络作为一个 NAT 放在上层交换机后面
  • 内网没有互联网访问权限,包括机房服务器和办公室内网 WiFI

二、解决问题的方法 #

既然是由于机房服务器没有互联网访问权限,不能联网下载安装包,那就想办法让机房服务器可以连接互联网或者搭建内网的软件包镜像服务,于是想到一些方法来达到目的:

  1. 告知客户问题,申请开通互联网访问权限,可以限定为指定的网址和协议(HTTP/HTTPS),需要远程维护的化,还需要申请可以连接到服务器的 VPN。这个方法在需要客户的进行审批,可能时间比较长。我们的客户中有不少都没有自建 VPN,或这不方便给我们开通 VPN,另外也无法开通需要我们部署的服务器的互联网访问权限,所以不能使用这个方法

  2. 在客户机房放置可以通过 4G 上网的堡垒机,堡垒机接入客户机房网络。在客户机房放一个堡垒机,虽然说是堡垒机,但可能客户那边的机房管理也还是不容许放置这样的机器的,所以也不能使用这个方法

  3. 搭建 yum(CentOS)/apt(Debian/Ubuntu)/docker 的内网镜像服务,搭建内网镜像服务可能就是一个比较艰巨的任务,难以接受给自己又添加了一个艰难的任务,此方法也作罢

  4. 通过在办公室网里放置部署控制机,同时连接内网和 4G 路由器提供的外网(互联网),在部署控制机上搭建 SDWAN 或者 HTTP 代理,yum/apt/docker 都支持 HTTP 代理,这样修改系统配置之后,就可以通过代理安装部署服务,这个方法比较简单,而且几乎不需要客户的参与就可以完成。不过也有一些前置条件,例如:

    • 办公室中主机可以接入客户网络

    • 客户服务器允许办公室网络中主机通过 TCP 或者 UDP 访问其任意或者指定的端口

    • 客户办公室的 4G 网络信号要足够好,这样可以提供更好的外网速度

    • 拥有服务器的 root 管理员权限(需要安装软件和修改系统配置)

通过权衡利弊,我们最终使用的是第 4 个方法来搭建的,下面来讲讲搭建的过程。

三、搭建可以访问互联网的部署环境 #

我们希望使用第 4 个方法来搭建部署的网络环境,通过测试客户的内网环境,几个前置条件都已满足,这样第 4 个方法的搭建过程不需要客户的参与就可以完成。首先要解决的是网络通路问题,我们在客户办公室添加了一台 4G 路由器,添加 4G 路由器之后的网络拓扑图如图:

network-topo

部署控制主机连接好 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 模块的工控主机等等,原则上只要能建立一个互联网访问的通道就行了。

接下来我们再一起探讨一下如果利用开源软件来搭建互联网访问的通道,如图:

network-topo

现在解决问题的思路应该更加清晰了:需要在机房服务器和办公室部署控制主机之间建立一个通道。建立通道可以使用的开源软件有不少,相信很多人因为某些原因都或多或少使用过,从我自己长期实际使用的经验来看, 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,总结一下需要进行的安装步骤:

  1. 在部署控制主机上面配置路由,使得部署控制主机可以访问机房网络也可以访问互联网
  2. 其中一台机房服务器上安装 frp,作为服务端启动
  3. 部署控制主机上安装 gost,启动一个 HTTP 代理服务器
  4. 部署控制主机上安装 frp,作为客户端启动

以下部署过程以部署控制主机系统为 MacOS,机房服务器系统为 CentOS 7.6 为例,如果读者在实际部署过程中由于系统与本文不同而遇到问题不知如何解决,比如服务器为 Ubuntu,部署机是 Windows 10,欢迎留言一起探讨。

在部署控制主机上面配置路由 #

如果部署控制主机和机房服务器在同一个子网,则不需要添加路由。由于本次部署控制主机和机房服务器不在一个子网,在接了两个网卡之后,在部署控制主机上的 IP 包是不知道如何路由到机房网络的,如果不做路由设置,172.22.0.0/16 网段会走系统默认的路由,可能无法访问到机房网络。所以在部署控制主机上( MacOS 系统)添加以下路由:

        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 安装包

        $ 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 文件,内容为

        [common]bind_port=7000

找到 frps 命令后启动:

        $ ./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 包,并且添加执行权限

        $ gunzip gost-darwin-amd64-2.11.1.gz$ chmod +x gost-darwin-amd64-2.11.1

启动 HTTP 代理, 在端口 18080 上监听

        $ ./gost-darwin-amd64-2.11.1 -L http://:18080

在控制主机上安装 frp #

解压 frp 安装包后在目录中新建 frpc-deployment.ini 文件,内容为

        [common]server_addr=192.168.52.79server_port=7000[gost]type=tcplocal_ip=127.0.0.1local_port=18080remote_port=18080

作为客户端启动 frpc

        $ ./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

至此通道就搭建完成了,如图所示。

network-topo

3.3 启用代理 #

机房服务器使用的都是 CentOS 7.6 的系统,需要用到的 yum 和 docker 也都支持通过 HTTP 代理进行软件包和容器镜像的下载,如果使用的是 ubuntu 系统,通过 apt 也可以配置为通过 HTTP 代理下载软件包,以下还是以 CentOS 7.6 系统为例。

yum 启用 http 代理 #

修改 /etc/yum.conf文件,添加代理配置

        proxy=http://127.0.0.1:18080

我们测试一下代理是否成功

        $ sudo yum makecacheLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfileepel/x86_64/metalink|23kB  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%[===================]790kB/s|4.6 MB  00:00:22 ETA

代理看起来没有问题,我们来安装 git 试试。

        $ 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_8forpackage: git-1.8.3.1-23.el7_8.x86_64--> Processing Dependency: perl(Git)forpackage: 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 ResolutionDependenciesResolved============================================================================================================================================================================================================================================Package                                                 Arch                                                  Version                                                            RepositorySize============================================================================================================================================================================================================================================Installing:git                                                     x86_64                                                1.8.3.1-23.el7_8                                                   base                                                4.4 MInstallingfordependencies:perl-Git                                                noarch                                                1.8.3.1-23.el7_8                                                   base56kTransactionSummary============================================================================================================================================================================================================================================Install1Package(+1 Dependent package)Total download size: 4.5 MInstalled size:22MDownloading packages:(1/2): perl-Git-1.8.3.1-23.el7_8.noarch.rpm|56kB  00:00:01(2/2): git-1.8.3.1-23.el7_8.x86_64.rpm|4.4 MB  00:00:06--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Total669kB/s|4.5 MB  00:00:06Running transaction checkRunning transactiontestTransactiontestsucceededRunning transactionInstalling : perl-Git-1.8.3.1-23.el7_8.noarch                                                                                                                                                                                         1/2Installing : git-1.8.3.1-23.el7_8.x86_64                                                                                                                                                                                              2/2Verifying  : git-1.8.3.1-23.el7_8.x86_64                                                                                                                                                                                              1/2Verifying  : 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 代理

创建目录和文件

        sudo mkdir -p /etc/systemd/system/docker.service.dsudo touch /etc/systemd/system/docker.service.d/http-proxy.conf

添加以下内容到配置文件 http-proxy.conf 中

        [Service]Environment="HTTP_PROXY=http://127.0.0.1:18080"Environment="NO_PROXY=localhost,127.0.0.1"

重启 docker 服务,使得配置生效

        sudo systemctl daemon-reloadsudo systemctl restart docker

验证配置

        sudo systemctl show --property=Environment dockerEnvironment=HTTP_PROXY=http://127.0.0.1:18080NO_PROXY=localhost,127.0.0.1

我们来运行一个 docker 镜像试试

        $ sudo docker run hello-worldUnable to find image'hello-world:latest'locallylatest: Pulling from library/hello-world0e03bdcc26d7: PullcompleteDigest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323Status: Downloaded newer imageforhello-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 theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto 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 代理,请根据需要启用

        $exportHTTP_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 组网,把部署控制主机加入到自建的私有网络中。

相关 [机房 访问 互联网] 推荐:

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

- -
创业这段时间以来,我们的 IoT 系统已经在不少客户的机房做了私有化部署,客户大多都是机加工厂、商业大楼、医院和大学实验室等,客户的机房都有一个相同的特点:私有云,与外网隔离,不能访问互联网. 或者更为准确的说,是我们部署的服务器不能访问互联网,在没有互联网访问权限的情况下,系统的包管理工具(yum/apt/docker)都无法使用了,在这种情况下进行系统部署安装,费时费力,而且无法进行远程部署维护,也大大增加了项目的实施成本.

伯纳斯·李称访问互联网是一项“人权”

- 丁丁 - Solidot
在创造World Wide Web二十年后,蒂姆·伯纳斯·李认为,人们已经离不开互联网,访问互联网应该被视为一项基本权利. 在MIT举行的一个座谈会上,伯纳斯·李将访问互联网比作是获取水. 尽管获得水是一项更为重要的基本权利,因为没有水人类就活不下去. 但访问互联网也应当被认为是一项权利,因为无法访问网络的人将会落在联网的人后面.

Facebook 因为推错了 BGP 路由的配置,相当于直接把自己的所有系统从互联网上断开了。没法快速恢复是因为平时通过互联网工作的员工也访问不到。更厉害的是门禁系统也在断开的系统之内,员工的门禁卡失效没法物理进入机房维护。。

- - 抽屉新热榜
Facebook 因为推错了 BGP 路由的配置,相当于直接把自己的所有系统从互联网上断开了. 没法快速恢复是因为平时通过互联网工作的员工也访问不到. 更厉害的是门禁系统也在断开的系统之内,员工的门禁卡失效没法物理进入机房维护. 想看更多劲爆内容,请下载抽屉新热榜客户端 :.

Android用户每天花1小时访问互联网和应用

- 洞箫 - cnBeta.COM
调研公司尼尔森今日发布的数据显示,Android用户平均每天花费56分钟的时间访问互联网和应用. 其中,访问应用的时间占67%,访问互联网的时间占33%. 在访问应用的时间中,43%被前10大Android应用占用,61%被前50大Android应用占用.

腾讯高管一篇满是干货的演讲:访问美国互联网公司后的感悟

- - i黑马
用户体验设计(UXD)是当今互联网和移动互联网行业最火热的设计概念,其发源于美国软件行业现在又在中国蓬勃发展,其中的从业者肯定非常关心目前用户体验领域在国际上的发展现状,国外最新的设计趋势与团队情况,我们又该从这些先进的设计方法与流程中学习到什么. 5月25日下午,【腾讯大讲堂·移动互联网】系列讲座第8期,邀请到了腾讯移动互联网设计中心总监周陟,带着他最近到访美国各大互联网公司的设计考察经历,既有具体的设计团队交流见闻,也有几款APP制定团队访问行程的秘籍,在深圳贝特咖啡馆进行了长达三个小时的分享…….

DNSPod加入“全球互联网加速计划”,将带来更快的访问速度与更有针对性的内容

- - 36氪
2009年5月,暴风影音海量用户的域名解析请求致使几省网络瘫痪,而很多人也通过这次事故认识了免费域名解析服务商 DNSPod. 截止2012年7月,DNSPod已经拥有50多万用户,近80万个域名,每天的请求量近100亿次. 我们刚刚了解到,DNSPod 现已首先通过Google 组织的 “全球互联网加速计划(Global Internet Speedup)”审核,并将于2013年初开始提供精确定位到单个访问IP 的智能解析服务.

移动互联网=移动+互联网?

- 可可 - It Talks-魏武挥的blog
从名词上看,移动互联网似乎就是互联网加上一个移动. 但移动互联网远不是“移动的互联网”那么简单. 它的本质——网络部分,就和互联网大不相同;而它的表现——移动部分,也正因为移动,造就了很多和互联网相当不一样的商业机会. 而更重要也是很多人并没有注意到的是,它可能会改变整整一代人的信息处理习惯. 从网络部分而言,我们都知道,理论上互联网是没有拥有者的.

重新索引互联网

- keso - 爱范儿 · Beats of Bits
重新索引互联网 Facebook 雇佣公关抹黑 Google 的过程已经水落石出. 问题是: Google 那么多产品, Facebook 为何对 Social Circle 这么敏感. Google 号称自己的使命是“索引互联网”. 这件事的难点并非派出多少爬虫,而是对收集来的海量内容做排序:怎样让真正重要的网页,的排到 Google 搜索结果的前面来.

中美互联网差异

- leeking001 - 互联网的那点事
在互联网以指数的速度发展的今天,人们的生活已经离不开网络,那么,这两个打过在互联网方面有什 么差异呢. 我们从下面一系列与互联网相关的参数来比较两个国家,比如:互联网用户数量,互联网普及率,互联网连接的速度,域名数量,受欢迎的网站,网页浏 览器,操作系统等等. 十年前,美国是世界上的互联网头号大国,而现在很明显已经不是,取而代之的是中国.

重新索引互联网

- Ray - 最新文章 - UCD大社区
重新索引互联网 Facebook 雇佣公关抹黑 Google 的过程已经水落石出. 问题是: Google 那么多产品, Facebook 为何对 Social Circle 这么敏感. Google 号称自己的使命是“索引互联网”. 这件事的难点并非派出多少爬虫,而是对收集来的海量内容做排序:怎样让真正重要的网页,的排到 Google 搜索结果的前面来.