ToFoIn v 1.在FreeBSD中保留网关并在外部通道之间切换

注解


在上一篇文章中,考虑了LAN网关的冗余组织。 作为一种解决方案,提出了一个脚本,该脚本当时解决了该问题,但存在许多缺点。 一段时间后,事实证明是消除了这些缺点,部分重写了代码并在输出中获得了可接受的东西。 现在我们可以说脚本已经过足够的测试,可以称为稳定脚本。 为了简化对整个系统的理解,下面将部分复制用于设置辅助服务的要点(就本文的主题而言)。 原因很简单-在这段时间里,ipfw规则也被修改,dns使用绑定前端在Samba4上驻留在AD中,并使用kerberos安全地更新了isc-dhcpd中的记录,并在网关上绑定了辅助DNS服务器,配置的CARP ...总的来说,它变得越来越有趣,但是下面将介绍有关其功能和工作方式的更多信息。 可以参考源给出的所有内容都将以不产生实质的方式进行设计。 从其他任何地方获取的内容,但不再可用,将在此处给出相关注释。

引言


因此,有两种方法可以提高用户与外界的通信通道的抗干扰能力:网关的备份和连接点的保留。 换句话说,在第一种情况下,将建立第二个网关,如果第一个网关发生故障,则将激活第二个网关;在第二种情况下,如果主要网关出现任何问题,则将组织一个备用Internet通道,并且它们越远越好。 如果CARP解决了FreeBSD的第一个任务,那么在组织了第二个外部通道之后,第二个问题可以通过多种方式再次解决。 至少,您可以组织流量平衡或在通道之间进行切换。 由于外部通道带宽的巨大差异,第一个选项不适合我,因此该出版物的主要罪魁祸首是: ToFoIn-一组bash脚本,旨在解决诊断问题并切换到可用的外部通道。 优化后,可以应用于n个网关和m个通道。 这种情况很弱,其中n和m大于2,但是下面的脚本应使用较大的n和m值,因为 逻辑上,未设置限制。 总的来说,我怀疑使用这些脚本可以解决相当多的任务,具体取决于连接的状态,也许仅受想象力的限制。


这种网络拓扑大约以最简单的形式假设使用一组ToFoIn脚本。 当然,在单个路由器的情况下,脚本应该可以解决问题,但是在这种情况下,您将必须大力更改Daemon模块,以消除操作序列对CARP状态的依赖,而该依赖关系在系统中将根本不存在。 这些和其他节点的进一步保留仅取决于相应服务的重要性。

目的和目的


与以前一样,该项目的目标是创建一个通用且易于扩展的软件包,重点在于识别外部和内部连接中的问题并自动切换到可用连接。 一般而言,逻辑如下:

  • 有n个“路由器”,每个路由器有m个外部通道。 此外,所有n个“路由器”都处于严格的层次结构中,并且在所有必要的接口上使用CARP相互连接。
  • 代理在每台机器上独立工作,其任务基于其机器的当前CARP状态:
    • 如果是备份-在当前是主路由器的路由器上检测并配置计算机;
    • 如果是主设备,请检查当前连接状态,并在必要时在外部通道之间切换。

解决方案


内部网络具有CARP,该CARP提供备份网关,并允许您在切换频道时不更改内部网络上其他网络设备的设置。

dhcpd在主要模式-辅助模式下运行,通常,它的计算机还扮演什么其他角色都没有关系-dhcpd之间的连接发生在内部网络上,路由器始终会看这些内部网络。

主绑定在隐藏在本地网络中的AD中被删除,而辅助绑定服务器与网关路由器在同等条件下工作。

ipfw规则因在给定时刻哪个通道被视为主通道而有所不同,并且在更改角色时由Daemon模块重新启动。

最后介绍一下脚本本身。 现在,这些文件位于相应的目录中,可以从其用户那里使用,并且在rc.d中具有启动脚本。 需要根访问权限的任务由sudo解决。 有一个安装脚本,它考虑了已安装版本的可能存在以及相当详细的设置文件。 这些模块是相同的,只是做了一些小的更改,其中一些功能几乎没有更改:

守护程序 -顾名思义-是在计时器上运行测试和切换模块并监视CARP的主要过程。
测试仪 -仍使用ping命令测试外部通讯。 (如果正在运行,则认为计算机的“ CARP”处于“ Master”状态)
判断 -根据测试结果,确定哪个外部通道有效以及是否需要切换,然后执行切换(如果正在运行,则认为机器处于主状态的CARP)。
侦察员是一个新模块。 它在CARP处于备份状态时启动。 有必要确定当前剩余的路由器中哪一个是主要的。
记录器 -负责事件记录。 有必要确保有关事件的信息不重复并且杂志易于阅读。
看门狗 -按计划从crontab运行。 它确定所有模块的“冻结”状态,并在可能的情况下尝试解决所出现的问题。 即 钉住每个人,简单地说。

