基于域名的7层转发的实现(NAT+反向代理)

在公司的实际办公网中,因为出口IP只有一个,要实现对外提供服务的话就必须得做端口映射,如果有多个服务要对外开放的话,这只能通过映射不同端口来区分…… 2014-07-31 10:55:08 域名NAT七层 软负载与nginx那些强大的不可不说的功能 当我们打开手机访问点评客户端的时候,访问商户的请求是如何到达对应某台应用服务器的?当有很多XX宽带的用户投诉说我大点评某某域名无法打开但是我们却找不出任何问题的时候,我们就想到会不会是宽带运营商的问题……

在公司的实际办公网中,因为出口IP只有一个,要实现对外提供服务的话就必须得做端口映射,如果有多个服务要对外开放的话,这只能通过映射不同端口来区分……

在公司的实际办公网中,因为出口IP只有一个,要实现对外提供服务的话就必须得做端口映射,如果有多个服务要对外开放的话,这只能通过映射不同端口来区分,这在实际使用过程中非常的痛苦(记忆困难、一一对应关系也没有规律、访问的时候还得加端口),这个痛苦的问题用表格的形式来形象的描述如下:

Public IP

Public Port Number

Internal IP

Internal Port Number

Note

1.1.1.1

80

192.168.1.10

80

service A

1.1.1.1

81

192.168.1.11

80

service B

1.1.1.1

8080

192.168.1.25

80

service C

1.1.1.1

443

192.168.1.26

443

service D

1.1.1.1

444

192.168.1.35

443

service E

在需要对外开放的服务很多的情况下,NAT的方式虽然难用、难记,但至少还是能够满足需求的(可用端口要小于65535个),但如果A、B、C服务都想(或者必须)使用默认的80、443端口的话,在只有一个公网IP的情况下是没法满足的,如果能有一种如下的实现方式,那就完美了:

Domain Name

Public IP

Public Port Number

Internal IP

Internal Port Number

Note

A.example.com

1.1.1.1

80

192.168.1.10

80

service A

B.example.com

1.1.1.1

80

192.168.1.11

80

service B

C.example.com

1.1.1.1

80

192.168.1.25

80

service C

D.example.com

1.1.1.1

443

192.168.1.26

443

service D

E.example.com

1.1.1.1

443

192.168.1.35

443

service E

首先来分析一下,传统NAT的话肯定是实现不了,因为NAT是3层ip加4层端口的方式做映射,而域名(如http header中)都属于7层的内容,要实现的话只能借助支持7层http协议解析的工具实现,经过一番研究发现反向代理可以实现,那太好了,反响代理的工具一大堆:squid、apache、nginx、haproxy、mysql proxy等等,本文仅讲基于http、https协议的实现,其他协议暂不讨论。

有了工具的支持,接下来就得考虑考虑如何部署的问题:

(1)域名解析到路由器的公网ip-->在路由器(pfsense)上安装squid-->配置反向代理(开启http、https反向代理、主机映射、域名正则匹配转发)-->成功实现(需要路由器支持);

(2)域名解析到路由器的公网ip-->在路由器上做传统NAT,将80、443端口分别指向反向代理服务器-->配置反向代理服务器的-->成功实现(通用方法);

其中第一个方法我已经很好的实现http的反向代理,但对于https,由于squid不支持SNI(server name Indication),仅能支持一个https站点,且很多公司用的路由器可能不支持安装squid软件,所以接下来我主要介绍通用的方法:通过在linux上安装nginx来搭建反向代理服务来支持基于域名的7层转发。

下载openssl库

  1. wgethttp://www.openssl.org/source/openssl-1.0.1h.tar.gz
  2. tarxzvfopenssl-1.0.1h.tar.gz
  3. mvopenssl-1.0.1h/usr/local/openssl-1.0.1h/

下载nginx,编译时加入SNI的支持

  1. yuminstallpcrepcre-devel
  2. yuminstallzlibzlib-devel
  3. wgethttp://nginx.org/download/nginx-1.6.0.tar.gz
  4. tarxzvfnginx-1.6.0.tar.gz
  5. cdnginx-1.6.0
  6. ./configure\
  7. --user=nginx\
  8. --group=nginx\
  9. --with-http_ssl_module\
  10. --with-openssl="/usr/local/openssl-1.0.1h/"\
  11. --with-openssl-opt="enable-tlsext"\
  12. --with-http_stub_status_module
  13. make
  14. makeinstall

检查nginx的安装情况(关键TLS SNI support enabled):

  1. [root@svn~]#/usr/local/nginx/sbin/nginx-V
  2. nginxversion:nginx/1.6.0
  3. builtbygcc4.1.220080704(RedHat4.1.2-54)
  4. TLSSNIsupportenabled
  5. configurearguments:--user=nginx--group=nginx--with-http_ssl_module--with-openssl=/usr/local/openssl-1.0.1h/--with-openssl-opt=enable-tlsext--with-http_stub_status_module

配置反向代理服务器:

  1. [root@svn~]#more/usr/local/nginx/conf/nginx.conf
  2. ############httpsserverreveseproxy
  3. server{
  4. listen10010ssl;
  5. server_nameapp.wei.com;
  6. #Setupyourcertpaths
  7. ssl_certificate_key/usr/local/nginx/conf/ssl/app_wei.key;
  8. ssl_certificate/usr/local/nginx/conf/ssl/app_wei.crt;
  9. location/{
  10. proxy_passhttps://192.168.100.123;
  11. }
  12. }
  13. server{
  14. listen10010ssl;
  15. server_namesecure.wei.com;
  16. #Setupyourcertpaths
  17. ssl_certificate_key/usr/local/nginx/conf/ssl/mars-server.key;
  18. ssl_certificate/usr/local/nginx/conf/ssl/mars-server.crt;
  19. location/{
  20. proxy_passhttps://192.168.100.177:443;
  21. }
  22. }
  23. ############httpserverreveseproxy
  24. server{
  25. listen10086;
  26. server_namesecure.wei.com;
  27. location/{
  28. proxy_passhttp://192.168.100.177;
  29. }
  30. }
  31. server{
  32. listen10086;
  33. server_namedobby.wei.com;
  34. location/{
  35. proxy_passhttp://192.168.100.148;
  36. }
  37. }

路由器NAT映射:1.1.1.1:80-->反向代理的10086;1.1.1.1:443-->反向代理的10010

重启nginx就可以使用了,效果对客户端是完全透明的

➜ ~ curl -I https://app.wei.com

HTTP/1.1 200 OK

Server: nginx/1.6.0

Date: Sat, 26 Jul 2014 01:48:14 GMT

Content-Type: text/html

Connection: keep-alive

X-Powered-By: PHP/5.3.8

参考:

Using the Nginx Web Server as a Reverse Proxy: Multiple SSL Sites with a Single IP Address

http://www.informit.com/articles/article.aspx?p=1994795

[squid-users] Reverse proxy with multiple SSL sites

http://www.squid-cache.org/mail-archive/squid-users/201406/0102.html

原文链接:http://blog.csdn.net/xuyaqun/article/details/38259169

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月6日 17:36
下一篇 2023年5月6日 17:36

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信