Пир VPN пингует другие интерфейсы, потому что они локальные
Локальная таблица маршрутизации отправляет пакеты на любой адрес, которым владеет хост, на каком бы интерфейсе он ни находился. Настройки пересылки никогда не попадают на этот путь.
Клиент WireGuard подключается и пингует адрес на совершенно другом интерфейсе, и ответ приходит. Записи показывают запрос только на туннеле. Ничего не сломано, и аккуратно отключённая настройка пересылки здесь ни при чём. Это сравнение двух путей, которые на схеме выглядят похоже, а в ядре полностью различаются.
Один путь пересылает пакеты за кого-то другого; другой доставляет их самому хосту.
Пакет, адресованный хосту, остаётся в хосте
Удалённый клиент отправляет IP-пакет на адрес, которым владеет хост. Маршрутизация задаёт один вопрос об этом пакете: является ли этот адрес назначения локальным? Каждый адрес, который держит хост, появляется в локальной таблице маршрутизации, и эта таблица проверяется раньше основной, поэтому пакет уходит в собственный стек хоста, а не наружу через другой интерфейс. Ответ создаётся локально, и он возвращается через туннель, потому что запрос пришёл оттуда.
Это весь механизм. Пересылка не происходит, изменение состояния интерфейса не участвует, и рассматриваемому адресу не нужно быть достижимым откуда-либо ещё.
Почему ip_forward не применяется
Пересылка управляет пакетами, которые должны выйти через другой интерфейс, отличный от того, на который они пришли. Пинг к самому хосту никогда не идёт этим путём: пакет потребляется локально, и ответ создаётся локально. Поэтому установка net.ipv4.ip_forward=0 здесь ничего не меняет, и правило в цепочке пересылки никогда не видит этот трафик. Правильный контроль находится на входном пути, ограниченный входящим интерфейсом или источником.
Вот почему отключение пересылки и предположение, что хост изолирован, создаёт ложное чувство безопасности.
Прочитайте локальную таблицу, которая решила
ip rule show обычно сообщает о правиле с нулевым приоритетом, которое отправляет все поиски сначала в локальную таблицу, а ip route show table local перечисляет собственные адреса хоста с локальной областью. Эта таблица включает адреса на интерфейсах, которые административно отключены, но всё ещё настроены. Статически назначенные адреса IPv4 обычно переживают обрыв связи, и именно поэтому пинг к отключённому мосту может всё ещё успешно пройти и удивить оператора.
IPv6 расходится именно в этом пункте. Его адреса обычно отзываются при обрыве связи, если не задан keep_addr_on_down. Сравнивайте семейства, а не предполагайте, что одно правило покрывает оба.
Чего на самом деле достигает пир
Ответ с собственного адреса маршрутизатора в сегменте ничего не говорит о машинах за этим сегментом. Пир не может достичь хоста за другим интерфейсом этим путём; он достигает только адресов, которыми владеет сам маршрутизатор. Проверка службы на отдельном хосте LAN, а не пинг адреса маршрутизатора, — это то, что устанавливает, разрешена ли пересылка вообще.
Ограничение пира службами, привязанными к адресу туннеля, — вопрос входной политики. Разрешите нужную службу на интерфейсе туннеля и ограничьте источники, которым можно ею пользоваться, потому что пакет действительно приходит туда.
Проверьте и адреса, которые вы собирались вывести из эксплуатации. Удалить адрес с интерфейса надёжнее, чем нагромождать правила межсетевого экрана поверх устаревшего.