除了脚本本身之外,还值得考虑一些更重要的文件:

Tofoin.conf-单个设置文件。
Tofoin.log-单个事件日志文件。
Result_ <内部通道号>是一个工作文件,测试结果添加到此处,在/ tmp中在.pid和其他工作文件旁边创建。

我很乐意回答有关模块操作的问题,并在评论中解释解决方案。

技术部分


配套设备


与上次相比,网关迁移到P4,接收了1536 Mb RAM和三个40 Gb HDD(镜像+备用)。 网卡仍然是PCI,PSU是正常的,自然而然会有UPS。
容量的增加与铁的释放以及源头上过于繁琐的更新有关,但主要是第一个。 OS FreeBSD 11.1,FS zfs。

系统组件设置


更多细节
内核会使用其他附加参数进行编译(也可以在加载程序中进行某些设置,但是这样做更好):

options IPFIREWALL # ipfw firewall options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=50 options IPFIREWALL_NAT options LIBALIAS options DUMMYNET options HZ=1000 options ROUTETABLES=4 options KSTACK_PAGES=4 options KVA_PAGES=512 device carp 

设置/boot/loader.conf:
 geom_mirror_load="YES" zfs_load="YES" kern.geom.label.gptid.enable="0" vm.kmem_size="1024M" vm.kmem_size_max="1024M" vfs.zfs.arc_max="512M" vfs.zfs.vdev.cache.size="30M" vfs.zfs.prefetch_disable=1 kern.vty=vt 

在第一台计算机上设置/etc/rc.conf(主要关注CARP配置):
 ifconfig_eth0="up" vlans_eth0="vlan111 vlan222" create_args_vlan111="vlan 111" create_args_vlan222="vlan 222" ifconfig_eth1="up" vlans_eth1="vlan333 vlan444 vlan555" create_args_vlan333="vlan 333" create_args_vlan444="vlan 444" create_args_vlan555="vlan 555" ifconfig_eth2="up" vlans_eth2="vlan666 vlan777 vlan888" create_args_vlan666="vlan 666" create_args_vlan777="vlan 777" create_args_vlan888="vlan 888" ifconfig_vlan666="inet 192.168.0.1/24" ifconfig_vlan666_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.0.5/32" ifconfig_vlan777="inet 192.168.1.1/24" ifconfig_vlan777_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.1.5/32" ifconfig_vlan888="inet 192.168.2.1/24" ifconfig_vlan888_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.2.5/32" ifconfig_vlan111="inet 192.168.3.1/30" ifconfig_vlan111_alias0="vhid 1 advskew 100 pass MyPassword alias 1.1.1.2/24" ifconfig_vlan222="inet 192.168.4.1/30" ifconfig_vlan333="inet 192.168.5.1/30" ifconfig_vlan333_alias0="vhid 1 advskew 100 pass MyPassword alias 2.2.2.2/30" ifconfig_vlan444="inet 192.168.6.1/30" ifconfig_vlan444_alias0="vhid 1 advskew 100 pass MyPassword alias 3.3.3.2/30" ifconfig_vlan555="inet 192.168.7.1/30" defaultrouter="1.1.1.1" setfib1_enable="YES" setfib1_defaultrouter="3.3.3.1" setfib2_enable="YES" setfib2_defaultrouter="2.2.2.1" zfs_enable="YES" named_enable="YES" dhcpd_enable="YES" firewall_enable="YES" firewall_logging="YES" firewall_script="/etc/firewall.sh" gateway_enable="YES" tofoin_enable="YES" 

