Итак, имеем следующую схему: дома у нас находится мего-сеть из нескольких подсетей (LAN, Wi-Fi, несколько VPN-туннелей на дружественные сервера), а на работе мы договорились с добрым дядей-одмином про аккаунт на корпоративном VPN-сервере.
В итоге мы подключаемся с помощью MPD5 на нашем домашнем сервере к выданному статическому IP корпоративного сервера и получаем адрес из пула корпоративной же сети. Вроде бы все чудесно, пинги ходят на наш сервер, но становится понятно, что наши любимые вэб-интерфейсы и прочие не консольные прелести домашней подсети и дружественных подсетей не получается использовать через SSH-соединение.
Как же решить эту проблему? Можно, конечно, просить добрейшего админа на работе добавить все домашние подсети на роутеры компании… Но тут рискуем получить отказ в виде крутящегося у виска пальца. Особенно если некоторые подсети пересекаются (например, в компании есть сеть туннелей, которые используют любимый нами диапазон 192.168…). Поэтому пойдем другим путем: у нас на домашнем сервере уже работает MPD5, так почему бы не пробросить к нему со своей рабочей машины или машин VPN-туннель(и), чтобы иметь возможность добавить любые нужные нам маршруты на локальной же машине, не беспокоя и так косо смотрящих на нас админов компании?
Будем считать, что VPN-сервер на нашей FreeBSD уже работает, и VPN-соединение на сервер компании уже поднято, т.к. настройка MPD – тема отдельной статьи. В качестве файрволла используем PF.
Что необходимо сделать в рамках сегодняшней темы – так это создать VPN-соединение с нашей рабочей Windows к домашнему серверу и прописать на рабочей же Windows необходимые маршруты. Для большей изощренности все это дело будем реализовывать с помощью командной строки Windows и скриптов. Последнее нужно для того, чтобы, прийдя утром на работу, не начинать день с двойного щелчка по значку подключения VPN и ввода в командной строке чего-то типа route add 172.18.18.0 mask 255.255.255.0 10.109.101.41.
Адреса будут такими:
– рабочая сеть: 10.109.0.0/16
– домашние подсети: 172.18.18.0/24 и 10.5.0.0/16
– VPN-пул нашего сервера: 172.18.18.32/28
– адрес домашнего сервера в сети предприятия: 10.109.101.41
Немного магии: можно, конечно, создать VPN с помощью мастера Windows, но это будет скучно и обыденно. А мне как раз попался интересный пример скрипта настройки сети местного провайдера, который захотелось «разобрать». Потому используем скрипт . Он создает ярлык на рабочем столе, а само соединение размещает в подпапках All Users.
Хоть немного разбирающийся в программировании человек и так поймет, что там к чему, поэтому на этом можно было бы закончить рассказ о создании подключения и добавлении маршрутов, но давайте все-таки разберем этот скрипт.
Итак.
Комментарии обозначаются следующим образом:
'-- Network setup script '--
Следующим чудесным кодом рисуем окно, в котором предлагаем выбрать только два пункта:
cr = +chr(13)+chr(10) L_Welcome_MsgBox_Message_Text = _ "Укажите какие пункты настройки необходимо выполнить:"&cr&_ "1. Настроить маршрутизацию "&cr&_ "2. Создать PPTP подключение к 'ASTRA'" L_Welcome_MsgBox_Title_Text = "CуперМегаСкрибд (с) спижжен :)"
В данном конкретном случае это окно, вообще говоря, ни к чему, но ведь можно захотеть создать более сложную программу настройки со всякими опциями, поэтому оставим его для примера
Далее идет функция создания ярлыка:
Private Sub createLink(CName) Const ssfCONNECTIONS = &H0031 Const ssfDESKTOP = &H0019 ' <- All Users, Current user: &H0000 Dim objShell Dim objFolderConnections Dim objFolderDesktop Dim objSubFolder Set ObjShell = WScript.CreateObject("Shell.Application") Set objFolderConnections = objShell.NameSpace(ssfCONNECTIONS) Set objFolderDesktop = objShell.NameSpace(ssfDESKTOP) If (Not objFolderConnections Is Nothing) and (Not objFolderDesktop Is Nothing) Then For Each objSubFolder In objFolderConnections.Items If objSubFolder.Name = CName Then objFolderDesktop.CopyHere objSubFolder End If Next End If Set objFolderDesktop = Nothing Set objFolderConnections = Nothing Set objShell = Nothing End Sub
Если появится желание поменять папку, в которой создается ярлык, делать это надо здесь. Обратите внимание, что это только ярлык, сам файл подключения создается далее в коде. Данная функция вызывается в конце скрипта, ей передается имя ярлыка, по совместительству имя соединения. Так что если меняете имя соединения, меняйте и строку, которая передается в эту функцию!
Далее видим такой кошмар:
con_entry = "[ASTRA]"&cr&_ "Encoding=1"&cr&_ "Type=2"&cr&_ "AutoLogon=0"&cr&_
---- и т.д. и т.п. ---
"LastSelectedPhone=0"&cr&_ "PromoteAlternates=0"&cr&_ "TryNextAlternateOnFail=1"&cr
Здесь нам интересны следующие пункты:
con_entry = "[ASTRA]"&cr&_
ASTRA – имя нашего соединения. Когда будем вызывать создание ярлыка, пишем там это имя.
"AutoLogon=0"&cr&_
Автологин. Именно 0, иначе получим попытки соединиться без пароля, и не сможем его ввести!
"RedialOnLinkFailure=1"&cr&_
Перезванивать при разрыве связи
"PreviewUserPw=1"&cr&_
Отображать ввод пароля каждый раз при запуске. Для первого запуска нам нужно устанавливать этот параметр в 1, чтобы иметь возможность ввести данные. Потом, убрав галку «Запрашивать логин, пароль, сертификат…» в свойствах соединения, мы этот параметр поменяем на 0.
"Guid=CC34DB8F83C00649A4153A152484B0CB"&cr&_
Если подключений несколько, наверное, желательно поменять
"IpPrioritizeRemote=0"&cr&_
Указываем не назначать полученный по DHCP адрес шлюзом по-умолчанию
"PhoneNumber=10.109.101.41"&cr&_
Адрес нашего VPN-сервера.
Дальше видим, как создается форма ввода. Можно ввести 1, можно 2, можно 12. Соответственно выполнится 1, 2 или оба действия. По-умолчанию 12. Если пусто, закрываем окно.
options = InputBox(L_Welcome_MsgBox_Message_Text, _ L_Welcome_MsgBox_Title_Text, _ "12" ) If options = "" Then WScript.Quit End If
Объявляем переменные и создаем объект WSHShell. Ну, надо так… Суперрр
Dim WSHShell, fso, fh, AUDesktop, lnk, pbk Set WSHShell = WScript.CreateObject("WScript.Shell")
Первая опция – создание маршрутов:
If InStr(options, "1") > 0 then ' Routing WShShell.Run "route add -p 172.18.18.0 mask 255.255.255.0 172.18.18.34" WShShell.Run "route add -p 10.5.0.0 mask 255.255.0.0 172.18.18.34" end if
Ключ –р означает permanent, тобишь постоянный, восстанавливающийся после перезагрузки системы. Далее пишем сеть и маску, к которым хотим иметь доступ и адрес шлюза (тот адрес, который мы получили на интерфейсе VPN).
Вторая опция – создание подключения:
If InStr(options, "2") > 0 then ' PPTP WShShell.Run "rasphone -r ""ASTRA Connection""", 7, true Set fso = CreateObject("Scripting.FileSystemObject") pbk = "%AllUsersProfile%\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk" pbk = WSHShell.ExpandEnvironmentStrings(pbk) Set fh = fso.OpenTextFile(pbk, 8, true) fh.Write(con_entry) fh.Close ' Ярлык createLink("ASTRA") ' WShShell.Run "explorer.exe ::{7007ACC7-3202-11D1-AAD2-00805FC1270E}" end if
Указывается адрес файла подключения, туда записываем содержимое переменной con_entry, затем создаем ярлык на рабочий стол.
Собственно, теперь нам остается скопировать ярлык подключения в папку Автозагрузка. Это, конечно можно сделать и скриптом, но мне лень, поэтому жмем правой мышой на ярлыке, который появился у нас на рабочем столе, выбираем «Копировать», затем жмем «Пуск»-Все программы-Автозагрузка правой кнопкой, выбираем «Проводник», там делаем «Вставить».
Перезагружаемся!!! Соединение через ярлык будет работать сразу, а вот в "Сетевых полключениях" оно появится только после перезагрузки, либо нужно в "Сетевых полключениях" выбрать из меню Вид пункт "Обновить".
При загрузке будет запущено соединение, Windows спросит логин/пароль. Вводим, ставим галку запомнить. Жмем свойства, переходим на вкладку «Параметры» и снимаем галку «Запрашивать имя, пароль, сертификат…». ОК. «Подключить». Если подключение прошло успешно, перезагружаемся, чтобы убедиться в том, что соединение стартует без посторонней помощи.
Посмотреть свойства соединения можно, жмакнув 2 раза по значку подключения возле часов.
Траблшутинг:
- проверяем пинг до нашего VPN-сервера. Если его нет, значит, либо у вас упал сервер Смешно, либо админы вам отключили VPN, либо что-то с маршутизацией не то.
- если говорит, что логин/пароль неправильные, возможно, вы ошиблись при вводе, либо пытаетесь слишком часто подключиться.
- если пароль не спрашивает, а сохраненные данные удалились из памяти Windows, нужно зайти в "Сетевые подключения", открыть свойства соединения, поставить галку «Запрашивать имя, пароль, сертификат…», запустить подключение, ввести данные, поставить галку "Сохранить", затем в свойствах снова снять галку «Запрашивать имя, пароль, сертификат…»
- если VPN-соединение установлено, но пинги до домашних хостов не ходят (и эти хосты в данный момент включены), то скорее всего вы неправильно прописали маршруты. Посмотреть таблицу маршрутизации в Windows можно, введя в командной строке route print.
И напоследок: не запускайте создание нового подключения, не удалив старое. В файл "%AllUsersProfile%\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk" данные добавляются инкрементально!!! Т.е. в файле содержатся секции, которые обозначают одно подключение. В нашем случае секция называется [ASTRA].
Если старое подключение с таким названием не удалить, то в файле появится еще одна секция с таким же именем. И тогда начнется не просто магия, а черная магия! Потому что вы удаляете соединение, система удаляет только последнюю секцию, перезагружаемся - и вуаля, соединение опять на месте!
Еще одно уточнение: обычные VPN и PPPoE подключения создаются не в All Users, а в %Username%, поэтому их вы скорее всего найдете тоже в файле rasphone.pbk, но уже в каталоге Documents And Settings/%Username%/Application Date/Microsoft/Network/Connections/Pbk/ .
Кстати, про имя. Его желательно выбрать так, чтобы оно не совпадало с именами уже имеющихся в системе подключений VPN и PPPoE, иначе можно нарваться на ту же самую черную магию.
Vermillion(c)