We had an issue with a customer were sometimes after a vMotion some of the traffic was dropped from the VM for a short period of time (aprox. 5 minutes). After that short period everything was working as expected. (NSX-T 3.2.0.1). When we looked in loginsight we could see that traffic was dropped based on a rule that had a higher number as the allow rule. So we had some strong indication that this had something to do with firewall rules en adressets that get pushed to the interface(s) of the VMs after the vMotion.

To assure that the issue we were facing was indeed related to the vMotion we set DRS to the least aggressive stand, and we postponed all the upgrades on ESXi hosts that were planned.We didn’t see the issue any more. So we knew we were on the right track.

We logged a case with GSS and did some test migration. During this migration, we would get a complete list of the firewall rules and adressets of the interface before and after to see if there was any difference to prove our theories. Unfortunately, the problem did not occur.

So we knew we had to step up our game. We decided to place all the hosts sequentially in maintenance mode on a lovely Sunday morning. You can imagine that it is not that much fun to collect all the firewall rules/addressets from the interfaces before and after the migration. So I came up with a little script.

In the past, I had some fun with Posh-SSH Powershell Module. This module allows you to run SSH sessions in PowerShell and records the output so you can use it.

This PowerShell script runs through an entire cluster and gets per-hosts-per-interface the firewall addresset and rules. It then logs them to a text file per interface. We did not know if we were able to grep the issue because we had a limited time frame of 5 minutes, but the script ran for a total of 2 minutes so we just needed a little luck.

We ran the script before and after we placed a host in maintenance mode and all the vMotions were done. If we saw the problem we could checked the corresponding log file of that interface to determine what firewall rule/addresset were active before/after migration so we can send them to GSS for analyses.

When we put the last host in maintenance we finally were able to reproduce the issue. So it seems it gets only triggered after a lot of vMotions. We delivered the DATA back to GSS and we got an answer we were expecting; We were hitting a bug :). https://kb.vmware.com/s/article/88228?lang=en_US

We didn’t upgrade the customer yet so we are not 100 % certain that this is our issue but it sure seems like the same problem.

At last, the code which I used. It sure can use some optimizations, but it did the trick :).

sorry for the code
#variabels
$vcenter = 'vcentername'
$cluster = 'clustername' 
$getallnics = "summarize-dvfilter | grep -A 3 'vmm'"
$date = get-date -format HHmmddMM

#Connect to vCenter
connect-viserver $vcenter
$hosts = get-cluster $cluster |get-vmhost

#user and password of the ESXi Hosts
$user = 'root'
$pswd = 'password'

$pswdSec = ConvertTo-SecureString -String $pswd -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($user,$pswdSec)

#enable SSH on all hosts
Get-VMHost -Name $hosts| Foreach {Start-VMHostService -HostService ($_ | Get-VMHostService | Where { $_.Key -eq "TSM-SSH"} )}

#foreach loop through al the hosts
foreach ($esxhost in $hosts){
#grep all the VMs on the host to be sure we know where the VM started
Get-VMHost $esxhost | ForEach-Object -Process {
    get-vmhost $esxhost |get-vm| select name,id| out-file ".logging$esxhost.VMs.$date.txt"

    #Build SSH Session to host
    if((Get-VMHostService -VMHost $_).where({$_.Key -eq 'TSM-SSH'}).Running){
    $ssh = New-SSHSession -ComputerName $esxhost.name -Credential $cred -AcceptKey -KeepAliveInterval 5
        #Collect al Interfaces/Nic on the specific host
         $getalnics0 = Invoke-SSHCommand -SessionId $ssh.SessionId -Command $getallnics -TimeOut 30
         $getalnics0.output | out-file ".loggingVMs.niclist.$date.txt" -Append
        #Some not so fancy trimming so i have only the interface name left
         $trimnics = $($getalnics0.output |select-string Name) -split(":")|select-string nic
        
        #Foreach loop so we can get the firewall rules and addressets per interface
         Foreach ($trimnic in $trimnics){
        #Get-addresset
         $addresset = "vsipioctl getaddrsets -f $trimnic"
         $addresset0 = Invoke-SSHCommand -SessionId $ssh.SessionId -Command $addresset  -TimeOut 30
        #output naar textfile
         $addresset0.output |out-file .logging$trimnic.$esxhost.$date.txt
        #get-ruleset
         $ruleset = "vsipioctl getrules -f $trimnic"
         $ruleset0 = Invoke-SSHCommand -SessionId $ssh.SessionId -Command $ruleset -TimeOut 3
        #Output to textfile
         $ruleset0.output |out-file .logging$trimnic.$esxhost.$date.txt -Append
         }
        #verwijderen SSH sessie
        Remove-SSHSession -SessionId $ssh.SessionId
    }
    }
}
#As you can imagine this created a bunch of log files. To keep it somehow organized I put everything in an ZIP file
$compress = @{
  Path = ".logging*.txt"
  CompressionLevel = "Fastest"
  DestinationPath = ".logging$date.zip"
}
Compress-Archive @compress
Remove-item ".logging*.txt"

