ESXi 6.7: заблокувати ICMP неможливо — доводимо практично
«Досліджував питання разом з Claude (Anthropic) — перевірили всі можливі підходи на реальному хості»
Виникло просте завдання — заблокувати ping на VMkernel хості ESXi 6.7 який дивиться в інтернет, але дозволити з певних IP. Здавалося б, стандартна задача. Але ні.
Ось як ми до цього дійшли.
Середовище
- ESXi 6.7, один VMkernel інтерфейс
vmk2назовні - Доступ по SSH
Що перепробували
Firewall ruleset — перше що спадає на думку:
esxcli network firewall ruleset list
Біля 40 правил — SSH, vSphere, NFC і т.д. ICMP нема взагалі. При цьому:
esxcli network firewall get
# Default Action: DROP
DROP за замовчуванням — але ping все одно проходить. Значить ICMP обробляється до firewall, на рівні VMkernel.
XML ruleset — спробували знайти підтримку ICMP в конфігах:
grep -r "icmp" /etc/vmware/
Тільки в /etc/protocols як визначення протоколу. У firewall правилах — тільки TCP та UDP.
iptables — звичний інструмент:
iptables -L
# -sh: iptables: not found
В ESXi його просто немає.
vsish sysctl — пішли глибше в VMkernel параметри:
vsish -e ls /net/tcpip/instances/defaultTcpipStack/sysctl/ | grep -i icmp
# _net_inet_icmp_bmcastecho
# _net_inet_icmp_tstampreply
# _net_inet_icmp_reply_from_interface
Три параметри — але жоден не відповідає за відключення echo. Параметра icmp_echo_ignore_all як у Linux — не існує.
Перевірили статистику:
vsish -e get /net/tcpip/instances/defaultTcpipStack/stats/icmp
# reflect: 3134562
reflect — VMkernel просто відбиває всі ping на рівні мережевого стека, до будь-яких фільтрів.
dvFilter — знайшли агента dvfilter-generic-fastpath, теоретично міг би фільтрувати ICMP:
python3 /bin/netdbg.py vswitch eth_filter get
# ImportError: No module named 'nsx'
Потребує NSX якого немає.
vmkctl Python API:
grep -i "PROTO_TYPE" /lib64/python3.5/vmkctl.py
# IPSEC_PROTO_TYPE_ICMP6 ← є тільки IPv6!
IPv4 ICMP в API просто відсутній.
Підсумок
| Метод | Результат |
|---|---|
| Firewall ruleset | Немає ICMP |
| XML правила | Тільки TCP/UDP |
| iptables | Відсутній |
| vsish sysctl | Немає потрібного параметра |
| dvFilter | Потребує NSX |
| vmkctl | Тільки ICMP6 |
ESXi 6.7 заблокувати ICMP на VMkernel інтерфейсі штатними засобами неможливо. ICMP обробляється на рівні ядра до будь-яких фільтрів.
Якщо хтось знає робоче рішення — буду радий почути в коментарях.
*Всі команди виконані на реальному продакшен хості.*
7 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівРозмішення в периметрі за CheckPoint-ом, і всі забаганки регулюються ним, звісно, якщо вся фізика серверної ваша.
CheckPoint — хороше рішення, якщо є бюджет і вся інфраструктура ваша. В даному випадку завдання було знайти рішення штатними засобами ESXi без додаткового обладнання.
При цьому треба розуміти ліміти ваших забаганок, де він використовувався, були теж інциденти
Дякую за думку! Питання дослідження було чому ESXi не може блокувати ICMP стандартними засобами. Думаю це не випадковість, а свідоме рішення VMware
гіпервізор має бути в захищеній мережі в принципі
icmp блокувати погана ідея загалом, бо він обслуговує не лише echo
На рахунок що робити, на цій древній версії навіть не знаю чи є сенс шукати рішення, але спробуй не весь icmp а конкретно echo. Можна ще спробувати фільтрувати egress.
Але це все в принципі задача файрвола мережі де гіпервізор живе, а не гіпервізора
Якщо дивитися очима людини, яка пам’ятає Cisco IOS 11.x, Ping of Death, Smurf, LAND, Teardrop та інші класичні історії, бажання відключити ICMP на будь-якому критичному вузлі виглядає цілком природним. Це не стільки захист від сучасного експлойта, скільки принцип мінімізації поверхні атаки.
Погоджуюсь, що в ідеалі гіпервізор має бути за файрволом. Але в даному випадку хост дивиться напряму в інтернет — це реальна ситуація де файрвола мережі немає. Тому і шукали рішення на рівні хоста. Спробуємо egress фільтрацію — дякую за підказку!