网络正向代理与反向代理

网络代理是一种存在与网络的中间人,代理是存在与客户端和服务器之间的角色,从用途上看可以分为正向代理和反向代理。一直以来对这两个名词理解不是特别深刻,经过前段时间的项目,对这两种代理有了更深的认识,用一句话来归纳两者的区别就是“两者服务的对象不同”。

正向代理是代理客户端的,是为客户端服务的,可以想到的用途有局域网内访问外网、翻墙、局域网加速、网络访问控制、隐私保护等等。正向代理试图以客户的身份来访问服务端,正向代理更倾向于解决客户或是客户的管理者的问题,例如公司对员工上网的限制,公司节省流量的考虑,个人要访问国外资源的需要等等。典型的正向代理软件有:Squid、Tinyproxy等等。最常用的就属Squid了,Squid的一些相关好的资料请参考本文最后的参考资料。值得一提的是Squid是可以代理http和https协议的,其中代理https协议并不存在大家认为的安全性问题(https协议本身就是防中间人攻击的),具体代理原理可以参考HTTP 代理原理及实现(一)

反向代理则是代理服务端的,是为服务端服务的,可以想到的用途有负载均衡、SSL加密、缓存静态资源、压缩等。常见的反向代理软件有Nginx、Haproxy、Apache等等,如果只谈负载均衡还有一些工作在网络层的软件如LVS或是硬件F5等。反向代理服务器可以对客户端发来的请求进行负载均衡转发(支持多种负载均衡策略),更改请求的HOST头,对客户请求进行过滤(如设置黑名单等)等。我们项目中使用的Nginx,主要用来进行负载均衡、请求转发。

近期我自己也写了个简单的反向代理,它可以对于特定的URL请求进行过滤,并对服务器返回的内容进行修改,替换成你需要的内容。这个在我们的测试中解决了外网访问的问题,因为外网使用的域名和内网测试不同,为了屏蔽差异,我通过这个反向代理对个别URL的内容进行了修改,修改成外网可使用的内容。具体代码见hrcproxy.go,代码采用go语言编写,目前实现了简单的字符串替换,后续考虑再增加表达式相关的替换。

参考资料:

  1. 正向代理与反向代理的区别
  2. Squid中文权威指南
  3. 区网控制者: Proxy 服务器 - Squid
  4. 构建Squid代理服务器
  5. HTTP 代理原理及实现(一)
  6. Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问
  7. Reverse Proxy In Go
  8. How DNS lookups work when using an HTTP proxy (or not) in IE
  9. 三种解密 HTTPS 流量的方法介绍
  10. ZeroSSL,支持多域名的在线 Let’s Encrypt SSL 证书申请工具

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

网络正向代理与反向代理

网络代理是一种存在与网络的中间人,代理是存在与客户端和服务器之间的角色,从用途上看可以分为正向代理和反向代理。一直以来对这两个名词理解不是特别深刻,经过前段时间的项目,对这两种代理有了更深的认识,用一句话来归纳两者的区别就是“两者服务的对象不同”。

正向代理是代理客户端的,是为客户端服务的,可以想到的用途有局域网内访问外网、翻墙、局域网加速、网络访问控制、隐私保护等等。正向代理试图以客户的身份来访问服务端,正向代理更倾向于解决客户或是客户的管理者的问题,例如公司对员工上网的限制,公司节省流量的考虑,个人要访问国外资源的需要等等。典型的正向代理软件有:Squid、Tinyproxy等等。最常用的就属Squid了,Squid的一些相关好的资料请参考本文最后的参考资料。值得一提的是Squid是可以代理http和https协议的,其中代理https协议并不存在大家认为的安全性问题(https协议本身就是防中间人攻击的),具体代理原理可以参考HTTP 代理原理及实现(一)

反向代理则是代理服务端的,是为服务端服务的,可以想到的用途有负载均衡、SSL加密、缓存静态资源、压缩等。常见的反向代理软件有Nginx、Haproxy、Apache等等,如果只谈负载均衡还有一些工作在网络层的软件如LVS或是硬件F5等。反向代理服务器可以对客户端发来的请求进行负载均衡转发(支持多种负载均衡策略),更改请求的HOST头,对客户请求进行过滤(如设置黑名单等)等。我们项目中使用的Nginx,主要用来进行负载均衡、请求转发。

近期我自己也写了个简单的反向代理,它可以对于特定的URL请求进行过滤,并对服务器返回的内容进行修改,替换成你需要的内容。这个在我们的测试中解决了外网访问的问题,因为外网使用的域名和内网测试不同,为了屏蔽差异,我通过这个反向代理对个别URL的内容进行了修改,修改成外网可使用的内容。具体代码见hrcproxy.go,代码采用go语言编写,目前实现了简单的字符串替换,后续考虑再增加表达式相关的替换。

参考资料:

  1. 正向代理与反向代理的区别
  2. Squid中文权威指南
  3. 区网控制者: Proxy 服务器 - Squid
  4. 构建Squid代理服务器
  5. HTTP 代理原理及实现(一)
  6. Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问
  7. Reverse Proxy In Go
  8. How DNS lookups work when using an HTTP proxy (or not) in IE
  9. 三种解密 HTTPS 流量的方法介绍
  10. ZeroSSL,支持多域名的在线 Let’s Encrypt SSL 证书申请工具

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

