NAT:网络地址转换(Network Address Translation),也叫作网络掩蔽或者IP掩蔽(IP masquerading),是一种在IP封包经过路由器或防火墙时重写來源IP地址或目的IP地址的技术。nginx
简单来讲在数据传输中,通过7层网络结构时,为了实现三次握手,就须要在发送数据的时候告诉目的地你的位置,以便对方能够回复,可是在数据报中只有起点域和目的域,不可能全部的终端都是点对点链接的,这时候就须要一个中转站来传递消息数据,这里只讨论软件来实现 nat,路由器的因为基本不会直接操做,就没查资料了。apache
iptables 做用的 5 条规则链中,有两条是 PREROUTING、POSTROUTING,分别表明的是路由前和路由后,iptables 就是实现 nat 的一种方式。vim
检查系统是否开启了 ip 转发功能:后端
cat /etc/sysctl.conf| grep 'net.ipv4.ip_forward = 0'服务器
开启转发功能:网络
sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conftcp
在 iptables 中添加 NAT 转换规则:工具
iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.1阿里云
上面这条规则会将访问 80 端口的全部请求都转发给 192.168.1.1spa
添加数据返回规则:
iptables -t nat -I POSTROUTING -p tcp --dport 80 -j MASQUERADE
这样请求就会被防火墙修改 ip 地址,而转发出去。
阿里云的帮助文档里面提供了一种经过 rinetd 的方法(不过配置说明方面写的容易让人误会,我第一次就没看明白,还也为是注释),看名字就知道这是一款用来实现 nat 的,很简洁配置也方便,毕竟是专门用来作 nat 的。
官网下载编译安装:
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar -xvf rinetd.tar.gz
cd rinetd && mkdir /usr/man && make && make install
不须要 configure 生成 Makefile。
配置:
vim /etc/rinetd.conf
0.0.0.0 80 192.168.1.1 80
0.0.0.0 表明源地址,可作限制
80 请求的端口
192.168.1.1 转发的目的地址
80 目的端口
全网请求在 80 端口的都会被 NAT 到 192.168.1.1 的 80 端口上。
rinetd -c /etc/rinetd.conf
启动 rinetd
nginx 并无围绕着传统的 nat 去实现转换,传统的 nat 只能知足一个 ip 一个端口的转发模式,可是若是有几个 ip 都但愿获得同一个端口的转发呢?
把转发从以前的 3 层和 4 层的 ip 加端口的映射提升到应用层来实现,经过域名的不一样来转发至不一样的 Ip,术语称为反向代理。
nginx 是一款很好用的反向代理工具,配置文件向较与 apache 来讲更好理解,关于代理还有不少软件,proxy 相关的模块不少。
配置反向代理
经过域名的不一样,nginx 会把请求转发给 192.168.1.1 和 192.168.1.2 两个服务器,这样就实现了一个简单的域名转发功能。
nginx 的请求都是由反向代理传递给后端服务器的,全部后端服务器获取的访问 ip 地址都是反向代理服务器的,想要获取真实的访问 ip,若是后端服务器也是 nginx ,那么就须要修改后端服务器的 nginx 日志格式:
这样就能够在 access 日志中打印出访问的真实 IP 了。