Организация защищенной VPN сети с помощью opnvpn




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

20 Comments

  1. Fragster

    А еще на сервере нужно разрешить коннектится к порту 1194 по UDP

    Reply
  2. Asmody

    круто! а если в филиале стоит одна машина с windows?

    Reply
  3. Fragster

    в смысле всего одна машина, или это шлюз? тогда ставишь опенвпн под винду — и точно так же коннектишься… если машина во внутренней сети — то никаких настроек на ней делать не надо…

    Reply
  4. Fragster

    (3)+ специфичные для суси тут только настройки файрволла, ну, и примерные скрипты и easy в винде в других местах будут находится

    Reply
  5. VladMir

    Слова «схема vpn сети» вижу. А где же непосредственно схема? 🙂

    Reply
  6. rader

    Пользовался и бросил, мегаглючная вещь

    Reply
  7. Fragster

    (5) боюсь все 6 точек и сотня компьютеров за ними долго рисовать…

    (6) что глючило? у нас никаких проблем нету, терминальный сервер, опубликованный в ВПН у клиентов субьективно быстрее работает (время открлика) с теми же настройками, чем просто опубликованный в инете… файлы кидаются, принтеры печатают — никаких проблем… опять же проблему с длинными именами принтеров в 1С таким образом можно устранить — просто добавив сетевые принтеры на сервере терминалов (имена будут без имени клиента в скобках)…

    Reply
  8. VladMir

    (7) понимаю… 🙂

    Reply
  9. dima1c

    все это можно сделать 4 кликами в windows xp или windows 2003…. другое дело, люди ленятся читать …

    Reply
  10. Fragster

    как не считал — все равно больше четырех кликов получается… да и настройка для того, чтобы шлюз при соединении с впном не переопределялся — закопана еще кликов на 5… маршрутизация настраивается — еще во много кликов… аутентификация с сертификатами, или по имени и паролю — тоже много кликов… ИМХО быстрее не получится, получится только дороже (никогда не понимал людей, которые ставят винду на интернетовский шлюз)…

    Reply
  11. asved.ru

    поясните, пожалуйста, зачем вам понадобился проброс L2, т.е. dev tap? Чем dev tun & topology subnet не устроил? Маршрутизация-то все равно на L3 происходит.

    Кроме того, у вас ошибка в рисунке — неверно указана исключаемая маска, да и вообще исключаемые подсети для vpn-клиентов.

    Не раскрыта тема конфигурации туннелей между офисами — маршруты-то к ним указаны, но гарантии, что шлюзам офисов будут присвоены именно указанные в маршрутах адреса, никакой. Если же Вы решили использовать те адреса, что первыми им присвоились — в конфиге сервера должно быть ifconfig-pool-persist

    Да и Suse в качестве примера выбран неудачно — им почти никто не пользуется, а в распространенных дистрибутивах в ходу iptables.

    Двойка, в общем.

    Reply
  12. asved.ru

    (10)

    никогда не понимал людей, которые ставят винду на интернетовский шлюз

    Вы не любите кошек? Да вы их просто готовить не умеете!

    Хотя в данном контексте, как ни странно, Вы в чем-то правы. У tap драйвера под Windows есть серьезные проблемы с производительностью. Исправить их open source community не может уже много лет. Что ж, в этом весь опенсорс.

    Reply
  13. asved.ru

    (9) dima1c,

    все это можно сделать 4 кликами в windows xp или windows 2003….

    Без применения PPP/GRE инкапсуляции, пожалуйста. 😉 Вот в 7/2008 есть SSTP, а в указанных Вами ОС нету и не будет. А как GRE работает через NAT — ВЫ, думаю, не хуже меня знаете.

    Reply
  14. asved.ru

    (1)

    к порту 1194 по UDP

    proto tcp поустойчивее, хотя и менее экономичен. Да и порт можно любой назначить.

    Reply
  15. asved.ru

    И еще касательно адресации: админа, использующего в корпоративной среде 192.168.0.0/24, следует гнать из профессии ссаными тряпками. Ибо эта сеть используется у 99% домашних пользователей, и при подключении возникает конфликт адресации.

    Reply
  16. Fragster

    (11)

    зачем вам понадобился проброс L2, т.е. dev tap? Чем dev tun & topology subnet не устроил?

    тем, что tap — это сетевой мост и мы используем один адрес на всех клиентов и частично избавлены от необходимости настраивать маршрутизацию.

    неверно указана исключаемая маска, да и вообще исключаемые подсети для vpn-клиентов

    В чем ошибка, как, Вы считаете, должно быть?

    Не раскрыта тема конфигурации туннелей между офисами — маршруты-то к ним указаны, но гарантии, что шлюзам офисов будут присвоены именно указанные в маршрутах адреса, никакой.

    цитирую статью:»теперь нужно задать статические адреса для клиентов с внутренними адресами, для этого нужно в папке /etc/openvpn/ccd (см выше) создать файлы с именами сертификатов соответствующих клиентов, с примерно таким содержанием:»

    в распространенных дистрибутивах в ходу iptables.

    SuseFirewall — это морда к iptables. Действительно, ничего не мешает добавить скрипт, изменяющий правила iptables вручную. мне же показалось проще и «правильнее» (применительно к используемому дистрибутиву opensuse) использовать его встроенные средства. Зачем это нужно — в комментариях к настройкам написано, как настроить susefirewall — в статье тоже указано.

    Двойка, в общем.

    Тут каждый сам для себя решает. 19 человекам, судя по всему, было полезно, а минуса от Вас я не вижу 🙂

    proto tcp поустойчивее, хотя и менее экономичен.

    при подключении через 3g по rdp поверх этого vpn — разница видна на глаз, и она не в пользу варианта с tcp. А надежность обеспечивается тем, что тот же самый tcp идет уже внутри туннеля.

    (14)

    Да и порт можно любой назначить.

    Спасибо, Кэп!

    (15)

    админа, использующего в корпоративной среде 192.168.0.0/24, следует гнать из профессии ссаными тряпками. Ибо эта сеть используется у 99% домашних пользователей, и при подключении возникает конфликт адресации.

    Это Ваше право, если Вы — работодатель. О том, что будет конфликт адресов — я написал, человек, прочитавший статью сам может сделать вывод о том, нужно ему использовать свои адреса, или нет. Можно еще написать о том, что 10.8.0.0 у провайдера внутри может использоваться, и тогда тоже (в определенной ситуации) возможны косяки. В общем, много к чему можно придраться.

    Reply
  17. asved.ru

    (16)

    и мы используем один адрес на всех клиентов

    с topology subnet то же самое. Только бесполезных данных гоняется меньше.

    неверно указана исключаемая маска, да и вообще исключаемые подсети для vpn-клиентов В чем ошибка, как, Вы считаете, должно быть?

    Ограничение: внутренняя сеть клиентов не должна пересекаться со следующими сетями:

    192.168.0.0/24

    192.168.1.0/24

    192.168.2.0/24

    UPD как раз при сети клиента 192.168.0.0/28 большая часть хозяйства будет работать. Согласно правилу выбора маршрута по большей маске.

    при подключении через 3g по rdp поверх этого vpn — разница видна на глаз, и она не в пользу варианта с tcp

    Постоянно пользуюсь с планшета, разницы не вижу, все вполне комфортно. dev tun, topology subnet, proto tcp, tun-mtu 1024.

    Плюс в том, что при отвале 3G, к примеру, в дороге, реконнект происходит через 10-12 секунд против 20-30 с UDP. ping стоит 10

    Можно еще написать о том, что 10.8.0.0 у провайдера внутри может использоваться, и тогда тоже (в определенной ситуации) возможны косяки

    Вот как раз здесь косяки маловероятны, т.к. клиенту эта сеть не нужна. Да и маски различны. Провайдеры крайне редко используют /24 на серых сегментах, обычно маска меньше.

    А сменить адресацию в одном сегменте — работы на полчаса. Если, конечно, сеть нормально настроена, без костылей в виде статических маршрутов на клиентах и т.п.

    Впрочем, если предпочитаете ездить домой к сотрудникам перенастраивать роутеры — welcome. Но — в нерабочее время и бесплатно.

    А что касается iptables — ни в одном никсовом howto Вы не найдете указания использовать дополнительные оболочки. Все на iptables -A. Ибо это универсальная команда, в отличие от.

    цитирую статью

    А вот это, простите, проморгал.

    Reply
  18. tendercement

    (1)Есть сервер: ОС Майкрософт Windows 10 Pro, Версия 10.0.17763 Сборка 17763, Процессор Intel® Core(T …M) i7-4770K CPU @ 3.50GHz, 3501 МГц, ядер: 4, логических процессоров: 8, на нем установлено: 1С. Организован многопользовательский режим по RDPWrap-v1.6.2. К нему подключаются офисы по RDP через VPN подключение, все работает отлично, но очень медленно работает: касса ККМ Атол 77ф и терминал Verifone 820x. Подсказали, что если создать единую сеть и настроить обмен по IP, то будет все быстро работать. Начал настраивать OpenVPN, на сервере настроил все по инструкции, но при подключении выдает ошибку: «Options error: —pull-filter cannot be used with —mode server. Use —help for more information.» Не могу разобраться ни как…. на локальном компе вообще ни как не могу поставить клиента, ошибки. Кто поможет по тиму? и вообще в ту степь я полез??

    Reply
  19. Fragster

    (18) А касса не в демо режиме? какой пинг от точки до сервера?

    Reply
  20. tendercement

    (19) касса не в демо, а как измерить пинг?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *