Имеем внутреннюю подсеть 172.17.2.0/24
Шлюз у клиентов прописан 172.17.2.100
Далее.
2 роутера. 1) FreeBSD 7.2 (MASTER) 2) FreeBSD 8.0 (SLAVE)
Внутренний виртуальный адрес CARP 172.17.2.100
Внешний виртуальный адрес CARP 192.168.0.100
Правила pf идентичны на обоих шлюзах, за исключением названия самих интерфейсов. msk0, msk1 - MASTER. em0, em1 - SLAVE. Ядра собраны из одно и того-же конфига.
ifconfig MASTER (на момент, когда он являлся MASTER'ом):
Код: Выделить всё
msk0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=11a<TXCSUM,VLAN_MTU,VLAN_HWTAGGING,TSO4>
ether 00:1e:8c:30:b9:a2
inet 172.17.2.102 netmask 0xffff0000 broadcast 172.17.255.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
msk1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=11a<TXCSUM,VLAN_MTU,VLAN_HWTAGGING,TSO4>
ether 00:1e:8c:30:ba:6a
inet 192.168.0.102 netmask 0xffffff00 broadcast 192.168.0.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33204
pfsync0: flags=41<UP,RUNNING> metric 0 mtu 1460
pfsync: syncdev: msk0 syncpeer: 172.17.2.101 maxupd: 128
carp0: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
inet 172.17.2.100 netmask 0xffffff00
carp: MASTER vhid 1 advbase 1 advskew 50
carp1: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
inet 192.168.0.100 netmask 0xffffff00
inet 192.168.0.230 netmask 0xffffffff
carp: MASTER vhid 2 advbase 1 advskew 50
Код: Выделить всё
em0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
ether 00:0c:29:76:40:14
inet 172.17.2.101 netmask 0xffff0000 broadcast 172.17.255.255
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
em1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
ether 00:0c:29:76:40:1e
inet 192.168.0.101 netmask 0xffffff00 broadcast 192.168.0.255
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33200
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
pfsync0: flags=41<UP,RUNNING> metric 0 mtu 1460
pfsync: syncdev: em0 syncpeer: 172.17.2.102 maxupd: 128
carp0: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
inet 172.17.2.100 netmask 0xffffff00
carp: MASTER vhid 1 advbase 1 advskew 150
carp1: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
inet 192.168.0.100 netmask 0xffffff00
inet 192.168.0.230 netmask 0xffffffff
carp: MASTER vhid 2 advbase 1 advskew 150
Код: Выделить всё
cloned_interfaces="carp0 carp1"
network_interfaces="carp0 carp1 pfsync0 lo0 msk0 msk1"
ifconfig_pfsync0="syncpeer 172.17.2.101 syncdev msk0"
ifconfig_msk0="inet 172.17.2.102 netmask 255.255.0.0"
ifconfig_msk1="inet 192.168.0.102 netmask 255.255.255.0"
ifconfig_carp0="vhid 1 advskew 50 pass besomething 172.17.2.100/24 255.255.0.0"
ifconfig_carp1="vhid 2 advskew 50 pass besomething 192.168.0.100/24 255.255.255.0"
ifconfig_carp1_alias0="inet 192.168.0.230 netmask 255.255.255.255"
Код: Выделить всё
cloned_interfaces="carp0 carp1"
network_interfaces="carp0 carp1 pfsync0 lo0 em0 em1"
ifconfig_pfsync0="syncpeer 172.17.2.102 syncdev em0"
ifconfig_em0="inet 172.17.2.101 netmask 255.255.0.0"
ifconfig_em1="inet 192.168.0.101 netmask 255.255.255.0"
ifconfig_carp0="vhid 1 advskew 150 pass besomething 172.17.2.100/24 255.255.0.0"
ifconfig_carp1="vhid 2 advskew 150 pass besomething 192.168.0.100/24 255.255.255.0"
ifconfig_carp1_alias0="inet 192.168.0.230 netmask 255.255.255.255"
Код: Выделить всё
# sysctl -a | grep carp
net.inet.ip.same_prefix_carp_only: 0
net.inet.carp.allow: 1
net.inet.carp.preempt: 1
net.inet.carp.log: 1
net.inet.carp.arpbalance: 0
net.inet.carp.suppress_preempt: 0
На самом деле при том, что если отдельно с такими конфигами запустить MASTER-шлюз - то pf режет почти весь трафик. Если отдельно запустить SLAVE - все прекрасно работает. Повторюсь - правила pf одинаковы. В качестве интерфейсов там выступают физические интерфейсы.
Логи tcpdump'a сейчас выложить не могу, удаленно, думаю, не стоит рисковать этим сейчас заниматься. Только я заметил, что pf на MASTER (tcpdump'ом pflog0) начинает "делить" интерфейсы на carpX и mskX по отдельности, причем достаточно в хаотичном порядке, и при том, что на SLAVE такого не происходит. Единственное что сейчас могу выложить (это с MASTER осталось в dmesg -a)
Код: Выделить всё
carp0: incorrect hash
carp0: incorrect hash
carp0: incorrect hash
carp0: incorrect hash
msk0: link state changed to DOWN
msk1: link state changed to DOWN
arp_rtrequest: bad gateway 172.17.2.100 (!AF_LINK)
arp_rtrequest: bad gateway 192.168.0.100 (!AF_LINK)
arp_rtrequest: bad gateway 192.168.0.230 (!AF_LINK)
arp_rtrequest: bad gateway 192.168.0.230 (!AF_LINK)
msk0: link state changed to UP
msk1: link state changed to UP
Итог:
Правильно ведет себя только SLAVE-шлюз. При чем в любом состоянии - будь он MASTER или BACKUP. Первый - ну ни в какую...