Хотите поблагодарить автора блога - жмите здесь !
1 2 0
1 2 0

Нажмите на рекламный баннер выше, если хотите поблагодарить автора блога !
Написание каждой статьи заняло в сотни раз больше времени, чем один клик.

вторник, июня 25, 2013

Соединение двух сеток через шифрованный vtund для Linux (OpenWrt TPLINK 1043ND)

Это немного не то что я обещал в "следующей серии" об OpenWrt (linux), но "жизнь заставила".
Многие провайдеры имеют привычку "лочить" либо часть протоколов, либо часть портов. Например, обеспечивая нормальную скорость по TCP, но при этом срезая UDP, который используется для стандартных тунелей или SIP телефонии. И потом с трудом удается понять "почему все работает шустро а телефония глючит", или "почему такая низкая скорость по тунелю". ну или другой случай - когда "закрыты" вообще все порты, а доступ есть только по "стандартным портам" типа "порт 80" для ВЭБ. С такой ситуацией Вы можете часто столкнуться на предприятиях, когда "запрещено все кроме вэб" или "все кроме почты" итд. А вот очень надо зайти на свою сетку дома. Или воспользоваться какой нить программой (ну для коготто например аськой), доступ к которой закрыт.   Ну или вообще тривиально - когда Вы хотите играться оп сети, и Вам нужно чтобы Ваша домашняя сеть и сеть Вашего друга были напрямую доступны по локальным IP адресам.
  Все это легко решается с помощью туннелей vtund.  Он позволяет устанавливать туннель по любому выбранному порту, позволяя например обеспечить туннелирование по стандартному порту HTTP (80) или любому другому на выбор, и выбрать любой протокол (tcp или udp) - какой Вам нужен, или какой Ваш пров не лочит по скорости Плюс обеспечивает возможность шифрования трафика, от "ненапряжного" 128ми битного. до 256 бит AES, для взлома которого "противнику" понадобится суперкомпьютер на пару сот лет работы :) И при этом он очень прост в настройке, наверное самый простой в настройке из всех существующих типов туннелей.Плюс он идет сейчас в составе всех дистрибутивов Линукса.

PS Как показала практика, в самом деле некоторые "домосетки" серьезно тормозят стандартные туннели, работающие по стандартным портам. В частности, скорость передачи из одной киевской "домосетки" в другую, по vtund, настроенному на порты, используемые для https, почти в 10 раз выше, чем передача между ними-же, но с использованием стандартного L2Tp/IPSec туннеля.
PPS ниже приведен пример конфига, строящего туннель по TCP (как я изначально сделал). Но если важна скорость - попробуйте заменить tcp на udp, и отключить сжатие. Тестирование показало что UDP дает большую скорость "между домосетками". Да, если замените протокол в настройках тоннеля, не забудьте внемти UDP вместо TCP в настройках firewall.



Итак, от слов к делу. Все ниженаписанное касается настройки туннеля для прошивки OpenWrt, но так же легко (потребуется только модификация путей) может приспособлено для любых Линкс машин или роутеров.

0)
opkg update
opkg install vtund

1) Вносим дополнительные правила в firewall, чтобы позволить соединение нашему тунелю по выбранному нами порту:

Вписываем (на обеих рутерах как сервере так и клиенте, на клиенте модно первое правило не вводить) в /etc/firewal/user
#vtund at TCP port 3128 as server side
iptables -A input_rule -p tcp --dport 3128 -j ACCEPT
iptables -A forwarding_rule -i tap+ -j ACCEPT
iptables -A forwarding_rule -o tap+ -j ACCEPT

Порт 3128 (я выбрал) можете заменить на любой, который Вы выберете (например 80), так же как вместо протокола tcp можете указать udp, если Вы решите строить туннель по протоколу udp. Если на рутере не используется, можете выбрать порт 443 - это порт HTTPS и его обычно не лочат, потому что по нему идет связь например с web сервисами аккаунта googl, и вообще любыми вэб серверами поддерживающими шифрование.

2) На машине (рутере), которая у Вас будет играть роль  сервера:

 /etc/vtund.conf

options {
   port 3128; # Listen on this port.
   bindaddr { iface eth0.2; }; # Listen on your external interface.

   # Syslog facility
   syslog daemon;

   # Path to various programs
   ppp /usr/sbin/pppd;
   ifconfig /sbin/ifconfig;
   route /sbin/route;
   firewall /usr/sbin/iptables;
   ip /usr/sbin/ip;
}

# Default session options
default {
   compress no; # Compression is off by default
   speed 0; # By default maximum speed, NO shaping
}

YourConnectionName {
   passwd MyVeryLongPassword; # Password
   type ether; # Ethernet tunnel
   device tap0; # Device tap0
   proto tcp; # TCP protocol
   compress lzo:1; # LZO compression level 1
   encrypt yes; # Encryption
   stat yes; # Log connection statistic
   keepalive yes; # Keep connection alive
   multi killold;

   up {
     # Connection is Up

     # Assign IP address
     ifconfig "%% 10.1.0.1 netmask 255.255.255.0";

     # Add route to our local network (behind vtund client)
     route "add -net 192.168.100.0 netmask 255.255.255.0 gw 10.1.0.2";

     # Enable masquerading for net 10.2.0.0.0/24
     #firewall "-A forward -s 10.2.0.0/24 -d 0.0.0.0/0 -j MASQ";
   };

   down {
     # Connection is Down

     # Shutdown tap device.
     ifconfig "%% down";

     # Disable masquerading for net 10.2.0.0.0/24
     #firewall "-D forward -s 10.2.0.0/24 -d 0.0.0.0/0 -j MASQ";
   };
}

