转载部分

使用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表PREROUTINGPOSTROUTING进行操作。

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表进行配置,命令解释:

命令参数如下:

知识拓展:
心细的同学会发现,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即可。完整的规则如下图所示:

配置后的nat表

实验效果如下图所示,配置前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服务

参考文章:

上一篇下一篇

猜你喜欢

热点阅读