缘由
最近我们接到一个客户项目,客户所有的东西必须部署在独立内网里面的,但是整个程序有一部分是需要访问外网的,可以理解为调用外部网址接口,所以我们就要出一个方案来解决这个问题。假如内网服务器列表如下
服务器名称 | 操作系统 | IP | 描述 |
服务器A | Centos7.9 | 192.168.1.10 | 程序服务器 |
服务器B | Centos7.9 | 192.168.1.11 | 程序服务器 |
服务器C | Centos7.9 | 192.168.1.12 | 这台机器可以上外网,交换机上专门配置的 |
技术难点
由于我个人对于网络这块连半吊子都算不上,所以只能说硬着头皮上 并且还要考虑安全问题。在做的过程中请教了以前安居客的网络工程师大神,一路走下来,算是磕磕碰碰搞定了,虽然不是那么正统,最起码问题解决了。遇到问题主要如下
需要一个 http/https 代理, 让程序的接口可以访问出去
yum 安装软件 如何在线安装
git 可以使用ssh协议进行clone 更新
禁止其他服务器访问 服务器C的 SSH端口
selenium 程序设置
HTTP/HTTPS代理
这个我知道服务器可以通过设置 http_proxy 和 https_proxy 来解决命令行下的类似 wget、curl 命令的问题。但是代理服务器服务如何来搭建以及技术选型问题。关于技术选型我最开始想用nginx在网上查了很多资料 发现这个会比较麻烦需要手动编译,并且还会有各种操作问题。后来在朋友的推荐下选择了Squid ,主要是太简单了。
安装Squid
在服务器C上面安装这个软件,执行如下命令。默认Squid 启动端口是3128
yum install squid -y ##安装squid服务 systemctl start squid ##开启squid服务 systemctl enable squid ##设置squid服务是开机启动
设置防火墙策略
##允许服务器A和服务器B访问端口 firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.10" port protocol="tcp" port="3128" accept" firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.11" port protocol="tcp" port="3128" accept"
设置代理变量
在服务器A和服务器B上面设置环境变量,执行如下命令
##执行如下命令,可以保存当前会话可以访问外网 http_proxy=http://192.168.1.10:3128 https_proxy=http://192.168.1.10:3128 export http_proxy export https_proxy
如下图 发现居然可以了
由于上面是临时变量生效,可以通过配置解决这个问题
###编辑/etc/profile 添加如下内容 #http和https代理设置 HTTP_PROXY=http://192.168.1.10:3128 HTTPS_PROXY=http://192.168.1.10:3128 export HTTP_PROXY export HTTPS_PROXY
然后执行如下命令
$ source /etc/profile
Yum在线安装
由于yum命令不走上面设置的两个边路,所以需要单独设置。直接在 /etc/yum.conf 文件中加入一下配置即可
###编辑/etc/yum.conf proxy=http://192.168.1.10:3128
DNS域名解析
由于服务器A和B都不能解析域名,就需要通过C来进行转发解析了。
在服务器C上面操作
安装DNS服务端
yum install bind bind-untils
修改配置文件(/etc/named.conf)
将如下改成 listen-on port 53 { 127.0.0.1; }; listen-on-v6 port 53 { ::1; }; allow-query { localhost; }; 改成 listen-on port 53 { any; }; listen-on-v6 port 53 { any; }; allow-query { any; };
增加转发(/etc/named.conf)
forwarders { 114.114.114.114; 8.8.8.8; }; forward only;
启动服务
systemctl enable named service named start
在服务器A和B修改解析服务
vim /etc/resolv.conf 改成服务器C的地址就行了
Git 使用SSH协议
git默认执行http和ssh协议,但是http每次都要输入用户名和密码,虽然有一些方法可以解决,但是泄露用户名和密码更麻烦,所以我选择使用ssh协议。通过互联网搜索发现可以通过socks5进行代理转发。
socks5服务
关于这块就不在讲解,因为可能会因为关键词被封。非常麻烦。大家可以搜索下就知道socks5有哪些了。唯一大家要注意的就是 服务器C 上面安装之后启动服务器端,服务器A和服务器B 上面安装之后启动客户端。
服务器C上面的主要启动服务是如下
/usr/bin/ssserver -c /etc/socks5_server.json -d start
服务器A和服务器B的启动命令如下
/usr/bin/sslocal -c /etc/socks5_client.json -d start
客户端的关于服务配置是配置服务器C的IP和端口
git配置
需要在当前用户的 ssh配置增加 config 文件,大致意思就是 如果git 服务器是某个域名或者ip 走这个配置,然后将请求通过本地的socks5 服务的 1080端口转发出去。
需要安装 connect-proxy
yum install connect-proxy (如果没有这个包,执行 yum -y install epel-release )
禁止SSH端口访问
这个相对简单很多,直接在服务器C的ssh服务上配置即可。
##修改 /etc/hosts.allow 这个是允许访问的 sshd:192.168.1.18:allow ##修改 /etc/hosts.deny 这个是禁止访问的 sshd:ALL
如上配置就是和,除了 192.168.1.18 (可以是某台安全机器的ip)这个ip 其他都不准连接
Selenium 程序设置
由于我们有一部分程序使用了selenium,关于selenium的相关知识请参考专门文章:http://www.jixuejima.cn/article/310.html 。这个也比较简单,主要在代码中加入一行代码就行了,如下代码
chromeOptions.add_argument('--proxy-server=http://192.168.1.12:3128')
个人收获
这种网络情况是我第一次配置,以前没有这种场景要这么配置,所以感觉还是挺陌生,但是并不慌,因为我知道一定可以解决,只是时间问题。未来肯定还会遇到更复杂的网络情况的。这种网络情况也越来越要求我们的程序要考虑多种场景了