一、实验环境及预备知识
本实验需要3台机器(2台虚拟机+宿主机)进行演示。 信息如下:
主机 | ip地址 |
---|---|
宿主机(请求服务的主机) | 192.168.8.100 |
虚拟机A(代理主机) | 192.168.8.104 |
虚拟机B(提供服务的主机) | 192.168.8.103 |
所要实现的其实就是一个反向代理,整个过程,宿主机并不知道有虚拟机B的存在,它以为服务是虚拟机A提供的(对外隐藏了真实提供服务的虚拟机B),如下图所示:
二、iptables命令实现反向代理
在配置之前,192.168.8.104这个主机必须要具备转发数据包的能力,所以要把ip_forward开启,具体操作如下:
cd /proc/sys/net/ipv4
su # 切换到root用户
echo 1 > ip_forward
iptables支持五条链四张表,我们这个实验仅需要对nat表的PREROUTING和POSTROUTING进行操作。
在操作之前可以先查看一下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:指定目的端口号或者端口名称,缺省情况下,将匹配所有端口
实验效果如下图所示,配置前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的服务: