Networking

[ESXi] Inconsistency between kernel data and the configtore can happen when adding the same allowed IP addresses

haewon83 2024. 12. 24. 09:29

 

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