我的问题是:如何在 OS X 中可靠地设置静态路由,以便 2 个端点通过网关,其中所有计算机都位于同一子网中?我提供以下上下文:
为了测试目的,我需要能够在同一本地子网上的两个端点之间设置特定路由 - OS X(10.9)MacBook 和基于 Linux 的“接收器”。
行为需要这样:离开 MacBook 的流量的下一跳将是基于 FreeBSD 的 QoS 机器,而不是标准默认网关。BSD 机器也可能位于同一子网中,并执行 SNAT 来伪装新流量并在返回时重新转换。
简化后,我的环境类似于以下内容:
本地子网 = 10.160.0.0/16
MacBook = 10.160.2.100
Linux 接收器 = 10.160.2.200
标准设备的默认网关 = 10.160.0.1
BSD 网关的示例配置:
en0 10.160.2.160
en1 10.160.3.170
网络掩码 255.255.0.0
网关 10.160.0.1
所需流程的示例:
请求:MacBook --> BSD --> 默认网关 --> 接收器
响应:接收器 --> 默认网关 --> BSD --> MacBook
我发现出现了 3 个问题:
如果我将 OS X 上 en0(唯一活动接口)的默认网关设置为 10.160.2.160 上的 BSD 计算机,则此设置会工作一段时间,直到此默认路由被 OS X 自动覆盖为标准默认值 10.160.0.1
我在 OS X 中使用以下命令配置静态路由时也遇到了问题:
route add 10.160.2.200 10.160.2.160
.. 在这种情况下,会发生以下两种情况之一 - 要么路由工作一段时间并显示 netstat UGHS 标志,然后被 OS X 覆盖,之后 netstat 会包含 M 标志以表明它已被重定向覆盖。
..或者该路由根本不起作用,因为一定有其他路由优先。Traceroute 证实了这一点。
初始配置后的 Netstat 输出:
jiosxserver:~ julianivory$ netstat -nr
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 10.160.2.160 UGSc 17 0 en0
10.140.1.31 10.160.2.160 UGHS 0 0 en0
10.140.1.35 10.160.1.1 UGHS 0 0 en0
10.160/16 link#4 UCS 5 0 en0
10.160.0.1 0:14:22:20:1c:d9 UHLWIir 14 0 en0 1191
10.160.1.37 0:50:56:8a:87:e9 UHLWIi 0 0 en0 1138
10.160.2.160 8e:af:b2:47:7f:91 UHLWIir 4 0 en0 1144
10.160.3.75 127.0.0.1 UHS 0 0 lo0
10.160.3.79 a8:20:66:27:72:2e UHLWIi 0 1 en0 1184
10.160.255.255 ff:ff:ff:ff:ff:ff UHLWbI 0 44 en0
127 127.0.0.1 UCS 0 0 lo0
127.0.0.1 127.0.0.1 UH 9 20602 lo0
169.254 link#4 UCS 0 0 en0
...并且 Traceroute 输出显示默认路由未被使用:
traceroute to 8.8.8.8 (8.8.8.8), 64 hops max, 52 byte packets
1 10.160.0.1 (10.160.0.1) 0.504 ms 0.237 ms 0.217 ms
2 192.168.2.1 (192.168.2.1) 1.065 ms 1.020 ms 0.973 ms
3 name-removed (xx.1xx.xxx.1) 14.250 ms 13.688 ms 14.046 ms
4 xxx.xxx.178.141 (xxx.xxx.178.141) 14.196 ms 14.121 ms 13.967 ms
...一段时间后,默认网关将“自动”更改为 10.160.0.1...
如有任何想法或建议,我们将不胜感激。
答案1
这链接给出了答案对于在重启后仍然有效的 macOS 静态路由,还有一条关于此问题情况的附加信息...从 networksetup 命令使用信息中收集。
从网络设置(命令行 - 使用终端):
Usage: networksetup -setadditionalroutes <networkservice> [ <dest> <mask>
<gateway> ]*
Set additional IPv4 routes associated with <networkservice>
by specifying one or more [ <dest> <mask> <gateway> ] tuples.
Remove additional routes by specifying no arguments.
If <gateway> is "", the route is direct to the interface
因此,如果你正在运行多个可在同一第 2 层访问的网络(是的,你可以在没有路由器的情况下做到这一点!)语法是
networksetup -setadditionalroutes 以太网目标掩码“”
请注意,您必须确定路由适用于哪种网络服务(有线、wifi 等)。当然,命名约定与 ifconfig 的输出不匹配!
networksetup -listallnetworkservices
如果您有多个接口类型(例如多个有线接口),则可能必须用引号括住该值。还请注意,networksetup 要求您在一个命令中定义所有路由!因此,如果您有多个静态路由,请使用:
networksetup -setadditionalroutes <networkservice> dest1 mask1 "" dest2 mask2 ""
等等。
答案2
对于那些可能从中受益的人来说 - 我的主要问题是其他设备正在发送 ICMP 重定向。在我的本地 (OS X) 机器上禁用此功能后,我的静态路由就变得可靠了。
在 OS X 中,可以通过使用 sysctl 动态实现此目的:
/usr/sbin/sysctl -w net.inet.icmp.drop_redirect=1
/usr/sbin/sysctl -w net.inet.ip.redirect=0
这也可以在 /etc/sysctl.conf 中永久设置