Ищем свой сервер в чужой сети
|
Работает на версиях (в
теории)
|
2.xx
|
3.xx
|
4.xx
|
5.xx
|
|
Тестировался на версиях
|
5.0rc7
|
Все мы не раз слышали о грандиозной
поддержке малого бизнеса и частного предпринимательства в нашей стране.
Пока ты физическое лицо, у тебя нет никаких проблем. Но как только
ты собрался с мыслями и решил открыть свое дело, ты моментально попадаешь
на деньги (конские проценты в банках, налоги, отчисления в ПФР, поборы,
штрафы, инфляция, и прочая вата). Особенно отличились в этом плане
провайдеры, если к простому домашнему пользователю требования минимальны,
то к частным предпринимателям и организациям подход особенный. А именно:
если ты арендовал нежилое помещение для работы, это означает что ты
дойная корова и должен платить кучу денег провайдеру. Да, конечно
очень хорошо, если вам удалось договорится с провайдером и составить
договор на физическое лицо, ну или скажем недалеко живет ваш знакомый
который согласен поставить wifi в форточку. Но если данные варианты
не прокатывают, есть еще один способ не платить провайдеру кучу денег.
:)
Идея заключается в том, что в наше время
не сложно найти провайдера с внутренней локальной сетью 10.0.0.0/255.0.0.0
или 192.168.0.0/255.255.0.0 и в ней организовать две точки (Физическое
лицо с дешевым, безлимитным интернетом будет Сервером) (Организация
с дорогим помегабайтным интернетом будет Клиентом) между ними поднимаем
VPN.
В принципе, никакой проблемы нет, если
серые адреса у провайдера статические, ну а если нет, то нам придется
воспользоваться DDNS сервисом в интернете т.к. локального сервиса
может и не быть.