图例:
eth0,eth1,eth2-物理适配器
vlan666,vlan777,vlan888-虚拟LAN适配器,
vlan222和vlan555-用于外部网卡之间的冗余通信的适配器(可能不再需要它们,它们在较早之前已被积极使用)
vlan111-主要外部通道
vlan444-备份外部通道
vlan333-电话
在第二台机器上设置/etc/rc.conf(主要关注CARP配置,删除了一些重复的行):
 ifconfig_vlan666="inet 192.168.0.2/24" ifconfig_vlan666_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.0.5/32" ifconfig_vlan777="inet 192.168.1.2/24" ifconfig_vlan777_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.1.5/32" ifconfig_vlan888="inet 192.168.2.2/24" ifconfig_vlan888_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.2.5/32" ifconfig_vlan111="inet 192.168.3.2/30" ifconfig_vlan111_alias0="vhid 1 advskew 0 pass MyPassword alias 1.1.1.2/24" ifconfig_vlan222="inet 192.168.4.2/30" ifconfig_vlan333="inet 192.168.5.2/30" ifconfig_vlan333_alias0="vhid 1 advskew 0 pass MyPassword alias 2.2.2.2/30" ifconfig_vlan444="inet 192.168.6.2/30" ifconfig_vlan444_alias0="vhid 1 advskew 0 pass MyPassword alias 3.3.3.2/30" ifconfig_vlan555="inet 192.168.7.2/30" defaultrouter="1.1.1.1" setfib1_enable="YES" setfib1_defaultrouter="3.3.3.1" setfib2_enable="YES" setfib2_defaultrouter="2.2.2.1" 

在配置ipfw(nat)时需要注意的一些规则是:
要允许CARP流量:
 /sbin/ipfw -q add allow carp from any to any 

“核” nat:
 /sbin/ipfw -q nat 1 config log ip vlan111 reset same_ports deny_in unreg_only /sbin/ipfw -q add nat 1 ip from any to any in 

将特定的路由表与特定的适配器一起使用:
 /sbin/ipfw -q add setfib 0 all from any to any via vlan666 

通常,我可以写一篇有关我使用的ipfw设置的单独文章,但这是另一些时间了。

第三方软件


更多细节
由于需要同时使用两个或多个外部通道,因此方便使用多个路由表,每个路由表一个。 如果这些表是在启动时自行创建的,那就太好了。 rc.d setfib脚本会有所帮助。 ToFoIn中使用的逻辑假定文件名(setfib1,setfib2等)与单个脚本向其中添加默认路由的表的编号匹配。 该表默认为数字“ 0”。
具有Bind(主要角色)的DNS服务器在辅助模式下工作,主要角色是samba4 + bind,隐藏在本地网络中。 在Cricket Lee和Paul Albitz的“ DNS和BIND”一书中详细介绍了设置辅助绑定的方法。 我不记得有任何特殊要求要考虑到将samba4用于辅助服务器,并且在设置文件中也没有提及这些要求。 除非针对不同的Internet通道,否则您可能需要创建2个不同的文件,然后这些文件将由ToFoIn脚本复制到绑定自身读取文件的位置。 这是由于以下事实:当在同一文件中指定两个提供程序的DNS服务器的地址时,考虑到绑定仅适用于一个路由表,因此会出现在特定时刻无法访问的上游服务器的地址解析问题。
故障转移isc-dhcpd。 Dhcpd对于ToFoIn并不是必不可少的,此外,它的缺失根本不会影响脚本,但是,在我看来,将dhcp服务器放置在网关上是很合逻辑的,然后仍然会出现故障转移问题。 与上次相比,这里变得更加有趣...除了故障转移所必需的设置(我上次已描述)(下拉菜单内“预设”部分的开头)。
您还需要一个脚本来使用samba4安全更新AD中的dns记录。 samba4服务器本身应该只安装。 不需要设置和启动,我们只对该套件随附的管理工具感兴趣。 那些人可以在的“具有动态DNS更新的DHCP”部分中找到其他信息。
它看起来很吓人,但确实有效。
至此,第三方软件的配置完成。

关于ToFoIn


gitlab上提供了所有项目文本以及安装脚本。

最后,考虑一个ToFoIn设置文件参数的示例:
系统中使用的路由器数量:
 RNUMBER=2 

使用其他子网时,必须在路由器成为主子网时设置默认路由。 在这里,您可以指定将重新启动的相应setfib文件的编号。 在此示例中,setfib2:
 ADDITLAN=2 

内部适配器名称:
 INT_IF=vlan666 

路由器通过CARP连接的所有其他接口。 控制和维护所有接口的相同状态所必需:
 ALL_IF="vlan111 vlan333 vlan444 vlan666 vlan777 vlan888" 

配置CARP时使用的vhid:
 CARP_VHID=1 

其他路由器内部网络中的IP地址按重要性顺序排列,如果需要,则仅使用ASERV_IP_2,ASERV_IP_3等。
 ASERV_IP_1=192.168.0.2 

外部连接通道数:
 CNUMBER=2 

主要外部连接通道的设置:
适配器名称:
 EXT_0_IF=vlan111 

路由表编号:
 RTABLE_0=0 

默认网关:
 DEFAULT_GATEWAY=2.2.2.1 

备份外部连接通道的设置:
适配器名称:
 EXT_1_IF=vlan444 

路由表编号:
 RTABLE_1=1 

