Доступаемся со своего рабочего места к домашним подсетям

Итак, имеем следующую схему: дома у нас находится мего-сеть из нескольких подсетей (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)


Комментарии: