Ok, (I think) I see your point.
Did a quick test (not multi-site and no WP caching plugin, WP 4.1.1, PHP 5.5.15, Apache 2.4.10, MySQL 5.6.20, Windows 7 platform) and was not able to reproduce the behaviour. After the test the data in the 3 relevant iTSec tables looks like this (cleared all old data before running the test):
Table: [prefix]_itsec_lockout (1 record)
lockout_id lockout_type lockout_start lockout_start_gmt lockout_expire lockout_expire_gmt lockout_host lockout_user lockout_username lockout_active
22 brute_force 2015-03-21 09:54:51 2015-03-21 08:54:51 2015-03-21 09:59:51 2015-03-21 08:59:51 6.6.6.6 NULL NULL 1
Table: [prefix]_itsec_log (7 records)
log_id log_type log_function log_priority log_date log_date_gmt log_host log_username log_user log_url log_referrer log_data
102 brute_force Invalid Login Attempt 5 2015-03-21 09:54:27 2015-03-21 08:54:27 6.6.6.6 wp_test 1 a:0:{}
103 brute_force Invalid Login Attempt 5 2015-03-21 09:54:32 2015-03-21 08:54:32 6.6.6.6 wp_test 1 a:0:{}
104 brute_force Invalid Login Attempt 5 2015-03-21 09:54:36 2015-03-21 08:54:36 6.6.6.6 wp_test 1 a:0:{}
105 brute_force Invalid Login Attempt 5 2015-03-21 09:54:39 2015-03-21 08:54:39 1.1.1.1 wp_test 1 a:0:{}
106 brute_force Invalid Login Attempt 5 2015-03-21 09:54:47 2015-03-21 08:54:47 6.6.6.6 wp_test 1 a:0:{}
107 brute_force Invalid Login Attempt 5 2015-03-21 09:54:51 2015-03-21 08:54:51 6.6.6.6 wp_test 1 a:0:{}
108 lockout Host or User Lockout 10 2015-03-21 09:54:51 2015-03-21 08:54:51 6.6.6.6 0 a:3:{s:7:”expires”;s:19:”2015-03-21 09:59:51″;s:11…
Table: [prefix]_itsec_temp (12 records)
temp_id temp_type temp_date temp_date_gmt temp_host temp_user temp_username
1 brute_force 2015-03-21 09:54:27 2015-03-21 08:54:27 6.6.6.6 NULL NULL
2 brute_force 2015-03-21 09:54:27 2015-03-21 08:54:27 NULL 1 wp_test
3 brute_force 2015-03-21 09:54:32 2015-03-21 08:54:32 6.6.6.6 NULL NULL
4 brute_force 2015-03-21 09:54:32 2015-03-21 08:54:32 NULL 1 wp_test
5 brute_force 2015-03-21 09:54:36 2015-03-21 08:54:36 6.6.6.6 NULL NULL
6 brute_force 2015-03-21 09:54:36 2015-03-21 08:54:36 NULL 1 wp_test
7 brute_force 2015-03-21 09:54:39 2015-03-21 08:54:39 1.1.1.1 NULL NULL
8 brute_force 2015-03-21 09:54:39 2015-03-21 08:54:39 NULL 1 wp_test
9 brute_force 2015-03-21 09:54:47 2015-03-21 08:54:47 6.6.6.6 NULL NULL
10 brute_force 2015-03-21 09:54:47 2015-03-21 08:54:47 NULL 1 wp_test
11 brute_force 2015-03-21 09:54:51 2015-03-21 08:54:51 6.6.6.6 NULL NULL
12 brute_force 2015-03-21 09:54:51 2015-03-21 08:54:51 NULL 1 wp_test
Where 1.1.1.1 is the legitimate ip and 6.6.6.6 is the nefarious one.
I did 3 bad logins from 6.6.6.6 and then 1 bad login from 1.1.1.1 followed by another 2 bad logins from 6.6.6.6. (all bad login attempts using the same existing username: wp_test).
After the test while 6.6.6.6 was locked out 1.1.1.1 was still able to login (no host lockout).
Timings are not similar and I may not have followed all the correct steps (due to missing\uncertain info) but I just did this test to see whether the iTSec plugin lockout code logic is correct. And judging from the test results it seems to be.
Still wonder how my test data compares to\differs from yours. For example you probably have 2 (host lockout) records in the [prefix]_itsec_lockout table.
Oh perhaps worth mentioning, while testing I did run into a bug which turns out to be introduced recently (4.6.8) but it is not related to host lockouts.
“Locked out users” usernames will not be displayed in the Dashboard “Active Lockouts” metabox:
It currently shows:
Locked out users [ ] – Expires in x minutes.
while is should display:
Locked out users [ ] wp_test – Expires in x minutes.
Next thing that popped up in my mind is caching …
Are you using a WP caching plugin ?
dwinden