jinanxiaolaohu

背景


  • 产品部署于内网,服务器仅有内网访问权限,无法连接互联网.
  • 产品内部有OCR,发票识别等高级场景需要连接外网的云服务.
  • 客户可以提供一个dmz区域能够上外网的服务器,并且设置正向代理.

正向代理与反向代理


  • 不同于反向代理,正向代理必须修改程序.
  • 反向代理的原理:在客户dmz服务器侧使用反向代理的机制代理公网服务器,并且向内网暴露https服务,内网产品服务器通过修改/etc/hosts将原本访问云服务器的服务器地址指向到dmz区域提供https服务的服务器来实现内网访问互联网服务,最大的优点是可以不修改程序,最大缺点是每个站点都需要进行处理.
  • 正向代理的原则是在dmz区域的机器设置一个代理, 如果内网服务器要访问外网,需要先登录到正向代理服务器,以正向代理服务器的身份来访问互联网,最大的优点是不区分网站,只要dmz区域可以连接,然后就可以访问.最大的缺点是需要产品修改程序,先登录正向代理服务器再建立https连接.

正向代理的程序修改


  • 参照产品部同事的处理, 修改的事项主要如下:
  • 参考于: https://www.jianshu.com/p/b0d36905d435
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
        if (!StringUtils.isEmpty(ProxyIP)) {
            int port = 80;
            if (!StringUtils.isEmpty(ProxyPort)) {
                port = Integer.valueOf(ProxyPort);
            }
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ProxyIP, port));
            builder.proxy(proxy);
            if (!StringUtils.isEmpty(ProxyUid) || !StringUtils.isEmpty(ProxyPwd)) {
                if ("1".equals(ProxyUid)) {
                    ProxyUid = "";
                }
                if ("1".equals(ProxyPwd)) {
                    ProxyPwd = "";
                }

                String userName = ProxyUid, password = ProxyPwd;
                builder.proxyAuthenticator(new Authenticator() {
                    @Override
                    public Request authenticate(Route route, Response response) throws IOException {
                        //设置代理服务器账号密码
                        String credential = Credentials.basic(userName, password);
                        return response.request().newBuilder()
                                .header("Proxy-Authorization", credential)
                                .build();
                    }
                });
            }
        }

        client = builder.connectTimeout(3, TimeUnit.MINUTES)//设置连接超时时间
                .readTimeout(3, TimeUnit.MINUTES)//设置读取超时时间
                .sslSocketFactory(createSSLSocketFactory(), new TrustAllCerts())
                .hostnameVerifier(new TrustAllHostnameVerifier()).build();
  • 产品的处理比较精巧, 其中注意事项如下
1. 需要修改产品的配置表,增加四行配置信息
ProxyIP  ProxyPort ProxyUid ProxyPwd 
2. 产品在判断有ProxyIP的情况下自动获取后面四项内容, 使用OKHTTP3的方式 建立连接
3. 注意产品需要访问的互联网的网址不需要做任何修改
4. 注意ProxyIP ProxyPort 等信息务必准确,并且保证dmz区域能够访问外网的服务器能够互相联通.
5. Linux可以使用如下命令进行验证. 
 curl --header "Content-type: application/octet-stream"  --header "X-API-KEY:yourkey"  -k -v -x yourip:yourport https://someurl/ai/ocr/v1/receipt/classify
6. Windows 下面可以使用 Windows系统的代理服务器进行验证能够上网

验证产品是否可用


  • 注意输入api key
  • 输入正确的ProxyIP验证可以正常访问,修改为错误的代理IP地址验证无法访问

分类:

技术点:

相关文章: