Mac OS路由设置常用命令

关注路由配置的原因是因为单位办公环境不允许访问互联网,在原来只有一块网卡的时候,不得不频繁的在办公网和互联网之间切换。为了解决这个问题,我在Macbook Pro上外接了一块USB无线网卡,通过两块网卡实现既能上办公网,也能上互联网。

查看路由

Mac下通过netstat命令查看路由表,可以看到有两条默认路由。一般情况下,我们可以通过系统配置中的设置网络顺序将提供互联网接入的网卡放在第一位就能够顺利的实现既能访问互联网,也能访问办公网。

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

Internet:
Destination Gateway Flags Refs Use Netif Expire
default 172.20.10.1 UGSc 34 32 en5
default 11.136.160.254 UGScI 0 0 en1

但是在我的场景中,单位内部有一个比较特殊的地址段128.192.*.*因为属于B类地址,走了第一条路由导致我没有办法访问这个网段的所有应用,这时就需要单独指定对于这个网段走第二条路由。

路由信息中Flags的一些具体含义如下:

  • U = Up
  • G = Gateway
  • S = Static, e.g., default route added at boot time
  • H = Host-specific
  • C = Generate new (host-specific) routes on use
  • L = Valid link-layer (MAC) address
  • c = Cloned route
  • R = Reject route, known but unreachable route

route命令

首先来介绍一下Mac下的路由命令,命令的用法如下。

1
$ route [-dnqtv] command [[modifiers] args]

支持的命令包括:addflushdeletechangegetmonitor

对于monitorflush命令,后面不需要额外的参数,对于adddeletechangeget参数,则需要按照以下格式输入:

1
$ route [-n] command [-net | -host] [-ifscope boundif] destination gateway [netmask]

监控路由变化

1
$ route -v monitor

通过这个命令可以看到系统中路由变化的情况,如果此时在系统管理面板中调整网络的顺序,就能够看到路由变化的细节。如下所示,可以看到因为我调整了网络顺序,系统先是把两条默认路由删掉,然后按照调整的顺序再依次添加到路由表中,从而实现了网络顺序的调整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ route -v monitor

got message of size 164 on Tue May 19 12:20:05 2020
RTM_DELETE: Delete Route: len 164, pid: 62, seq 262, errno 0, flags:<GATEWAY,DONE,STATIC,PRCLONING,CONDEMNED>
locks: inits:
sockaddrs: <DST,GATEWAY,NETMASK,IFP,IFA>
default 172.20.10.1 default en5:40.a5.ef.41.9f.fb 172.20.10.3

got message of size 164 on Tue May 19 12:20:05 2020
RTM_DELETE: Delete Route: len 164, pid: 62, seq 263, errno 0, ifscope 6, flags:<GATEWAY,DONE,STATIC,PRCLONING,IFSCOPE,CONDEMNED>
locks: inits:
sockaddrs: <DST,GATEWAY,NETMASK,IFP,IFA>
default 11.136.160.254 default en1:e4.ce.8f.23.c5.de 11.136.160.44

got message of size 176 on Tue May 19 12:20:16 2020
RTM_ADD: Add Route: len 176, pid: 62, seq 270, errno 0, flags:<UP,GATEWAY,DONE,STATIC>
locks: inits:
sockaddrs: <DST,GATEWAY,NETMASK,IFP,IFA>
default 11.136.160.254 default 11.136.160.44

got message of size 176 on Tue May 19 12:20:16 2020
RTM_ADD: Add Route: len 176, pid: 62, seq 271, errno 0, ifscope 5, flags:<UP,GATEWAY,DONE,STATIC,IFSCOPE>
locks: inits:
sockaddrs: <DST,GATEWAY,NETMASK,IFP,IFA>
default 172.20.10.1 default 172.20.10.3

添加路由

添加路由时,-host-net是可选参数。如果没有加参数,并且输入的ip是一个段网络地址,则会假设为一个地址段。如果是明确的ip地址,则会对应到主机。这部分内容可以通过man route查看到。

1
2
3
4
5
6
$ sudo route -v add ip gateway [-netmask net-mask-ip]
# -net 参数可以指定添加一个网段
$ sudo route -v add -net 128.192 gateway
# -host 参数可以指定添加一个具体的地址
$ sudo route -v add -host 128.192.214.29 gateway
$ sudo route -n add -net 192.168.0.0(需进入的网段) -netmask 255.255.255.0 (掩码)192.168.5.254 (进该网段的网关)

删除路由

1
2
$ sudo route -v delete ip
$ sudo route -v delete -net 10.10.12.0(某网段) -gateway 10.10.12.1(某网关)

清空路由表

1
$ sudo route -v flush

持久化路由的设置

持久化路由设置需要介绍一个新的命令networksetup,该命令相当于系统偏好设置中的网络设置工具的命令行版本,但是自爱系统偏好设置中没有提供路由维护的功能,因此这个命令行工具提供了比系统便好设置更强大的功能,主要有以下几个方面。

查看所有的网络连接方式

1
2
3
4
5
6
7
8
9
10
$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
802.11n NIC
Wi-Fi
Ethernet
FireWire
Bluetooth PAN
Thunderbolt Bridge
iPhone USB
Parallels Shared #0

查看某个网络连接的路由信息

1
2
$ networksetup -getadditionalroutes Wi-Fi
There are no additional IPv4 routes on Wi-Fi.

添加路由信息

1
2
3
$ networksetup -setadditionalroutes Wi-Fi 11.33.0.0 255.255.255.0 11.136.167.254
$ networksetup -getadditionalroutes Wi-Fi
11.33.0.0 255.255.255.0 11.136.167.254

删除路由信息

1
2
3
4
$ networksetup -setadditionalroutes Wi-Fi 
$ networksetup -getadditionalroutes Wi-Fi
There are no additional IPv4 routes on Wi-Fi.

清空路由表就是不需要添加任何路由信息就可以。

查看端口监听

1
2
3
$ lsof -i :61613             
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
com.docke 22500 shiqiang 74u IPv6 0xa0a6fc82987d1dcd 0t0 TCP *:61613 (LISTEN)

通过 lsof 命令可以查看端口监听的情况。

参考资料

  1. MacOS上路由表的操作
  2. MacOS route flags
  3. Mac OSX常用网络命令
  4. https://www.cnblogs.com/hanyifeng/p/8195538.html

cocowool

A FULL STACK DREAMER!