Я использовал NicSetSetting для установки MAC-адреса виртуальных сетевых адаптеров, присоединяющихся к концентратору. Я использовал статическую аренду, поэтому MAC-адрес эффективно определяет IP-адрес, который должен получить сетевой адаптер.
Однако я заметил, что изменение MAC-адреса, хотя оно и записано в данных Softether, не отражается в реальной ОС до перезапуска самого VPN-клиента. Это означает, что при первом контакте мои сетевые адаптеры настроены с неправильными IP-адресами.
Я также пробовал:
Однако у меня работает только vpnclient stop && vpnclient start
. Я использую два отдельных клиента:
Оба демонстрируют одинаковое поведение. Это ошибка или особенность?
Не могли бы вы убедиться, что эта проблема все еще возникает?
@ moatazelmasry2 Извините за медленный ответ. Не принимал Softether несколько месяцев.
Сегодня я посмотрел на это.
Так что, мне кажется, этот выпуск все еще актуален. Версии Сервера и Клиента были:
@ moatazelmasry2 На самом деле я не специалист по C ++, но мне кажется, что проблема заключается в коде здесь или вокруг него:
r
в данном случае является результатом r = Search(c->UnixVLanList, &t);
. После этого есть вызовы CiSaveConfigurationFile
и CiNotify
и CiSendGlobalPulse
- ни один из которых, похоже, не делает ничего особенного на уровне ОС. Так, может быть, он просто устанавливает MAC во внутреннем списке, сохраняет его в конфигурации, а затем фактически не пытается обновить виртуальный адаптер?
Когда клиент перезапускается, конечно, он правильно инициализирует адаптер с тем, что он находит в конфигурации.
Рассматривая далее инициализацию устройства TAP для виртуальной сетевой карты, мы видим эту строку, которая, кажется, устанавливает MAC-адрес при инициализации:
Это функция под названием UnixCreateTapDeviceEx
- так что я думаю, что нам нужен вызов UnixModifyTapDevice
, который на самом деле вызывает ioctl
с новым MAC? Учитывая, что этого еще не существует, возможно, на это есть веская причина!
Еще не проверял, но это похоже на очень хороший анализ. Солидная работа !!!. Теперь нам нужно, чтобы кто-то это реализовал :)
Самый полезный комментарий
@ moatazelmasry2 На самом деле я не специалист по C ++, но мне кажется, что проблема заключается в коде здесь или вокруг него:
https://github.com/SoftEtherVPN/SoftEtherVPN/blob/bed99f9a56e29a0fcd7a9e3d02f84f9d8621eb3d/src/Cedar/Client.c#L8104
r
в данном случае является результатомr = Search(c->UnixVLanList, &t);
. После этого есть вызовыCiSaveConfigurationFile
иCiNotify
иCiSendGlobalPulse
- ни один из которых, похоже, не делает ничего особенного на уровне ОС. Так, может быть, он просто устанавливает MAC во внутреннем списке, сохраняет его в конфигурации, а затем фактически не пытается обновить виртуальный адаптер?Когда клиент перезапускается, конечно, он правильно инициализирует адаптер с тем, что он находит в конфигурации.
Рассматривая далее инициализацию устройства TAP для виртуальной сетевой карты, мы видим эту строку, которая, кажется, устанавливает MAC-адрес при инициализации:
https://github.com/SoftEtherVPN/SoftEtherVPN/blob/d7d0e6d36fe1d73eca6205d9b2144ded67f52b13/src/Cedar/VLanUnix.c#L527
Это функция под названием
UnixCreateTapDeviceEx
- так что я думаю, что нам нужен вызовUnixModifyTapDevice
, который на самом деле вызываетioctl
с новым MAC? Учитывая, что этого еще не существует, возможно, на это есть веская причина!