DDNS сервисов в интернете солидное количество, но большая часть из
них отходит на задний план, потому что микротик не важно работает
с ними, либо они не подходят для наших целей.
Мы будем использовать DDNS сервис changeip.com
по причине его поддержки начиная с версий 2.X
В процессе разработки скрипта для отправки
серого ip адреса возникла одна существенная проблема. Сервис changeip.com
при каждом обновлении DNS имени проверяет принадлежность ip адреса,
который был отправлен в сообщении, к сетям с первыми октетами 10 и
192.168. Если данная принадлежность имеет место, заменяет адрес, из
сообщения на белый ip, который определяется автоматически сервисом
changeip.com, и к нашему сожалению отключить эту опцию нельзя :(
Было принято решение маскировать первый
октет ip адреса перед отправкой, и заменять его обратно при получении.
Серверная часть, параметры:
:local interfacename ("eth1"); -Имя
интерфейса локальной сети провайдера.
:local replacement ("222"); -Маска для первого октета
ip адреса, имейте ввиду, что количество цифр должно совпадать.
Если маскируете 10. -устанавливайте 00-99, если 192. то 100-254.
:local dnsname ("my.server.ddns.info"); -DNS имя для
обновления.
:local login ("login"); - Логин в changeip.com
:local password ("password"); - Пароль в changeip.com |
Серверная часть, код:
##################################################
#Server Part
##################################################
#Settings
##################################################
:local interfacename ("eth1");
:local replacement ("222");
:local dnsname ("my.server.ddns.info");
:local login ("login");
:local password ("password");
##################################################
##################################################
:local CurrentDynDNSIP ([:resolve $dnsname]);
:local TMPDynDNSIP ([/ip address get [/ip address find interface=$interfacename]
address]);
:local RealDynDNSIP ([:pick $TMPDynDNSIP 0 ([:len $TMPDynDNSIP]-3)]);
:local ShortIP ([:pick $RealDynDNSIP ([:len $replacement]) ([:len
$RealDynDNSIP])]);
:local FakeIP ($replacement . $ShortIP);
:if ($CurrentDynDNSIP != $FakeIP) do={/tool dns-update name=$dnsname
address=$FakeIP key-name=$login key=$password};
##################################################
#(C) Inlarion icq 429-587 http://mikrotik.axiom-pro.ru/ Copyright!
##################################################
|
Принцип работы серверной части очень
простой, с указанного интерфейса берется ip адрес, обрезается маска
подсети, заменяется первый октет на маскирование и отправляется на
changeip.com
Клиетская часть, параметры:
:local dnsname ("my.server.ddns.info");
-DNS имя с которого снимаем маскированный ip адрес.
:local replacement ("192"); - Параметр для замены маскированного
октета.
:local gateoctet ("1"); - Параметр работает только в
случае если :local internettype равен "ethernet" и если
шлюз интернета провайдера отличается от 192.168.ХХХ.1 его можно
изменить.
:local internetname ("LAN"); - Имя
интерфейса в который приходит интернет от провайдера.
:local internettype ("ethernet"); - Тип интерфейса
провайдера принимает два значения "ethernet" и любой
другой.
:local internetdns ("192.168.3.1"); DNS сервер провайдера.
:local tunnelname ("ISP1"); - Имя
интерфейса через который мы подключаемся к серверу.
:local tunneltype ("pptp"); - Тип интерфейса, принимает
два значения "pptp" или "l2tp".
:local tunneldns ("192.168.90.1"); - DNS нашего PPTP
или L2TP сервера.
|
Клиентская часть, код:
####################################################
#Client part
####################################################
#Settings
####################################################
:local dnsname ("my.server.ddns.info");
:local replacement ("192");
:local gateoctet ("1");
:local internetname ("LAN");
:local internettype ("ethernet");
:local internetdns ("192.168.3.1");
:local tunnelname ("ISP1");
:local tunneltype ("pptp");
:local tunneldns ("192.168.90.1");
####################################################
:global internetgate (" ");
####################################################
:if ( $internettype != "ethernet" ) do={
:set internetgate ([/ip address get [/ip address find interface=$internetname]
network]);
} else={
:set internetgate ([/ip address get [/ip address find interface=$internetname]
network]);
:local ShortIP ([:pick $internetgate 0 ([:len $internetgate]-1)]
);
:set internetgate ($ShortIP . $gateoctet);
};
####################################################
:if ($tunneltype = "pptp") do={
/interface pptp-client monitor [/interface pptp-client find
name=$tunnelname] once do={
:if ($status != "connected") do={
:if ($internetdns != [/ip dns get servers]) do={ /ip dns set
servers=$internetdns; };
} else={
:if ($tunneldns != [/ip dns get servers]) do={ /ip dns set servers=$tunneldns;
};
};
};
};
:if ($tunneltype = "l2tp") do={
/interface l2tp-client monitor [/interface l2tp-client find
name=$tunnelname] once do={
:if ($status != "connected") do={
:if ($internetdns != [/ip dns get servers]) do={ /ip dns set
servers=$internetdns; };
} else={
:if ($tunneldns != [/ip dns get servers]) do={ /ip dns set servers=$tunneldns;
};
};
};
};
####################################################
:local WWW ([:resolve changeip.com]);
:local NIC ([:resolve nic.changeip.com]);
:if ( [/ip route find comment="WWW_changeip.com"]
= "" ) do={ /ip route add dst-address=$WWW gateway=$internetgate
comment="WWW_changeip.com" };
:if ( [/ip route find comment="NIC_changeip.com"]
= "") do={ /ip route add dst-address=$NIC gateway=$internetgate
comment="NIC_changeip.com" };
:if ( [/ip route find comment="INTERNET_DNS"] = "")
do={ /ip route add dst-address=$internetdns gateway=$internetgate
comment="INTERNET_DNS" };
:if ( [/ip route get [/ip route find comment="WWW_changeip.com"]
dst-address] != $WWW) do={ /ip route set [/ip route find comment="WWW_changeip.com"]
dst-address=$WWW gateway=$internetgate };
:if ( [/ip route get [/ip route find comment="NIC_changeip.com"]
dst-address] != $NIC) do={ /ip route set [/ip route find comment="NIC_changeip.com"]
dst-address=$NIC gateway=$internetgate };
:if ( [/ip route get [/ip route find comment="INTERNET_DNS"]
dst-address] != $internetdns) do={ /ip route set [/ip route
find comment="INTERNET_DNS"] dst-address=$internetdns
gateway=$internetgate };
####################################################
:if ($tunneltype = "pptp") do={
:local CurrentVHNIP ([:resolve $dnsname]);
:local TMPVHNIP ([/interface pptp-client get [/interface pptp-client
find name=$tunnelname] connect-to]);
:local ShortIP ([:pick $CurrentVHNIP ([:len $replacement]) ([:len
$CurrentVHNIP])]);
:local RealDNSIP ($replacement . $ShortIP);
:if ($RealDNSIP != $TMPVHNIP) do={/interface pptp-client set
[/interface pptp-client find name=$tunnelname] connect-to=$RealDNSIP;
};
};
:if ($tunneltype = "l2tp") do={
:local CurrentVHNIP ([:resolve $dnsname]);
:local TMPVHNIP ([/interface l2tp-client get [/interface l2tp-client
find name=$tunnelname] connect-to]);
:local ShortIP ([:pick $CurrentVHNIP ([:len $replacement]) ([:len
$CurrentVHNIP])]);
:local RealDNSIP ($replacement . $ShortIP);
:if ($RealDNSIP != $TMPVHNIP) do={/interface l2tp-client set
[/interface l2tp-client find name=$tunnelname] connect-to=$RealDNSIP;
};
};
####################################################
#(C) Inlarion icq 429-587 http://mikrotik.axiom-pro.ru/ Copyright!
####################################################
|
Принцип работы клиентской части немного
посложнее. В первую очередь происходит определение шлюза в интернет
через дорогого провайдера. Вторым действием происходит проверка соединения
с VPN сервером, если соединения нет, устанавливается DNS провайдера,
если соединение есть, устанавливается DNS VPN-сервера. Третим шагом
устанавиливаются/обновляются маршруты через основного провайдера для
DNS и серверов changeip.com. Последним шагом является проверка ip
адреса сервера в свойствах соединения с тем адресом который был получен
от changeip.com с обрано-измененным октетом.
При использовании материалов ссылка
на автора и источник ОБЯЗАТЕЛЬНЫ!
Автор: Григорьев Дмитрий (Inlarion)
Теги: Mikrotik,
Микротик, DDNS, DynDNS, changeip.com, dns в локальной сети, динамический
dns.