OS X - *本地子网*端点的静态路由/非标准默认网关

OS X - *本地子网*端点的静态路由/非标准默认网关

我的问题是:如何在 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 个问题:

  1. 如果我将 OS X 上 en0(唯一活动接口)的默认网关设置为 10.160.2.160 上的 BSD 计算机,则此设置会工作一段时间,直到此默认路由被 OS X 自动覆盖为标准默认值 10.160.0.1

  2. 我在 OS X 中使用以下命令配置静态路由时也遇到了问题:

    route add 10.160.2.200 10.160.2.160
    

    .. 在这种情况下,会发生以下两种情况之一 - 要么路由工作一段时间并显示 netstat UGHS 标志,然后被 OS X 覆盖,之后 netstat 会包含 M 标志以表明它已被重定向覆盖。

  3. ..或者该路由根本不起作用,因为一定有其他路由优先。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 中永久设置

相关内容