使用iptables实现反向代理
2020-06-13 本文已影响0人
Minority
一、实验环境及预备知识
本实验需要3台机器(2台虚拟机+宿主机)进行演示。 信息如下:
主机 | ip地址 |
---|---|
宿主机(请求服务的主机) | 192.168.8.100 |
虚拟机A(代理主机) | 192.168.8.104 |
虚拟机B(提供服务的主机) | 192.168.8.103 |
所要实现的其实就是一个反向代理,整个过程,宿主机并不知道有虚拟机B的存在,它以为服务是虚拟机A提供的(对外隐藏了真实提供服务的虚拟机B),如下图所示:
知识补充:正向代理和反向代理
- 区别:两张图解释清楚
正向代理
反向代理
正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
反向代理客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理
总结来说:正向代理中, proxy和client同属一个LAN,对 server透明;反向代理中,proxy和 server同属一个LAN,对client透明。- 正向代理的用途:
(1)访问原来无法访问的资源,如google(翻墙)
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录,对外隐藏用户信息- 反向代理的用途:
(1)保证内网的安全,使用反向代理提供WAF功能,阻止web攻击
(2)负载均衡,通过反向代理服务器来优化网站的负载
二、iptables命令实现反向代理
在配置之前,192.168.8.104这个主机必须要具备转发数据包的能力,所以要把ip_forward开启,具体操作如下:
cd /proc/sys/net/ipv4
su # 切换到root用户
echo 1 > ip_forward
iptables支持五条链四张表,我们这个实验仅需要对nat表的PREROUTING和POSTROUTING进行操作。
iptables支持的表结构,图片来源: https://zhuanlan.zhihu.com/p/59923208在操作之前可以先查看一下iptables 的nat表的初始状态如下:
iptables nat表初始状态sudo iptables -t nat -A PREROUTING -d 192.168.8.104 -p tcp --dport 80 -j DNAT --to-destination 192.168.8.103:80
sudo iptables -t nat -A POSTROUTING -p tcp -s 192.168.8.100 -j SNAT --to 192.168.8.104
执行以上命令对nat表进行配置,命令解释:
- 第一条:路由转发进站时,把目的地址是192.168.8.104:80的tcp报文的目的地址改为192.168.8.103:80
- 第二条:路由转发出站时,把发往192.168.8.100的tcp包的源地址改为192.168.8.104
命令参数如下:
- -t :指明对那张表进行操作,iptables有五条链四张表,我们需要对nat表进行操作
- -A:追加新规则于指定链的尾部,可选的有五条链
- -d:指定数据包的目的地址
- -p:指定规则的协议,如tcp, udp, icmp等,可以使用all来指定所有协议
- -s:指定数据包的源地址
- -j:jump to target,指定了当与规则(Rule)匹配时如何处理数据包
- DNAT/ SNAT: SNAT改的是源IP,DNAT改的是目的IP
- --dport:指定目的端口号或者端口名称,缺省情况下,将匹配所有端口
配置后的nat表知识拓展:
心细的同学会发现,DNAT修改了192.168.8.100 ==> 192.168.8.104的目的ip,但是我们并没有修改192.168.8.104 ==> 192.168.8.103的源ip。同样,SNAT只修改了192.168.8.104 ==> 192.168.8.100的源ip,并未修改192.168.8.103 ==> 192.168.8.104的目的ip。其实这个工作是操作系统帮我们做了,我们只需要设置一整条链上的PREROUTING或者POSTROUTING即可。完整的规则如下图所示:
实验效果如下图所示,配置前192.168.8.103的80端口有nginx欢迎界面,而192.168.8.104:80端口是没有任何服务的,配置完成之后在192.168.8.100的浏览器中嵌入192.168.8.104:80来获取192.168.8.103:80的服务:
192.168.8.103的80端口有nginx欢迎界面
配置iptables之前访问192.168.8.104:80 配置完成后192.168.8.104的80端口有了nginx服务
参考文章: