配置地址走指定网卡

Attson Lv3

背景

由于公司提供的vpn属于 L2TP 协议,为二层隧道协议,通过路由表控制,要想实现访问公司服务,最简单的就是将默认路由配置成 vpn
的网关。(通过VPN连接发送所有流量)

说明:

  1. 通常vpn会增加指定的私有网段的转发,如果公司内部的服务都是私网地址,一般不需要处理
  2. 当有些公司的服务配置的是公网地址,但是该地址通过ip白名单形式,限制非公司出口ip访问,就可以按照本教材处理
  3. 本教程本质是通过 ip route 配置特定路由,所以也可以解决多网卡下,需要转发指定的地址到指定网卡的场景
  4. 本文档基于macos系统,其他系统思路类似

在路由表上的效果就是在最上面会添加一条默认路由

1
2
3
4
5
6
7
$ netstat -nr
Routing tables

Internet:
Destination Gateway Flags Netif Expire
default link#18 UCSIg ppp0
default 10.89.89.1 UGScg en0

但是通常我们并不是想要使用vpn转发所有的流量,一是访问非公司的网页时,速度会受公司的统一带宽影响,二是google之类的高级网站,需要使用各自的神秘力量访问,走公司网络时,则无法正常访问了。

那我们如何实现指定的地址走公司的网络,其他的地址还是走默认的网络呢。

方案1

其实方案也很简单,就是在路由层面,自己修改路由表,达成能自定义路由

第一步

取消转发所有流量,可以看到vpn已经不是优先级最高的

1
2
3
4
5
6
7
$ netstat -nr
Routing tables

Internet:
Destination Gateway Flags Netif Expire
default 10.89.89.1 UGScg en0
default link#18 UGScg ppp0

第二步

添加指定的路由规则,比如我们要让 https://about.gitlab.com 走vpn网络,首先获取该域名的ip地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ dig about.gitlab.com

; <<>> DiG 9.10.6 <<>> about.gitlab.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36117
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;about.gitlab.com. IN A

;; ANSWER SECTION:
about.gitlab.com. 30 IN A 151.101.66.49
about.gitlab.com. 30 IN A 151.101.130.49
about.gitlab.com. 30 IN A 151.101.194.49
about.gitlab.com. 30 IN A 151.101.2.49

;; Query time: 20 msec
;; SERVER: 10.89.89.1#53(10.89.89.1)
;; WHEN: Sun Feb 19 14:54:41 CST 2023
;; MSG SIZE rcvd: 109

然后找到vpn的网关地址

然后将地址添加到对应的网关下 192.168.199.195

1
2
3
4
sudo route add 151.101.66.49 192.168.199.195
sudo route add 151.101.130.49 192.168.199.195
sudo route add 151.101.194.49 192.168.199.195
sudo route add 151.101.2.49 192.168.199.195

这时候 https://about.gitlab.com 就会走公司网络了,其他没有配置的仍然走原先的网络.

说明

  1. Route 命令添加的路由重启之后会失效,若需要持久化需要使用("xxx"是对应的网络连接,macos
    下对网络连接的命名)networksetup -setadditionalroutes xxx 151.101.66.49 255.255.255.255 192.168.199.195
  2. vpn的网关地址可能会在重新连接更新,也是需要重新配置
  3. 如果域名的 dns 解析地址更换了,也是需要重新配置

总结: 不推荐使用手动配置处理该场景,因为经常需要重新配置。所以理想情况就是,启动vpn之后,自动添加所需要路由,重连会动态修改,并且能够支持dns识别。请看方案2

方案2

Github 项目 https://github.com/attson/netcatcher 实现当对应的 network interface 连接时,自动添加相关的路由

第一步

Macos 请注意 darwin_amd64 和 darwin_arm64 选择

1
curl -s https://raw.githubusercontent.com/attson/netcatcher/main/install/darwin.sh | netcatcher_VERSION=v0.2.0 netcatcher_OS=darwin_amd64 bash

执行过程会询问密码,需要root权限去管理route.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#...
# 执行输出日志

----------- install success. enjoy it! ----------

default config: don't forget update
{
"interfaces": [
{
"name": "ppp0",
"routes": [
"github.com",
"192.168.188.11",
"192.168.188.0/24"
]
}
]
}
edit config: vim /usr/local/bin/netcatcher_v0.2.0_darwin_amd64/config.json
[notice] com.attson.netcatcher runAtLoad...
start cmd: sudo launchctl load /Library/LaunchDaemons/com.attson.netcatcher.plist
stop cmd: sudo launchctl unload /Library/LaunchDaemons/com.attson.netcatcher.plist

第二步

配置 /usr/local/bin/netcatcher_v0.2.0_darwin_amd64/config.json, 添加你需要代理的地址,支持域名,ip,ip,ip+mask。

配置的时候注意interface name, 这个通过 ifconfig 可以查看, 而不是 macos 网络连接里面的名称

1
2
3
4
5
6
7
8
9
10
{
"interfaces": [
{
"name": "ppp0",
"routes": [
"about.gitlab.com"
]
}
]
}
1
2
3
4
5
6
# 启动
sudo launchctl load /Library/LaunchDaemons/com.attson.netcatcher.plist
# 暂停
sudo launchctl unload /Library/LaunchDaemons/com.attson.netcatcher.plist
# 日志
tail -f /usr/local/var/log/com.attson.netcatcher.log

这样就不需要频繁自己修改路由了,vpn挂着,也不影响正常上网。

更新 2023年10月16日 支持windows

  • 标题: 配置地址走指定网卡
  • 作者: Attson
  • 创建于 : 2023-02-19 14:27:11
  • 更新于 : 2023-10-18 16:13:23
  • 链接: https://attson.github.io/p/network-interface-auto-route.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论