不需要默认网关,因为对于除主路由表之外的所有路由表,都使用rc.d脚本setfib <表号>,正如逻辑假设,该表必须与表号匹配。
测试仪模块参数:
要检查的地址数:
 TNUMBER=2 

发送ping请求的计算机的地址。 最好在第一种情况下使用域名,然后再使用该IP地址:
 PTARGET_0=ya.ru PTARGET_1=8.8.8.8 

每个目标发送的ping数据包数:
 PNUMBER=2 

判断模块设置
返回主通道前成功测试的次数。 恢复操作后返回主通道的时间大约由以下公式计算:(WNUMBER +1)* JUDGEPERIOD秒。
 WNUMBER=3 

记录器模块设置
这2个参数指示Logger多久记录一次重复事件。 记录事件之后,下一次报告LOGFREQ1重试次数,则LOGFREQ2是重试次数。 仅考虑连续事件。
 LOGFREQ1=5 LOGFREQ2=20 

模块启动计时器,以秒为单位
测试器模块的启动周期。 依靠失败的时间来测试所有目标是很有意义的。
 TESTERPERIOD=240 

评审模块的启动期。 安装的数量不要少于TESTERPERIOD。
 JUDGEPERIOD=300 

侦察模块的启动时间。
 SCOUTPERIOD=360 

检查Tester和Judge模块的启动计时器之前的等待时间。 设置小于或等于TESTERPERIOD的值是合乎逻辑的。
 SENSITIVITY=60 

工作模块被挂起之后的时间。 看门狗模块使用。
 TESTERLIMIT=40 JUDGELIMIT=30 LOGGERLIMIT=20 SCOUTLIMIT=120 WATCHDOGLIMIT=150 

文件和目录的路径
ipfw脚本的路径。
 FIRESCRIPT=/etc/firewall.sh 

IPFW设置。 如果ipfw设置未移至单独的文件,则FIRESCRIPT = FIRESETDEF。
 FIRESETDEF=/etc/firewall/config 

主要外部渠道的ipfw设置路径:
 FIRESET_0=/etc/firewall/config_0 

备份外部通道的ipfw设置的路径,如有必要,您可以继续执行FIRESET_2等操作:
 FIRESET_1=/etc/firewall/config_1 

绑定设置的路径
 BINDSETDEF=/usr/local/etc/namedb/named.conf 

绑定主要外部通道的设置:
 BINDSET_0=/usr/local/etc/namedb/named.conf.0 

绑定备用外部频道的设置,如有必要,您可以继续进行BINDSET_2等操作:
 BINDSET_1=/usr/local/etc/namedb/named.conf.1 

所有ToFoIn可执行文件的路径:
 DAEMON=/local/sbin/tofoin/daemon.sh TESTER=/usr/local/sbin/tofoin/tester.sh JUDGE=/usr/local/sbin/tofoin/judge.sh LOGGER=/usr/local/sbin/tofoin/logger.sh SCOUT=/usr/local/sbin/tofoin/scout.sh WATCHDOG=/usr/local/sbin/tofoin/watchdog.sh 

事件日志。 现在不会在安装时创建此文件:
 LOGFILE=/var/log/tofoin.log 

相应模块启动时会创建临时文件和目录,停止时会删除其中的一些文件和目录:
 DIR_TMP=/tmp/tofoin DIR_PID=/var/run/tofoin JUDGEMETER=/tmp/tofoin/judgemeter PREVSTATE=/tmp/tofoin/prevstate SCOUTGATE=/tmp/tofoin/scoutgate LOGTMP=/tmp/tofoin/logger.tmp LOGMETER=/tmp/tofoin/logmeter DAEMON_PID=/var/run/tofoin/daemon.pid TESTER_PID=/var/run/tofoin SCOUT_PID=/var/run/tofoin/scout.pid JUDGE_PID=/var/run/tofoin/judge.pid LOGGER_PID=/var/run/tofoin/logger.pid WATCHDOG_PID=/var/run/tofoin_watchdog.pid 


总结


事实证明,这是一组功能全面且可靠的脚本,可以很好地应对在具有2个外部通信通道的2个路由器的情况下切换到工作通道的任务。

计划


我对该项目的计划可能与将bash重写为pure sh来摆脱服务器上不必要的软件有关。 另一方面,现在一切正常,而且我真的不希望干扰此过程,此外,切换到sh充满了为达到相同结果所必需的更糟糕的语言构造。
对于其余的部分,可能值得考虑最佳实现测试模块。

参考文献:


上一篇文章
gitlab上的ToFoIn项目页面

Source: https://habr.com/ru/post/zh-CN421857/


All Articles