Если сокет создан таким образом, что DF устанавливается для исходящих пакетов, вам может повезти в подделке (инъекции) сообщения о необходимости фрагментации ICMP обратно в себя, пока вы не получите желаемый MTU.Скорее уродливо, но в зависимости от того, насколько вы отчаянны, это может быть уместно.
Например, вы можете сгенерировать эти пакеты с помощью правил iptables, поэтому сопоставление и отправка просты и не зависят от вашего приложения.Похоже, что у цели REJECT для iptables нет необходимости отбраковывать фрагментацию, хотя, вероятно, добавить ее будет не так уж и сложно.
Другой подход, если вам нужны только TCP-пакеты, вам может повезти с опцией сокета TCP_MAXSEG или целью TCPMSS, если это соответствует вашей проблеме.
Для UDP или rawвы можете send()
пакетов настолько маленького размера, насколько вы себе представляете!
Обновление:
На основании "почему я хочу это делать?"ответ, это похоже на фрагментацию пакетов, если DF не установлен или повышение ICMP «необходима фрагментация», и удаление фактически будет правильным решением.
Это то, что сделал бы более «нормальный» маршрутизатор, и при условии, что брандмауэры не сгружают пакет ICMP, тогда он будет вести себя разумно во всех сценариях, тогда как ретроспективное изменение вещей - это рецепт странного поведения.
iptables зажим mss довольно неплохое исправление для TCP через эту «VPN», тем более, что, похоже, вы уже широко используете iptables.