美文网首页转载部分
使用iptables实现反向代理

使用iptables实现反向代理

作者: Minority | 来源:发表于2020-06-13 17:56 被阅读0次

    一、实验环境及预备知识

    本实验需要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表进行配置,命令解释:

    • 第一条:路由转发进站时,把目的地址是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:指定目的端口号或者端口名称,缺省情况下,将匹配所有端口

    知识拓展:
    心细的同学会发现,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服务

    参考文章:

    相关文章

      网友评论

        本文标题:使用iptables实现反向代理

        本文链接:https://www.haomeiwen.com/subject/pjuatktx.html