Если у Вас с одной из сторон используется сетка  10.1.0.0, замените в строке  ifconfig "%% 10.1.0.1 netmask 255.255.255.0";  10.1 например на 10.2 или что нравится, и то же не забудьте сделать в конфигурации клиента.
==================
3) На сервере дописываем в /etc/rc.local:

mkdir /var/log/vtund > /dev/null 2>&1
mkdir /var/lock/vtund > /dev/null 2>&1
vtund -s

4) Если не хочется презапускать роутер, то  из консоли выполняем комманды:
iptables -A input_rule -p tcp --dport 3128 -j ACCEPT
iptables -A forwarding_rule -i tap+ -j ACCEPT
iptables -A forwarding_rule -o tap+ -j ACCEPT
 mkdir /var/log/vtund
 mkdir /var/lock/vtund
 vtund -s
либо перезапускаем, и они выполнятся автоматически.
С сервером покончили :) теперь клиент.
PS закомментированные строки, связанные с маскарадингом, нужны, если Вы не просто собираетесь соединить две сетки, а полностью прокинуть весь свой интернет через удаленный сервер. В таком случае не забудьте в клиентсвок конфигурации добавить строку route для default routing через создаваемый тунель. 
==================================
Настройка Клиента.


0)
opkg update
opkg install vtund

1) выполняем пункт первый (настройка firewall) описанный в секции для сервера выше.

2)
Добавляем в /etc/vtund.conf на клиенте

options {
   port 3128; # Listen on this port.
   bindaddr { iface eth0.2; }; # Listen on your external interface

   # Syslog facility
   syslog daemon;

   # Path to various programs
   ppp /usr/sbin/pppd;
   ifconfig /sbin/ifconfig;
   route /sbin/route;
   firewall /usr/sbin/iptables;
   ip /usr/sbin/ip;
   }

# Default session options
default {
   compress no; # Compression is off by default
   speed 0; # By default maximum speed, NO shaping
}

YourConnectionName {
   passwd MyVeryLongPassword; # Password
   type ether; # Ethernet tunnel
   device tap1; # Device tap1
   up {
      # Connection is Up

      # Assign IP address and netmask.
      ifconfig "%% 10.1.0.2 netmask 255.255.255.0";
      #Add route to local network behind vtund server
      route "add -net 192.168.0.16 netmask 255.255.255.240 gw 10.1.0.1";
   };
   down {
     # Connection is Down

     # Shutdown tap device
     ifconfig "%% down";
   };
}

3) Добавляем в /etc/rc.local на клиенте
 Add to /etc/rc.local at vtund client

mkdir /var/log/vtund > /dev/null 2>&1
mkdir /var/lock/vtund > /dev/null 2>&1
vtund YourConnectionName your.server.com


your.server.com can be DNS name (or DunDNS), or IP address

4)  Если не хочется презапускать роутер, то  из консоли выполняем комманды:
iptables -A input_rule -p tcp --dport 3128 -j ACCEPT
iptables -A forwarding_rule -i tap+ -j ACCEPT
iptables -A forwarding_rule -o tap+ -j ACCEPT
 mkdir /var/log/vtund
 mkdir /var/lock/vtund
 vtund YourConnectionName your.server.com
либо перезапускаем, и они выполнятся автоматически.

================================================
Собственно все, теперь любая машина в сети 192.168.100.0/24 доступна с любой машины из сети 192.168.0.16/28 по локальному IP адресу и наоборот. При этом соединение зашифровано, а тунель идет по порту 3128 TCP, который обычно используется для прокси серверов и не "лочится", либо по 443 (или любому другому выбранному Вами, в зависимости от того какие порты открыты Вашим провайдером и не залочены по скорости).
================================================
Дополнение - если Вы используете  два (три) канала, из которых один основной и остальные резервные, и они коммутируются скриптом ChanCheck, как описано в статье TPLINK 1043ND (OpenWrt) - подключение двух внешних каналов (Dual WAN) основного и резервного.

Если клиент (либо сервер) имеют несколько внешних каналов, коммутируемых скриптом ChanCheck, то делаем два (три) конфига для vtund.
В одном указываем bindaddr { iface eth0.2; }; для одного интерфейса, во втором интерфейс
первого резервного канала, в третьем, интерфейс второго резервного канала.

И добавляем в скрипты каждого канала, исполняемые при переходе на другой канал скриптом ChanCheck

В скрипт перехода на основной канал (/usr/sbin/ChanIPSecM):
rm /etc/vtund.conf;
cp /etc/vtund.conf.MI /etc/vtund.conf;
killall vtund;
vtund YourConnectionName your.vtund.server.com;
sleep 1


И в скрипт перехода на резервный канал (/usr/sbin/ChanIPSecR1):
rm /etc/vtund.conf;
cp /etc/vtund.conf.R1I /etc/vtund.conf;
killall vtund;
vtund YourConnectionName your.vtund.server.com;
sleep 1


Внимание - скрипты перехода на основной и резервный каналы, предполагают что у Вас только одно соединение по vtund, и соответственно убивают только один его экземпляр. если у Вас несколько, то нужно либо писать скрипт "поинтеллектуальнее, либо поставить комманд killall "с запасом", перенаправляя в /dev/null, чтоы гарантировано были убиты ВСЕ экземпляры vtund.


Собственно все. Вопросы ?





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

Отправить комментарий

Закрыть окно X
Пожалуйста, потратьте несколько секунд на поддержку блога и его автора
Нажмите на рекламную ссылку: Рекламная ссылка для поддержки блога, или на баннер вверху справа страницы.