用ROUTE配置路由解决多网络IP段冲突的问题

3,679 阅读5分钟

1 背景

最近团队承接了一个项目,主要是交互优化的工作,几乎所有工作量都在前端,项目的后端接口运行在客户内网,为异地开发,客户给了一个VPN,因为只有一个VPN,就把它配制到了开发服务器。开发服务器通过VPN与客户内网连接,在开发服务器上可访问到客户内网与项目相关所有接口。运行在开发电脑、测试服务上的系统都向开发服务器发起接口请求,开发服务器通过反向代理把请求转化给客户内网中各接口。

网络结构示意图

开发服务所在网络有互联网,客户内网没有互联网,具体环境参数如下:

开发服务器内网

操作系统: Windows Server 2019
IPv4 地址: 172.24.207.62
子网掩码: 255.255.240.0
默认网关: 172.24.207.253
DNS 服务器: 100.100.2.136
           100.100.2.138

VPN

IP: 183.*.*.*
VPN类型: 使用证书的L2TP/IPsec
账号密码: **/**

VPN网络

 IPv4 地址: 10.230.59.153
 子网掩码: 255.255.255.255
 默认网关: 0.0.0.0

2 遇到的问题

  • VPN连接后开发服务器无法连接互联网

    连接VPN后遇到的第一个问题就是可以访问客户内网所有IP段的服务器,但开发服务器却连接不上外网。在VPN网络设置中,取消“在远程网络上使用默认网关” 选中状态,开发服务器可以访问到外网了。

VPN设置步骤图

  • 无法访问与开发服务器同IP段客户内网服务器

    通过上面的设置后,开发服务器可以访问互联网了,但奇怪的是发现部分客户内网的服务器无法访问,无法访问的服务主要为172.24.* .* 段的服务器,与开发服务器原本网络IP同段。打印出开发服务的路由如下:

               网络目标          网络掩码              网关              接口    跃点数
              0.0.0.0          0.0.0.0   172.24.207.253      172.24.207.62     16
             10.0.0.0        255.0.0.0    10.230.59.254      10.230.59.153     26
        10.230.59.153  255.255.255.255            在链路上     10.230.59.153    281
            127.0.0.0        255.0.0.0            在链路上         127.0.0.1    331
            127.0.0.1  255.255.255.255            在链路上         127.0.0.1    331
      127.255.255.255  255.255.255.255            在链路上         127.0.0.1    331
         172.24.176.0    255.255.255.0     10.230.59.254      10.230.59.153     26
         172.24.186.0    255.255.255.0     10.230.59.254      10.230.59.153     26
         172.24.192.0    255.255.240.0            在链路上     172.24.207.62    271
        172.24.207.62  255.255.255.255            在链路上     172.24.207.62    271
       172.24.207.255  255.255.255.255            在链路上     172.24.207.62    271
    ……
    

    从这个路由表里可以看出当前开发服务器有两个网卡处于连接状态,分别是172.24.207.62、10.230.59.153,分别是开发服务器本地局域网与VPN网络。因为有第二条路由的配制,所以开发服务器可以访问到客户内网10.* . * .* 段的服务器,而172.24.176.* 与172.24.186.* 段的服务器因为没有指定路由器,会走第一条路由配制(在路由列表里没有配制的IP段都会走0.0.0.0的路由配制)转向了开发服务器内网,所以就无法访问到客户的服务器。

    那么手动添加172.24.176.* 与172.24.186.* IP段的路由指向VPN网卡路由应该可以解决,于是在cmd里执行以下两条命令:

  route -p add 172.24.176.0 mask 255.255.255.0 10.230.59.254
  route -p add 172.24.186.0 mask 255.255.255.0 10.230.59.254

再查看路由表发现多出两条静态路由配制,神奇的是开发服务器可以访问互联网也可以访问到客户与项目相关的内网服务器了。

永久路由:
  网络地址        网络掩码  	     网关地址  	   跃点数
  172.24.176.0    255.255.255.0    10.230.59.254       1
  172.24.186.0    255.255.255.0    10.230.59.254       1

注: 网络掩码的格式要与网络地址保持一致,网络地址有几段值是0,网络掩码就要几段是0,例如:

172.24.176.168	255.255.255.255
172.24.0.0		255.255.0.0
10.0.0.0		255.0.0.0

3 ROUTE基础操作

遇到的问题解决,也就整理了一下ROUTE的一些基础操作。

  • 操作指令

    route [-f] [-p] [commands] [destination] [MASK netmask] [gateway] [METRIC metric] [IF interface]
    

    -f:可选参数,清空整个路由表,要慎用,如果误操作了可以通过netsh ipv4 reset 命令重路由表;

    -p:可选参数,与add命令结合使用,添加永久路由,网络重连,服务器重启都不会被删除;

    commands:route操作命令,主要有add、delete、change、print。

    命令 说明
    add 添加路由
    change 修改路由
    delete 删除路由
    print 打印路由

    示例:

    route -p add 172.24.0.0 mask 255.255.0.0 10.230.59.254
    route delete 172.24.0.0
    route delete 172.24.0.0 mask 255.255.0.0 
    route delete 172.24.0.0 mask 255.255.0.9 10.230.59.254 if 10.230.59.153
    route change 160.12.0.2 mask 255.255.0.0 160.12.0.10
    route print
    route print -4
    route print -p
    
  • 路由选择规则

    当发起一个网络请求,到底会选择哪一条路由,走哪一个网关呢,主要遵循两个规则:

    • 越相似越优先;
    • 相似度一样,越接近越优先(METRIC越小越优先);

    示例:

                网络目标          网络掩码              网关              接口    跃点数
               0.0.0.0          0.0.0.0   172.24.207.253      172.24.207.62     16
               0.0.0.0          0.0.0.0   10.230.59.254       10.230.59.153     12
              10.0.0.0        255.0.0.0    10.230.59.254      10.230.59.153     26
         10.230.59.153  255.255.255.255            在链路上     10.230.59.153    281
          172.24.176.0    255.255.255.0     10.230.59.254      10.230.59.153     26
          172.24.0.0    255.255.255.0     10.230.59.254      10.230.59.153     26
          172.24.192.0    255.255.240.0            在链路上     172.24.207.62    271
         172.24.207.62  255.255.255.255            在链路上     172.24.207.62    271
    

    192.23.45.7会选择第二条路由而不是第一条,因为第二条的METRIC为12比第一条的值小;

    172.24.192.45会选择172.24.192.0而不是172.24.0.0,因为它与172.24.192.0的相似度更高;