注解
在上一篇文章中,考虑了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
设置/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项目页面