[ESXi] Inconsistency between kernel data and the configtore can happen when adding the same allowed IP addresses
ESXi에서는 User-mode Application들이 Kernel 내부 정보를 이용할 수 있도록 VSI(VMKernel Sysinfo Interface)를 제공하고 있습니다.
다음과 같은 개념도를 통해 간단하게 이해해 볼 수 있습니다.
VSI를 내부적으로 공부하면서 느낀 건 Windows OS를 공부하면서 확인했던 Windows Registry와 매우 흡사하다는 것입니다. Windows Registry처럼 ESXi OS의 Command-Line Interface인 vsish 도구를 제공하여, 각종 저장된 정보를 조회/설정/변경이 가능합니다.
오늘은, 이 VSI와 관련하여 방화벽 IP 설정 시 발생했던 오류 현상에 대해 다뤄보겠습니다.
[Symptom]
vCenter UI를 통해서 여러 Firewall Rule에 허용 또는 차단 IP Address를 추가할 수 있는데, 고객사에서 허용 IP Address를 추가할 때 다음과 같은 오류가 발생
[Troubleshooting Notes]
1. ESXi 버전 확인
VMware ESXi 8.0.3 build-24022510
2. Hostd 로그 확인
vCenter UI에서 확인했던 오류 메시지와 동일한 로그 확인 및 addIP4 operation 과정에서 실패한 것을 확인
2024-11-21T12:37:47.065Z Er(163) Hostd[2098971]: [Originator@6876 sub=Hostsvc.FirewallSystemProvider opID=m1g4o53j-2836444-auto-1osm6-h5:70727305-d6-23-05ff sid=52231b52 user=vpxuser:VSPHERE.LOCAL\Administrator] UpdateAllowedHosts: Failed to set allowed hosts for specfied ruleset: N6VmkCtl3Lib16SysinfoExceptionE(Unable to complete Sysinfo operation. Please see the VMkernel log file for more details.: Already exists: VSI node (5006:) ) 2024-11-21T12:37:47.066Z In(166) Hostd[2098969]: [Originator@6876 sub=Vimsvc.ha-eventmgr] Event 989773 : Firewall configuration operation 'addIP4' failed. The changes were not applied to rule set vSphereClient. |
3. ConfigStore 정보 확인 시, 고객이 추가하고자 했던 IP 정보가 특정 RuleSet에는 보이지 않음
하지만, 다른 RuleSet에는 정상적으로 추가
{ "name": "sshServer", "allowed_ips": [ { "name": "vSphereClient", "allowed_ips": [ ... { "address": "<IP_Address>" } { "name": "webAccess", "allowed_ips": [ ... { "address": " <IP_Address> " } |
4. Hostd 로그에 남아있는 Call Stack 정보 확인 시, Internal Exception 발생하면서 실패한 것으로 판단
5. 문제가 된 시점 이전의 Hostd 로그를 살펴보면, 특이하게도 고객이 추가하고자 했던 IP_Address가 두 개 들어간 것을 확인
2024-11-21T12:09:56.462Z Db(167) Hostd[2100811]: [Originator@6876 sub=Solo.Vmomi opID=m3mk4md5-28828-auto-m8u-h5:70008274-70-da-20cd sid=523fcf58 user=vpxuser:VSPHERE.LOCAL\Administrator] Arg spec: 2024-11-21T12:09:56.462Z Db(167) Hostd[2100771]: --> (vim.host.Ruleset.RulesetSpec) { 2024-11-21T12:09:56.462Z Db(167) Hostd[2100771]: --> allowedHosts = (vihttp://m.host.Ruleset.IpList) { 2024-11-21T12:09:56.462Z Db(167) Hostd[2100771]: --> ipAddress = (string) [ 2024-11-21T12:09:56.462Z Db(167) Hostd[2100771]: --> " <IP_Address> ", ### <-- !! 2024-11-21T12:09:56.462Z Db(167) Hostd[2100771]: --> " <IP_Address> " ### <-- !! 2024-11-21T12:09:56.462Z Db(167) Hostd[2100771]: --> ], |
6. 내부에서 Repro 테스트 시, 동일한 IP Adress를 허용 IP 목록에 넣어주는 경우, 고객사 환경과 동일하게 Already exists 메시지가 발생
아래 예시에서는 192.168.2.2를 두 개 추가 시도
추가 작업이 실패하고 나면, UI에서는 기존에 추가하려고 했던 IP 목록은 보이지 않음
7. 테스트 환경에서 Hostd 로그 확인 시, 동일한 로그 기록 확인
2024-12-02T01:16:57.357Z verbose hostd[264839] [Originator@6876 sub=Solo.Vmomi opID=m2trqkmj-105171-auto-295h-h5:70013273-93-b2-dc49 user=vpxuser:VSPHERE.LOCAL\Administrator] Arg spec: --> (vim.host.Ruleset.RulesetSpec) { --> allowedHosts = (vihttp://m.host.Ruleset.IpList) { --> ipAddress = (string) [ --> "100.100.100.100", --> "192.168.2.2", --> "192.168.2.2" --> ], --> ipNetwork = (vim.host.Ruleset.IpNetwork) [ --> (vim.host.Ruleset.IpNetwork) { --> network = "192.168.1.0", --> prefixLength = 24 --> } --> ], --> allIp = false --> } --> } 2024-12-02T01:16:57.357Z info hostd[264839] [Originator@6876 sub=Solo.Vmomi opID=m2trqkmj-105171-auto-295h-h5:70013273-93-b2-dc49 user=vpxuser:VSPHERE.LOCAL\Administrator] Throw vim.fault.PlatformConfigFault 2024-12-02T01:16:57.357Z info hostd[264839] [Originator@6876 sub=Solo.Vmomi opID=m2trqkmj-105171-auto-295h-h5:70013273-93-b2-dc49 user=vpxuser:VSPHERE.LOCAL\Administrator] Result: --> (vim.fault.PlatformConfigFault) { --> faultMessage = (vmodl.LocalizableMessage) [ --> (vmodl.LocalizableMessage) { --> key = "cohttp://m.vmware.esx.hostctl.default", --> arg = (vmodl.KeyAnyValue) [ --> (vmodl.KeyAnyValue) { --> key = "reason", --> value = "Unable to complete Sysinfo operation. Please see the VMkernel log file for more details.: Already exists" --> } --> ], --> } --> ], --> text = "", --> msg = "" --> } |
8. 테스트 환경에서 확인 시, 다음과 같이 VSI Node에 추가 실패한 IP Address 관련 Entry가 남아 있음
# vsish -e get /vmkModules/esxfw/rulesets/vSphereClient/allowedIP4/2/desc ESXFW allowed IPv4 address { allowed ip4 address:0x0202a8c0 ------------------------> 192.168.2.2 allowed ip4 address, mask:0xffffffff pkts matched:0 bytes matched:0 } |
9. 해당 문제는 Firewall에 IP Address를 추가하는 과정에서 작업 완료 전 추가한 Cache 성격의 Entry를 작업이 실패한 경우 올바르게 처리하지 못해 발생한 버그로 확인
10. 내부 개발팀 통해 해당 버그는 Fix 되었고, 향후 ESXi Release에 포함될 예정
[Conclusion]
Workaround
1. 해당 문제가 발생하는 경우, ESXi Host를 재부팅 하면 남아있던 Stale Entry는 자동 제거
2. 또는 재부팅 이전에 removeIP4 operation 명령어를 통해서도 수동 제거 시도 가능
# vsish -e set /vmkModules/esxfw/rulesetCmd removeIP4 vSphereClient 0x0202a8c0 0xffffffff |
[참고 자료]
https://knowledge.broadcom.com/external/article/383889/inconsistency-between-kernel-data-and-th.html