我们正在尝试向 FreeBSD 系统添加静态 ARP 条目。这适用于,例如,
arp -S 172.16.16.9 11:54:33:A8:B2:6B
。我们已将其添加到启动脚本中,以便在重新启动后继续存在。到目前为止,一切都很好。
但是,如果物理链路被循环,则永久 ARP 条目也会被刷新。有谁知道吗
A。防止这种情况的好方法或
b.重新添加链接或的好方法
C。更好的方法吗?
答案1
与 FreeBSD 成为朋友
您似乎走在部分正确的道路上。我想您对 Unix 有很多了解,但对实际的 FreeBSD 系统了解不多。我猜测这是因为您的处理方式与 FreeBSD 中 rc.d 的典型用户略有不同。
我发现这个问题有点薄弱,因为我个人更愿意追究为什么 arp 丢失了。但我们得到的信息却很少。相反,我们仓促下结论。然而,他们确实提出了一些关于如何在 FreeBSD 上做事的有趣问题。请记住,买者自负,我们最终可能会使用扳手作为锤子。
编写 rc 脚本
FreeBSD 启动脚本位于其中,/etc/rc.d
但您永远不应该在那里创建任何内容,而是将该目录留给操作系统。否则,您的内容可能会在更新期间被覆盖。如果您想编写自己的启动/守护程序/服务脚本,那么最好的位置是/usr/local/etc/rc.d
推荐的文件位置记录在希尔
与从头开始编写所有内容相比,您可以通过阅读获得很多辅助函数BSD 中的实用 rc.d 脚本
/etc/rc.conf.d/*
您在评论中询问是否可以在/etc/rc.conf.d/*
.请请不要这样做。此处的文件在启动时获取 - 但此目录的目的是包含带有配置设置的小片段(请参阅rc.conf)。大多数人只是使用该文件/etc/rc.conf
来配置系统选项 - 但您可以将它们分成小段并将它们放入,/etc/rc.conf.d
即使这并不常见。
最好将更通用的启动脚本放入 /etc/rc.local仍然受到支持。但我仍然建议创建一个适当的 rc 脚本并将其放入/usr/local/etc/rc.d
如果您想完全忽略 rc 脚本,在引导时启动通用脚本的另一种常见方法是使用 @reboot 关键字定时任务
不过,我想说您不需要创建新的 rc 脚本,因为该功能已经存在。
静态ARP
静态 arp 实际上有详细记录 - 但它非常简单。 “缺失”的文档可能是 rc 脚本的处理方式。它记录在rc.conf:
static_arp_pairs
(str) Set to the list of static ARP pairs that are to be
added at system boot time. For each whitespace separated
element in the value, a static_arp_<element> variable is
assumed to exist whose contents will later be passed to a
``arp -S'' operation. For example
static_arp_pairs="gw"
static_arp_gw="192.168.1.1 00:01:02:03:04:05"
这意味着您可以添加 3 个静态 arp 条目,通过将这些行添加到 /etc/rc.conf(我建议使用系统资源库命令):
static_arp_pairs="a b c"
static_arp_a="1.2.3.4 11:22:33:44:55:66"
static_arp_b="1.2.3.5 22:33:44:55:66:77"
static_arp_c="1.2.3.6 33:44:55:66:77:88"
或者根据您的具体情况:
static_arp_pairs="myarp"
static_arp_myarp="172.16.16.9 11:54:33:A8:B2:6B"
处理此问题的脚本是操作系统的一部分,放置在其中/etc/rc.d/static_arp
并且非常简单。它仅支持“启动”和“停止”命令。
您可以使用以下方式从任何地方调用它:
/etc/rc.d/static_arp start
但我更喜欢使用服务命令:
service static_arp start
如果出于某种原因您想编辑/更改/etc/rc.d/static_arp
,请不要这样做! Root 是万能的,你可以做你想做的事 - 但你有被替换的风险。您应该做的是cp /etc/rc.d/static_arp /usr/local/etc/rc.d/mystatic_arp
将修改后的版本保留在那里。注意名称更改并确保它反映在脚本中!
回收物理链路
如果您习惯于其他系统,您可能只需使用 ifconfig 来打开/关闭接口。但在 FreeBSD 上你应该考虑使用:
service netif restart <interface>
老实说,我没有测试过这是否也会带来 static_arp。或者类似的东西:
service netif stop <interface>
...
service netif start <interface>
service routing restart
service static_arp start
但是循环物理链路可能会(拔出)电缆?我再次不确定 arp 表会发生什么。我希望它仍然存在,因为我们还没有在管理上放下该界面。
更新:@namezero 在评论中确认使用 static_arp 设置的 arp 整体确实可以在物理断开连接时幸存下来。
但我们应该进一步检查这一点,以充分了解您的情况。这就是我能回答“a.防止这种情况的好方法”的最接近的答案
计划任务
如果我们没有收到物理链接的通知 - 那么我认为没有比监视它更好的方法了。如果我们保持脚本简单 - 那么我们可以将其留给常规的 cron。
开发者来救援
如果我们能够看到操作系统的变化,那么我们就有了一条很好的前进道路。设备状态更改守护进程开发者派上用场了。由于缺少您的描述,因此我将假设我们有 LINK_UP 或 LINK_DOWN 可以采取行动。
使用以下内容创建文件 /etc/devd/interface.conf:
notify 0 {
match "system" "IFNET";
match "subsystem" "(em0|em1)";
match "type" "LINK_DOWN";
action "/usr/local/sbin/alertme.sh $subsystem"
}
这将通知您网络接口 em0 和 em1。
所以它可以很简单:
notify 0 {
match "system" "IFNET";
match "subsystem" "(em0|em1)";
match "type" "LINK_UP";
action "/etc/rc.d/static_arp start"
}
然而,这对我来说确实有点麻烦,因为我会花更多时间来发现为什么 arp 条目丢失。但我希望这些不同的指导可以让你朝着“某个”方向前进。
概括
这给我们带来了这个候选列表,它概述了如何使用 FreeBSD 过上更幸福的生活:
- 系统设置应该位于/etc/rc.conf
- 如果你想要自己的 rc 脚本,请将它们放入/usr/local/etc/rc.d
- 如果你想要一个简单的启动脚本,请将其放入/etc/rc.local(如果你愿意,你可以source rc)
- 如果您想要在启动时使用真正通用的脚本,请使用@reboot定时任务
- 使用系统资源库编辑时
/etc/rc.conf
- 使用服务与 rc 脚本交互时
- 使用开发者根据设备状态变化进行操作