Get-VMHost -Name $hosts| ForEach {Stop-VMHostService -HostService ($_ | Get-VMHostService | Where {$_.Key -eq “TSM-SSH”}) -Confirm:$FALSE}

The original article was posted on: www.ruudharreman.nl

Related articles

  • Digital Workspace
  • Cloud Native
  • Implementation and Adoption
  • Platform Engineering
  • Hybrid Cloud
  • Private: ITTS (IT Transformation Services)
  • Private: Managed Security Operations
  • Managed Cloud Platform
  • Private: Backup & Disaster Recovery
Visit our knowledge hub
Visit our knowledge hub
Ruud Harreman Teamlead Datacenter and Security

Let's talk!

Knowledge is key for our existence. This knowledge we use for disruptive innovation and changing organizations. Are you ready for change?

"*" indicates required fields

First name*
Last name*
  • United States+1
  • United Kingdom+44
  • Afghanistan (‫افغانستان‬‎)+93
  • Albania (Shqipëri)+355
  • Algeria (‫الجزائر‬‎)+213
  • American Samoa+1
  • Andorra+376
  • Angola+244
  • Anguilla+1
  • Antigua and Barbuda+1
  • Argentina+54
  • Armenia (Հայաստան)+374
  • Aruba+297
  • Ascension Island+247
  • Australia+61
  • Austria (Österreich)+43
  • Azerbaijan (Azərbaycan)+994
  • Bahamas+1
  • Bahrain (‫البحرين‬‎)+973
  • Bangladesh (বাংলাদেশ)+880
  • Barbados+1
  • Belarus (Беларусь)+375
  • Belgium (België)+32
  • Belize+501
  • Benin (Bénin)+229
  • Bermuda+1
  • Bhutan (འབྲུག)+975
  • Bolivia+591
  • Bosnia and Herzegovina (Босна и Херцеговина)+387
  • Botswana+267
  • Brazil (Brasil)+55
  • British Indian Ocean Territory+246
  • British Virgin Islands+1
  • Brunei+673
  • Bulgaria (България)+359
  • Burkina Faso+226
  • Burundi (Uburundi)+257
  • Cambodia (កម្ពុជា)+855
  • Cameroon (Cameroun)+237
  • Canada+1
  • Cape Verde (Kabu Verdi)+238
  • Caribbean Netherlands+599
  • Cayman Islands+1
  • Central African Republic (République centrafricaine)+236
  • Chad (Tchad)+235
  • Chile+56
  • China (中国)+86
  • Christmas Island+61
  • Cocos (Keeling) Islands+61
  • Colombia+57
  • Comoros (‫جزر القمر‬‎)+269
  • Congo (DRC) (Jamhuri ya Kidemokrasia ya Kongo)+243
  • Congo (Republic) (Congo-Brazzaville)+242
  • Cook Islands+682
  • Costa Rica+506
  • Côte d’Ivoire+225
  • Croatia (Hrvatska)+385
  • Cuba+53
  • Curaçao+599
  • Cyprus (Κύπρος)+357
  • Czech Republic (Česká republika)+420
  • Denmark (Danmark)+45
  • Djibouti+253
  • Dominica+1
  • Dominican Republic (República Dominicana)+1
  • Ecuador+593
  • Egypt (‫مصر‬‎)+20
  • El Salvador+503
  • Equatorial Guinea (Guinea Ecuatorial)+240
  • Eritrea+291
  • Estonia (Eesti)+372
  • Eswatini+268
  • Ethiopia+251
  • Falkland Islands (Islas Malvinas)+500
  • Faroe Islands (Føroyar)+298
  • Fiji+679
  • Finland (Suomi)+358
  • France+33
  • French Guiana (Guyane française)+594
  • French Polynesia (Polynésie française)+689
  • Gabon+241
  • Gambia+220
  • Georgia (საქართველო)+995
  • Germany (Deutschland)+49
  • Ghana (Gaana)+233
  • Gibraltar+350
  • Greece (Ελλάδα)+30
  • Greenland (Kalaallit Nunaat)+299
  • Grenada+1
  • Guadeloupe+590
  • Guam+1
  • Guatemala+502
  • Guernsey+44
  • Guinea (Guinée)+224
  • Guinea-Bissau (Guiné Bissau)+245
  • Guyana+592
  • Haiti+509
  • Honduras+504
  • Hong Kong (香港)+852
  • Hungary (Magyarország)+36
  • Iceland (Ísland)+354
  • India (भारत)+91
  • Indonesia+62
  • Iran (‫ایران‬‎)+98
  • Iraq (‫العراق‬‎)+964
  • Ireland+353
  • Isle of Man+44
  • Israel (‫ישראל‬‎)+972
  • Italy (Italia)+39
  • Jamaica+1
  • Japan (日本)+81
  • Jersey+44
  • Jordan (‫الأردن‬‎)+962
  • Kazakhstan (Казахстан)+7
  • Kenya+254
  • Kiribati+686
  • Kosovo+383
  • Kuwait (‫الكويت‬‎)+965
  • Kyrgyzstan (Кыргызстан)+996
  • Laos (ລາວ)+856
  • Latvia (Latvija)+371
  • Lebanon (‫لبنان‬‎)+961
  • Lesotho+266
  • Liberia+231
  • Libya (‫ليبيا‬‎)+218
  • Liechtenstein+423
  • Lithuania (Lietuva)+370
  • Luxembourg+352
  • Macau (澳門)+853
  • North Macedonia (Македонија)+389
  • Madagascar (Madagasikara)+261
  • Malawi+265
  • Malaysia+60
  • Maldives+960
  • Mali+223
  • Malta+356
  • Marshall Islands+692
  • Martinique+596
  • Mauritania (‫موريتانيا‬‎)+222
  • Mauritius (Moris)+230
  • Mayotte+262
  • Mexico (México)+52
  • Micronesia+691
  • Moldova (Republica Moldova)+373
  • Monaco+377
  • Mongolia (Монгол)+976
  • Montenegro (Crna Gora)+382
  • Montserrat+1
  • Morocco (‫المغرب‬‎)+212
  • Mozambique (Moçambique)+258
  • Myanmar (Burma) (မြန်မာ)+95
  • Namibia (Namibië)+264
  • Nauru+674
  • Nepal (नेपाल)+977
  • Netherlands (Nederland)+31
  • New Caledonia (Nouvelle-Calédonie)+687
  • New Zealand+64
  • Nicaragua+505
  • Niger (Nijar)+227
  • Nigeria+234
  • Niue+683
  • Norfolk Island+672
  • North Korea (조선 민주주의 인민 공화국)+850
  • Northern Mariana Islands+1
  • Norway (Norge)+47
  • Oman (‫عُمان‬‎)+968
  • Pakistan (‫پاکستان‬‎)+92
  • Palau+680
  • Palestine (‫فلسطين‬‎)+970
  • Panama (Panamá)+507
  • Papua New Guinea+675
  • Paraguay+595
  • Peru (Perú)+51
  • Philippines+63
  • Poland (Polska)+48
  • Portugal+351
  • Puerto Rico+1
  • Qatar (‫قطر‬‎)+974
  • Réunion (La Réunion)+262
  • Romania (România)+40
  • Russia (Россия)+7
  • Rwanda+250
  • Saint Barthélemy+590
  • Saint Helena+290
  • Saint Kitts and Nevis+1
  • Saint Lucia+1
  • Saint Martin (Saint-Martin (partie française))+590
  • Saint Pierre and Miquelon (Saint-Pierre-et-Miquelon)+508
  • Saint Vincent and the Grenadines+1
  • Samoa+685
  • San Marino+378
  • São Tomé and Príncipe (São Tomé e Príncipe)+239
  • Saudi Arabia (‫المملكة العربية السعودية‬‎)+966
  • Senegal (Sénégal)+221
  • Serbia (Србија)+381
  • Seychelles+248
  • Sierra Leone+232
  • Singapore+65
  • Sint Maarten+1
  • Slovakia (Slovensko)+421
  • Slovenia (Slovenija)+386
  • Solomon Islands+677
  • Somalia (Soomaaliya)+252
  • South Africa+27
  • South Korea (대한민국)+82
  • South Sudan (‫جنوب السودان‬‎)+211
  • Spain (España)+34
  • Sri Lanka (ශ්‍රී ලංකාව)+94
  • Sudan (‫السودان‬‎)+249
  • Suriname+597
  • Svalbard and Jan Mayen+47
  • Sweden (Sverige)+46
  • Switzerland (Schweiz)+41
  • Syria (‫سوريا‬‎)+963
  • Taiwan (台灣)+886
  • Tajikistan+992
  • Tanzania+255
  • Thailand (ไทย)+66
  • Timor-Leste+670
  • Togo+228
  • Tokelau+690
  • Tonga+676
  • Trinidad and Tobago+1
  • Tunisia (‫تونس‬‎)+216
  • Turkey (Türkiye)+90
  • Turkmenistan+993
  • Turks and Caicos Islands+1
  • Tuvalu+688
  • U.S. Virgin Islands+1
  • Uganda+256
  • Ukraine (Україна)+380
  • United Arab Emirates (‫الإمارات العربية المتحدة‬‎)+971
  • United Kingdom+44
  • United States+1
  • Uruguay+598
  • Uzbekistan (Oʻzbekiston)+998
  • Vanuatu+678
  • Vatican City (Città del Vaticano)+39
  • Venezuela+58
  • Vietnam (Việt Nam)+84
  • Wallis and Futuna (Wallis-et-Futuna)+681
  • Western Sahara (‫الصحراء الغربية‬‎)+212
  • Yemen (‫اليمن‬‎)+967
  • Zambia+260
  • Zimbabwe+263
  • Åland Islands+358
Hidden