缘由

    最近我们接到一个客户项目,客户所有的东西必须部署在独立内网里面的,但是整个程序有一部分是需要访问外网的,可以理解为调用外部网址接口,所以我们就要出一个方案来解决这个问题。假如内网服务器列表如下


服务器名称操作系统IP描述
服务器ACentos7.9192.168.1.10程序服务器
服务器BCentos7.9192.168.1.11程序服务器
服务器CCentos7.9192.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')

个人收获

    这种网络情况是我第一次配置,以前没有这种场景要这么配置,所以感觉还是挺陌生,但是并不慌,因为我知道一定可以解决,只是时间问题。未来肯定还会遇到更复杂的网络情况的。这种网络情况也越来越要求我们的程序要考虑多种场景了