В соответствии с описанным вами поведением strongSwan, который не подключает новых пользователей или не подключает пользователей вообще, когда ipsec.secrets
становится слишком большим, мы можем с уверенностью сказать, что проблема не в том, что ошибки в скриптах.
Похоже, вы достигли предела файла / буфера / памяти. Реальный вопрос в том, что ваша пользовательская база переросла ваши текущие настройки, например ваша установка может быть идеальной для небольшой базы пользователей, но не предназначена для такого количества пользователей.
В качестве временного решения можно рассмотреть возможность разбивки списка пользователей на несколько серверов VPN.
Однако в среднесрочной / долгосрочной перспективе я бы посоветовал настроить центральный сервер аутентификации, будь то RADIUS, LDAP, MySQL или Active Directory, вместо того, чтобы создавать пользователей в ipsec.secrets
, и создание новой инфраструктуры, позволяющей StrongSwan аутентифицироваться через нее.
В документации подключаемый модуль SQL по-прежнему классифицируется как экспериментальный. Существуют также плагины для PAM, но я бы не рекомендовал их.
FreeRadius также взаимодействует с серверной конфигурацией LDAP и понимает больше протоколов при правильной настройке (а именно PAP, MSCHAPv2, EAP-PAP и EAP-MSCHAPv2). Использование протокола RADIUS также дает дополнительное преимущество, заключающееся в хранении учетных данных в центральной точке. При правильной настройке (например, учет сброса FreeRadius в MySQL, что является необязательной конфигурацией) вы можете очень легко получить списки использования VPN пользователями.
По существу, хотя это и более сложно, я бы порекомендовал для службы вашего размера, чтобы strongSwan общался с FreeRADIUS, а FreeRADIUS общался с сервером LDAP с вашими пользователями и паролями.
Согласно официальной документации:
Аутентификация с помощью RADIUS (например, с FreeRadius)
EAP-Radius Плагин eap-radius не реализует напрямую метод EAP , но он перенаправляет диалог EAP с клиентом на внутренний сервер RADIUS . На шлюзе пакеты EAP извлекаются из сообщений IKE и инкапсулируются в протокол RADIUS, и наоборот. Сам шлюз не требует специальной поддержки для конкретного метода EAP , поскольку он более или менее прозрачно обрабатывает диалог EAP между клиентом и серверной частью RADIUS.
Серверы RADIUS Подключаемый модуль должен работать с любым сервером RADIUS. Мы успешно протестировали его с FreeRADIUS и включенным сервером NPS с Windows Server 2008 R2.
Для методов EAP, предоставляющих MSK, сервер RADIUS должен включать ключ в ключи MPPE-Send / Receive; К сожалению, FreeRADIUS до 2.1.10 не включал эти атрибуты при использовании с EAP-MSCHAPv2.
В качестве альтернативы вы также можете использовать pfSense , брандмауэр с открытым исходным кодом, основанный на FreeBSD и имеющий графический веб-интерфейс; у вас по-прежнему будет проблема с выбором масштабируемого и обслуживаемого серверного модуля.
Я также добавлю в качестве примера, что я управляю парой pfSense IPsec VPN для нескольких тысяч пользователей, аутентифицируемых в FreeRadius + Active Directory.Они используют собственные VPN-клиенты Windows 7–10, MacOS, iOS, Linux и Android.
Также в том, что касается интеграции с WHMCS: отказ от ответственности - я не знаком с WHMCS . Однако мне кажется, что это касается только биллинга в решении VPN. Я подозреваю, что после наличия унифицированной конфигурации RADIUS, позволяющей использовать MySQL, все еще необходимо разработать программное обеспечение для интеграции использования / выставления счетов с WHMCS. В противном случае гораздо сложнее выполнить тяжелую работу по извлечению с разных платформ журналов использования клиентов.
Создайте скрипт sed
, который выполняет все подстановки, а затем примените этот скрипт sed
к вашему файлу.
for (( i=0; i<${#OLD[@]}; ++i )); do
printf 's/%s/%s/g\n' "${OLD[$i]}" "${NEW[$i]}"
done >script.sed
sed -f script.sed inputfile >outputfile && mv outptufile inputfile && rm script.sed
Таким образом, вы ограничиваете количество раз, которое вам нужно разобрать входной файл, до одного.
Для заданных данных в OLD
и NEW
скрипт sed
будет сгенерирован как
s/_MAIN1_/#111/g
s/_MAIN2_/#222/g
Благодаря комментарию Rakesh Sharma я смог решить эту проблему, используя флаг -i
в команде sed. Перед циклом создается резервная копия исходного файла:
cp oldfile.txt oldfile.backup
while (( i < length ))
do
sed -i -e 's/'"${OLD[$i]}"'/'"${NEW[$i]}"'/g' oldfile.txt
((i++))
done
В следующий раз я буду использовать Perl для манипуляций со строками.
Изменить: Добавлено ((i++))
для предотвращения бесконечного цикла (благодаря комментарию Кусалананды).
Весь ваш скрипт (, который не работает ), можно заменить одной строкой:
sed 's/_MAIN\([12]\)_/#\1\1\1/g' oldfile.txt > newfile.txt
Или, более читабельно, но эквивалентно:
sed 's/_MAIN1_/#111/g;s/_MAIN2_/#222/g' oldfile.txt > newfile.txt
Есть несколько десятков других способов добиться этого, в зависимости от вашего фактического варианта использования (, например, откуда берутся данные, как на самом деле выглядят значения, что вы пытаетесь с ними сделать. данные и т. д. ).