原理
在公司网络中搭建了一个CentOS服务器,同时接入了内网和外网并配置了PPTP服务端,在外部拨号进入CentOS当中后,通过配置iptables和ip rule策略路由实现PPTP当中的内网流量走内网网卡,外网流量走外网网卡。
拓扑
实现
- 环境配置
CentOS:
- ens192: 192.168.0.186
- ens160: 10.0.0.1
- ppp0(PPTP的IP池): 10.0.10.2/28
本示例中,ens192为外网网卡,连接到路由器通过NAT可以访问外网,ens160为纯内网网卡,由内网交换机引出,ppp0为PPTP拨号后生成的客户端连接网卡,IP池为10.0.0.2/28,按照拨号先后顺序自动分配。
- 路由方向
ens160: 承载来自于ppp0网卡,且目的地为10.0.0.0/8,172.16.0.0/12,192.168.32.0/28(192.168.32.1~192.168.63.254)这三个网段
ens192: 承载来自于ppp0网卡,且目的地址不为上述内网地址的其他所有地址。
在路由的配置当中,由于ens192本身是通过NAT联通外网的,所以它自己只有一个内网地址,所有外网流量将会以它为网关接入。而ens160本身也是内网当中的一个普通地址,所有内网流量将会以它为网关接入。
比较特殊的是,内网网卡ens160必须承载除了10.0.0.0/8即它本身之外的两个内网网段,172.16.0.0/12,192.168.32.0/28,因为内网当中这两个网段一个为防火墙使用,一个为DMZ区域使用,所以同样需要走ens160访问,而ens192本身属于192.168.0.1/24这个网段,和ens160所需要路由的192网段有所冲突,所以在ens160当中仅仅路由了192.168.32.0/28这一段地址,前后的地址都走默认路由,即ens192。
- 配置原理
IP rule & IP route
- 所有来自于PPTP的流量,即来自于10.0.10.2/28的流量,默认路由到ens192外网网卡
- 所有来自于PPTP的流量,目的地址为10.0.0.0/8的,路由到ens160
- 所有来自于PPTP的流量,目的地址为172.16.0.0/12的,路由到ens160
- 所有来自于PPTP的流量,目的地址为192.168.32.0/19的,路由到ens160
iptables
- 路由到ens160的流量,不在iptables当中做任何配置,由ens160自行路由至内网即可
- 所有来自于PPTP的流量,出向网卡为ens192的,由iptables做SNAT,通过ens192的地址上外网
上述1-4配置使用ip rule和ip route配合即可完成
上述5-6配置,使用iptables做SNAT转换即可完成
- 配置命令
Step1. 首先配置策略路由(上节1-4)
####下列所有命令序号对应上节配置原理序号####
0. ip rule add from 10.0.10.2/28 table inside
#所有来自于10.0.10.2/28(pptp)的流量,查询名为inside的路由表
1. ip route add default via 192.168.0.186 table inside
#所有来自于PPTP的流量,即来自于10.0.10.2/28的流量,默认路由到ens192外网网卡
2. ip route add 10.0.0.0/8 via 10.0.0.1 table inside
#所有来自于PPTP的流量,目的地址为10.0.0.0/8的,路由到ens160
3. ip route add 172.16.0.0/12 via 10.0.0.1 table inside
#所有来自于PPTP的流量,目的地址为172.16.0.0/12的,路由到ens160
4. ip route add 192.168.32.0/19 via 10.0.0.1 table inside
#所有来自于PPTP的流量,目的地址为192.168.32.0/19的,路由到ens160
Step2. 配置SNAT(上节5-6)
5. 无需配置
6. iptables -t nat -I POSTROUTING -s 10.0.10.2/28 -o ens192 -j SNAT --to-source 192.168.0.186
#所有来自于PPTP的流量,出向网卡为ens192的,由iptables做SNAT,通过ens192的地址上外网
需注意的地方
-
内网地址需要访问外网接收回包的时候,必须通过SNAT转换,否则三层数据包当中的源地址为内网地址,无法接受回包,只能由SNAT转换成内网地址接收回包,打通内外网。
-
SNAT在POSTROUTING链当中使用,需要提前确保路由的正确性,因为POSTROUTING仅仅修改数据包源地址,再从routing当中确认好的路由发送出去,如果数据包本身就路由到内网网卡,SNAT做再多也无法访问外网,所以才有默认路由要走外网,内网单独定义路由这么一设定。
-
本例当中ens192本身即是内网地址,本身就通过路由器的WAN访问公网,仍然可以以ens192为网关,在其后方使用SNAT转换内网网址上外网,即10.x网段访问外网实际上经过了两次SNAT转换,一次是10.x到192.168.0.186的SNAT,第二次是192.168.0.186到外网地址的转换,可以成功的原因是每次转换都有独立维护的SNAT表,路由只管下一跳能正常出去即可,不关心经过多少条才能到达目的,所以即使2次SNAT,只要配置正确仍然可以正常访问公网。