背景
我在本地硬件服务器VM HOST中通过qemu创建一个虚拟机,并且在虚拟机VM1中部署了一个openvpn服务,它的IP地址是10.89.103.14;
因为硬件服务器配置了两个出口,但是呢虚拟机VM1的默认路由是走的其中一条线路,当通过另一条线路的公网IP访问进来的流量就没法路由了。
我的环境是:
VM HOST: Linux
VM1: Linux
我的拓扑如下:
配置
我的配置如下仅仅做下记录,也是研究了很久才搞定的,大致的原理是通过iptables在VM HOST进行匹配特定IP和端口的流量然后将流量设置特定的tos,然后流量会流进到虚拟机VM1,VM1再通过匹配不同tos的流量将其进行mark;因为这个mark是链路级别的,当数据到达应用程序进行处理后出去的流量也会带上mark,后面再将mark的流量设置不同的tos;至于为什么还要设置tos,我的理解是tos是跨主机的标记,mark是当前机器链路级别的标记。当然如果没有匹配到tos的流量还是会走到默认路由的。
因为虚拟机VM1出去的流量也设置了tos,所以流量包到达VM HOST的时候就会进行匹配策略路由,将标记不同的tos的流量选择不同的路由表进行路由,至此就能做到多出口的提供服务。
1 | 内部机器VM1(如果里面的机器还是DNAT,还得在DNAT的目标主机里添加规则进行标记): |