搭建通往私有内网web服务器的路

项目开发分为生产环境和测试环境,有很多时候测试环境也需要和外部系统互通,目前主要是采用互联网的形式。我们的测试环境更特殊一些,他不仅仅是在内网,而且是在内部私有云上,外部只能通过VPN访问。而且这个VPN有很多限制,例如:

  • 只能使用cisco anyconnect客户端,这个客户端只能安装在windows机器上,不支持Linux;
  • 只要启动了VPN客户端,这个windows机器就只能访问云上的测试环境,不能访问互联网了;
  • VPN登录需要用户名和密码,如果其他单位客户要使用,我们需要给他们提供用户名密码,有安全问题;
  • VPN安装过程复杂,需要安装证书等,有些机器无法安装成功。

我们开发的应用是要对外发布互联网接口的,客户需要调我们的接口来完成他们需要的功能。在生产环境下没什么问题,因为生产环境有自己的域名也支持互联网访问。但在测试环境就有问题了,客户如何调用我们在云上的服务就是一个难题。在经过引导客户装VPN遇到各种问题,被客户各种吐槽后,我们开始想解决之道。一个方案是打通一条不使用VPN的路,可以让互联网直接访问,这需要协调多个部门,开通各种网络访问关系,很复杂。另一个方案就是现在要讲的方案,通过虚拟机支持多网卡的特点,我们可以实现在一台物理机同时访问互联网和vpn,结合NAT穿越可以实现通过互联网直接访问内网服务器。大体的网络配置图如下:

网络配置示意图

这里有几个要点:

  1. 虚拟机要有两个网卡,其中网卡1可以访问互联网(可以是桥接或NAT模式),这个网卡是用来给VPN客户端使用的;另一个网卡2要配置成host only,实现和物理主机的双向访问;
  2. 在虚拟机中要安装nginx,监听80端口,并将请求转发到内网服务器的nginx服务器上,转发http请求;
  3. 在物理机中安装nginx,监听80或443端口,将收到的http/https请求转发到虚拟机的nginx服务器的80端口;
  4. 在物理机中安装frpc客户端,联通与互联网服务器的frps服务器的交互,并将请求转发给本机nginx服务器;
  5. 在互联网上的服务器中安装frps服务器,将收到的请求转发给frpc客户端;
  6. 购买一个公网的域名,指向这个互联网服务器,一个域名很便宜,一年8元就可以了。

物理机的nginx和frpc配置见这里,大家可以参考使用。

参考资料

  1. 使用内网穿透工具frp
  2. ZeroSSL,支持多域名的在线 Let’s Encrypt SSL 证书申请工具
  3. frp github
  4. Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

搭建通往私有内网web服务器的路

项目开发分为生产环境和测试环境,有很多时候测试环境也需要和外部系统互通,目前主要是采用互联网的形式。我们的测试环境更特殊一些,他不仅仅是在内网,而且是在内部私有云上,外部只能通过VPN访问。而且这个VPN有很多限制,例如:

  • 只能使用cisco anyconnect客户端,这个客户端只能安装在windows机器上,不支持Linux;
  • 只要启动了VPN客户端,这个windows机器就只能访问云上的测试环境,不能访问互联网了;
  • VPN登录需要用户名和密码,如果其他单位客户要使用,我们需要给他们提供用户名密码,有安全问题;
  • VPN安装过程复杂,需要安装证书等,有些机器无法安装成功。

我们开发的应用是要对外发布互联网接口的,客户需要调我们的接口来完成他们需要的功能。在生产环境下没什么问题,因为生产环境有自己的域名也支持互联网访问。但在测试环境就有问题了,客户如何调用我们在云上的服务就是一个难题。在经过引导客户装VPN遇到各种问题,被客户各种吐槽后,我们开始想解决之道。一个方案是打通一条不使用VPN的路,可以让互联网直接访问,这需要协调多个部门,开通各种网络访问关系,很复杂。另一个方案就是现在要讲的方案,通过虚拟机支持多网卡的特点,我们可以实现在一台物理机同时访问互联网和vpn,结合NAT穿越可以实现通过互联网直接访问内网服务器。大体的网络配置图如下:

网络配置示意图

这里有几个要点:

  1. 虚拟机要有两个网卡,其中网卡1可以访问互联网(可以是桥接或NAT模式),这个网卡是用来给VPN客户端使用的;另一个网卡2要配置成host only,实现和物理主机的双向访问;
  2. 在虚拟机中要安装nginx,监听80端口,并将请求转发到内网服务器的nginx服务器上,转发http请求;
  3. 在物理机中安装nginx,监听80或443端口,将收到的http/https请求转发到虚拟机的nginx服务器的80端口;
  4. 在物理机中安装frpc客户端,联通与互联网服务器的frps服务器的交互,并将请求转发给本机nginx服务器;
  5. 在互联网上的服务器中安装frps服务器,将收到的请求转发给frpc客户端;
  6. 购买一个公网的域名,指向这个互联网服务器,一个域名很便宜,一年8元就可以了。

物理机的nginx和frpc配置见这里,大家可以参考使用。

参考资料

  1. 使用内网穿透工具frp
  2. ZeroSSL,支持多域名的在线 Let’s Encrypt SSL 证书申请工具
  3. frp github
  4. Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》