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

在公司的实际办公网中,因为出口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库

wget http://www.openssl.org/source/openssl-1.0.1h.tar.gz

tar xzvf openssl-1.0.1h.tar.gz

mv openssl-1.0.1h  /usr/local/openssl-1.0.1h/

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

yum install  pcre pcre-devel

yum install zlib zlib-devel

wget http://nginx.org/download/nginx-1.6.0.tar.gz

tar xzvf nginx-1.6.0.tar.gz

cd nginx-1.6.0

./configure \

--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

make

make install

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

[[email protected] ~]# /usr/local/nginx/sbin/nginx -V

nginx version: nginx/1.6.0

built by gcc 4.1.2 20080704 (Red Hat 4.1.2-54)

TLS SNI support enabled

configure arguments: --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

配置反向代理服务器:

[[email protected] ~]# more /usr/local/nginx/conf/nginx.conf

############https server revese proxy

server {

listen       10010 ssl;

server_name  app.wei.com;

#Set up your cert paths

ssl_certificate_key  /usr/local/nginx/conf/ssl/app_wei.key;

ssl_certificate        /usr/local/nginx/conf/ssl/app_wei.crt;

location / {

proxy_pass   https://192.168.100.123;

}

}

server {

listen       10010 ssl;

server_name  secure.wei.com;

#Set up your cert paths

ssl_certificate_key  /usr/local/nginx/conf/ssl/mars-server.key;

ssl_certificate         /usr/local/nginx/conf/ssl/mars-server.crt;

location / {

proxy_pass   https://192.168.100.177:443;

}

}

############http server revese proxy

server {

listen       10086 ;

server_name  secure.wei.com;

location / {

proxy_pass   http://192.168.100.177;

}

}

server {

listen       10086 ;

server_name  dobby.wei.com;

location / {

proxy_pass   http://192.168.100.148;

}

}

路由器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

SNI: 实现多域名虚拟主机的SSL/TLS认证

http://www.ttlsa.com/web/sni-multi-domain-virtual-host-ssl-tls-authentication/

http://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/

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

时间: 2024-10-30 11:18:50

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

搭建nginx反向代理用做内网域名转发

基于域名的7层转发的实现(NAT+反向代理) 在实际办公网中,因为出口IP只有一个,要实现对外提供服务的话就必须得做端口映射,如果有多个服务要对外开放的话,这只能通过映射不同端口来区分,这在实际使用过程中非常的痛苦(记忆困难.一一对应关系也没有规律.访问的时候还得加端口),这个痛苦的问题用表格的形式来形象的描述如下: Public IP Public Port Number Internal IP Internal Port Number Note 1.1.1.1 80 192.168.1.10

nginx 反向代理 取得真实IP和域名

nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程序中. nginx反向代理配置时,一般会添加下面的配置: proxy_set_header Host $host;      proxy_set_header X-Real-IP $remote_addr;      proxy_set_header REMOTE-HOST $remote_

nginx的简介和搭建基于域名的虚拟主机

今天就来和大家讲一讲nginx和基于域名搭建虚拟主机 简介 Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 俄罗斯程序员Igor Sysoev于2002年开始Nginx是增长最快的Web服务器,市场份额已达33.3%全球使用量排名第二2011年成立商业公司 Nginx源码结构: 代码量大约11万行C代码源代码目录结构core (主干和基础设置)event (事件驱动模型和不同的IO复用模块)http (HTTP服务器和模块

基于Mybatis的Dao层的开发

基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量. SqlSessionFactory是一个接口,接口中定义了openSession

?搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机

本节所讲内容: 实战:搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机 LAMP架构:??? Linux+Apache+Mysql+PHP Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,共同组成了一个强大的Web应用程序平台. 一.安装需要的软件包 [[email protected] ~]# yum install httpd mysql-server mysql php php-mysql  -y ht

基于域名虚拟主机及主站迁移

第二章实验(二):基于域名虚拟主机及主站迁移 1.配置BIND支持多域名解析:在实际工作中需要申请多个域名,并做好解析. 登录到192.168.100.100(已经提供了linuxfan.cn的解析) [[email protected] ~]# vim /var/named/chroot/etc/named.conf   ##在该文件末尾添加如下内容 zone "sggfu.com" IN { type master; file "sggfu.com.zone";

linux下nginx实现虚拟主机(3种方法:基于域名、基于端口、基于ip地址)

在3.17日的时候已经写过一篇关于apahce的基于域名.端口.ip地址3种方式的虚拟主机实现.原理是一样的,现在记录nginx的虚拟主机这三种方式的实现. 系统版本为rhel5.6,nginx版本为1.1.6. 1.基于域名: 基于域名的方式,要先有dns服务器,这里为了方便,可以在/etc/hosts文件里面配置,把它当成dns就行了,可以参考3.17日那篇博客关于dns的配置或者其他博文也有.这里关于nginx的安装也略去. [[email protected] ~]# cat /etc/

Nginx配置多个基于域名的虚拟主机+实验环境搭建+测试

标签:Linux 域名 Nginx 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xpleaf.blog.51cto.com/9315560/1901284 0.说明 使用Nginx可以配置基于域名的虚拟主机.基于端口的虚拟主机和基于端口的虚拟主机,比较常用的是基于域名的虚拟主机,这里要做的配置是基于域名的虚拟主机,并且是配置多个基于域名的虚拟主机. 关于Nginx配置文件的说明可以参考官方文档,同时也可以参考老男孩老师的书

第二章 Web网站服务(二)——搭建基于域名的虚拟web主机

防伪码:自古逢秋悲寂寥,我言秋日胜春朝 web网站服务(二) 一.httpd服务的访问控制 作用: a.控制对网站资源的访问 b.为特定的网站目录添加访问授权 常用访问控制方式: a.客户机地址限制 b.用户授权限制 二.基于客户端地址的访问控制 Order配置项,定义控制顺序 先允许后拒绝,默认拒绝所有:Order allow,deny 先拒绝后允许,默认允许所有:Order deny,allow Allow.Deny配置项,设置允许或拒绝的地址 Deny from address1 addr