文書の過去の版を表示しています。
目次
CiscoとVMwareとFreeBSD CARP
某所で少し変な挙動を見かけたので、ちょっと手元の環境で再現試験。 結果を先に書くと、再現しなかったんだけど、環境構築から試験まで色々やったので、ここにまとめておく。
試験環境
- VMware ESXi 6.7 VMware ESXi 6.7をInstallする
- FreeBSD 14.0-Beta5
- Cisco 2960X-48TD-L
ESXiおよびFreeBSD設定
ESXi
- vSwitchを2つ作成
name | MTU | NIC | 無差別 | 偽装 | MAC |
---|---|---|---|---|---|
Test-sw1 | 1500 | vmnic3 | ✕ | ✕ | ✕ |
Test-sw2 | 1500 | vmnic4 | ✕ | ✕ | ✕ |
- PortGroupを2つ作成
name | vLAN | vSW | 無差別 | 偽装 | MAC |
---|---|---|---|---|---|
test-pg1 | 601 | Test-sw1 | ✕ | ✕ | ✕ |
test-pg2 | 601 | Test-sw2 | ✕ | ✕ | ✕ |
言葉の定義 (VMware ESXi 6.7 のマニュアルより抜粋し編集)
- MAC変更を許可
- VMが受け取るトラフィックに影響を及ぼす
- [承諾] ESXi は有効な MAC アドレスを初期 MAC アドレスとは異なるアドレスに変更する要求を受け入れる
- [拒否] ESXi は有効な MAC アドレスを、初期 MAC アドレスとは異なるアドレスに変更する要求を拒否する
- この設定により、MAC のなりすましに対してホストが保護される
- 仮想マシンアダプタが要求の送信に使用したポートは無効になる
- 仮想マシンアダプタは、有効な MAC アドレスが初期 MAC アドレスと一致しない限り、それ以上のフレームを受け取らない
- ゲスト OS は、MAC アドレスの変更要求が拒否されたことを検知しない
- 偽装転送を許可
- VMから転送されるトラフィックに影響を及ぼす
- [承諾] ESXi はソースと有効な MAC アドレスを比較しない
- [拒否] ホストはゲスト OS から転送されるソース MAC アドレスと、その仮想マシンアダプタの有効な MAC アドレスを比較して、それらが一致するかどうかを確認する
- アドレスが一致しない場合、ESXi ホストはパケットをドロップする
- ゲスト OS は、仮想マシンアダプタが、なりすましている MAC アドレスを使用したパケットの送信を実行できないことは検知しない
- ESXi ホストは、なりすましているアドレスのパケットが配信される前に、そのパケットを遮断する
- ゲスト OS は、そのパケットがドロップされたとみなす可能性がある
- 無差別モードを許可
- 仮想マシンアダプタが実行するすべての受信フィルタリングが除去される
- ゲスト OS は回線で監視されるすべてのトラフィックを受信する
FreeBSD
FreeBSDは普通にInstall。
/boot/loader.conf
に以下を追加carp_load=“YES”
/etc/rc.conf
<CODE> hostname=“test-2” # 2号機は test-1 moused_nondefault_enable=“NO” # Set dumpdev to “AUTO” to enable crash dumps, “NO” to disable dumpdev=“NO” zfs_enable=“YES” sshd_enable=“YES”
vmware_guest_kmod_enable=“YES” vmware_guest_enable=“YES”
ifconfig_vmx0=“inet xxx.xxx.xxx.xxx/mm -rxcsum -txcsum -tso -lro” # Management用 ifconfig_vmx1=“inet 192.168.1.1/24 -rxcsum -txcsum -tso -lro” # 2号機は 192.168.1.2/24 を割り当てる ifconfig_vmx1_alias0=“inet vhid 1 advbase 1 advskew 100 pass 192.168.1.3 alias 192.168.1.3/32”
# CARP設定
</CODE>
- Installed package
pkg install doas open-vm-tools-nox11
- おまけ
- Multicast状態の確認には、
ifmcstat
コマンドを実行する。JoinしているGroupなどが確認できる。詳細はman ifmcstat
を参照ifmcstat -i vmx1
など
- CARPの状態変更には
ifconfig [I/F name] vhid [VHID Number] state (master|backup)
コマンドを利用する- ただし、advbase/advskewの値によっては、stateを変えられないことがある。その場合は、I/FをDownした数秒放置するしかない
Cisco Configuration
version 15.2 no service pad service tcp-keepalives-in service tcp-keepalives-out service timestamps debug datetime msec localtime service timestamps log datetime msec localtime service password-encryption service sequence-numbers service unsupported-transceiver no service dhcp ! hostname swc1 ! boot-start-marker boot-end-marker ! ! username seirios privilege 15 password 7 ****************** aaa new-model ! ! aaa authentication login CONSOLE local-case ! ! ! ! ! ! aaa session-id common clock timezone JST 9 0 switch 1 provision ws-c2960x-48td-l no ip source-route ip routing ! ! ip domain-name mgmt.example.com ip name-server 8.8.8.8 ip name-server 8.8.4.4 vtp mode off ! ! ! ! ! ! ! ! ! spanning-tree mode pvst spanning-tree extend system-id no spanning-tree vlan 1-4094 no errdisable detect cause gbic-invalid ! ! ! ! vlan internal allocation policy ascending ! vlan 601 name "Test1" ! no cdp run ! ! ! ! ! ! ! ! ! ! ! interface FastEthernet0 ip address XXX.XXX.XXX.XXX mmm.mmm.mmm.mmm no ip route-cache ! interface GigabitEthernet1/0/1 ! interface GigabitEthernet1/0/2 ! interface GigabitEthernet1/0/3 ! interface GigabitEthernet1/0/4 ! interface GigabitEthernet1/0/5 ! interface GigabitEthernet1/0/6 ! interface GigabitEthernet1/0/7 ! interface GigabitEthernet1/0/8 ! interface GigabitEthernet1/0/9 ! interface GigabitEthernet1/0/10 ! interface GigabitEthernet1/0/11 ! interface GigabitEthernet1/0/12 ! interface GigabitEthernet1/0/13 ! interface GigabitEthernet1/0/14 ! interface GigabitEthernet1/0/15 ! interface GigabitEthernet1/0/16 ! interface GigabitEthernet1/0/17 ! interface GigabitEthernet1/0/18 ! interface GigabitEthernet1/0/19 ! interface GigabitEthernet1/0/20 ! interface GigabitEthernet1/0/21 ! interface GigabitEthernet1/0/22 ! interface GigabitEthernet1/0/23 ! interface GigabitEthernet1/0/24 ! interface GigabitEthernet1/0/25 ! interface GigabitEthernet1/0/26 ! interface GigabitEthernet1/0/27 ! interface GigabitEthernet1/0/28 ! interface GigabitEthernet1/0/29 ! interface GigabitEthernet1/0/30 ! interface GigabitEthernet1/0/31 ! interface GigabitEthernet1/0/32 ! interface GigabitEthernet1/0/33 ! interface GigabitEthernet1/0/34 ! interface GigabitEthernet1/0/35 ! interface GigabitEthernet1/0/36 ! interface GigabitEthernet1/0/37 ! interface GigabitEthernet1/0/38 ! interface GigabitEthernet1/0/39 ! interface GigabitEthernet1/0/40 ! interface GigabitEthernet1/0/41 ! interface GigabitEthernet1/0/42 ! interface GigabitEthernet1/0/43 ! interface GigabitEthernet1/0/44 ! interface GigabitEthernet1/0/45 ! interface GigabitEthernet1/0/46 switchport access vlan 601 switchport trunk allowed vlan 601 switchport mode trunk ! interface GigabitEthernet1/0/47 ! interface GigabitEthernet1/0/48 switchport access vlan 602 switchport trunk allowed vlan 601 switchport mode trunk ! interface GigabitEthernet1/0/49 ! interface GigabitEthernet1/0/50 ! interface TenGigabitEthernet1/0/1 ! interface TenGigabitEthernet1/0/2 ! interface Vlan1 no ip address shutdown ! interface Vlan601 ip address 192.168.1.254 255.255.255.0 ip information-reply no ip route-cache ! no ip http server no ip http secure-server ! ip route 0.0.0.0 0.0.0.0 xxx.xxx.xxx.xxx ip ssh version 2 ! ip access-list extended MGMT permit ip xxx.xxx.xxx.xxx mm.mm.mm.mm any ! ! ! no vstack configuration mode exclusive ! line con 0 logging synchronous line vty 0 4 access-class MGMT in exec-timeout 0 0 privilege level 15 login authentication CONSOLE exec prompt timestamp transport preferred none transport input telnet ssh line vty 5 15 access-class MGMT in exec-timeout 0 0 privilege level 15 login authentication CONSOLE exec prompt timestamp transport preferred none transport input telnet ssh ! ntp server ntp.nict.jp end
なお、HSRP Configurationは
<CODE> interface Vlan601 ip address 192.168.1.254 255.255.255.0 ip broadcast-address 192.168.1.255 ip information-reply standby version 2 standby 1 ip 192.168.1.252 standby 1 priority 80 standby 1 authentication 12345678 no ip route-cache </CODE>
テスト内容
- ESXi上のvSwitch/PortGroupにおける「セキュリティ設定」とCARPの挙動の確認
- CARPが正常に動くために必要な設定の明確化
- VM ↔ vSwitch ↔ Cisco ↔ vSwitch ↔ VM でのCARPの挙動確認
- HSRPがとCARPがCisco上で共存できるかの確認
Test手順と結果
同一PG内でのCARP 動作試験
- 2台のVMのNICをTest-pg1に接続し、表にあるようなPG Security設定をした上で、CARPの状態を確認、変更し、正しく切り替わるか確認する
無差別 | 偽装転送 | MAC変更 | 結果 | 備考 |
---|---|---|---|---|
✕ | ✕ | ✕ | ✕ | CARPは正しく動作しなかった。外からのICMPに返答もしない。 |
〇 | 〇 | 〇 | 〇 | CARPは正しく動作した |
✕ | 〇 | 〇 | ✕ | CARPのStateは正しく動作した(Master/Backupが正しく決定される)が、外部からのpingに対して返答しない |
〇 | ✕ | 〇 | ✕ | CARPは正しく動作しなかった。外からのICMPに返答もしない。 |
〇 | 〇 | ✕ | 〇 | CARPは正しく動作した |
結論
- 無差別モードと偽装転送はPGレベルで承諾する必要がある。何かの影響があるのは望ましくないので、MAC変更も承諾しておいた方が無難
- なお、vSwitchの設定よりもPGの設定の方が優先されるので、vSWの設定は気にしなくて良い
異なるPG間でのCiscoを経由したCARP動作試験
- test-1 の NIC を Test-pg1 に接続
- test-2 の NIC を Test-pg2 に接続
- 注意 pg1/pg2の設定が正しくないと、CARPは正しく動作しないので、Security 設定は全て「承諾」に設定すること
- Cisco側でHSRPをOn/Offして試験を行う
HSRP | Group | auth | 結果 | 備考 |
---|---|---|---|---|
✕ | ✕ | ✕ | 〇 | |
〇 | 10 | ✕ | 〇 | |
〇 | 10 | 〇 | 〇 | |
〇 | 1 | 〇 | 〇 | |
〇 | 1 | ✕ | 〇 |
結論
- Cisco 2960で試験した限りでは、HSRPは問題なく動作したと言える。
- CARPのVHIDとHSRPのGroupが同じでも異なっていても問題はなかった
- 認証の影響もなかった