пятница, 3 февраля 2017 г.

gprs soft router

Для обеспечения доступа к Интернет, а также к доступа к ресурсам локальной сети в удаленных подразделениях нашей организации была применена описанная ниже конфигурацию.
При работающем vpn-канале роутер обеспечивает маршрутизацию через сеть головного офиса, при отсутствующем через Интернет.

Софт-роутер построен на базе Ubuntu-server 16.04.
1.После инсталляции сервера вставим в usb-порт модем, убедимся, что модем определился в системе.
lsusb
Вывод будем примерно таким:
Bus 002 Device 002: ID 13d3:5711 IMC Networks
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Видно, что модем присутствует.

2. Настроим ppp-интерфейс и попробуем подключиться к Интернет.

nano /etc/ppp/peers/megafon

Создаем файл с следующим содержанием:

# Используемое для подключения устройство
/dev/ttyUSB0
# chat-скрипт
# В параметре "-T" передаётся имя точки доступа
# Для получения статического ip используем значение FixedIP.nw, для динамике обычно пишется internet.
connect '/usr/sbin/chat -v -f /etc/chatscripts/gprs -T FixedIP.nw'
# Надо ли менять маршрут по умолчанию
# Закомментируйте если не надо
defaultroute
# Использовать ли DNS-сервера провайдера
# Закомментируйте если не надо
usepeerdns
# Номер ppp-интерфейса (в данном случае будет ppp100)
unit 100
# Подключаться в случае обрыва
persist
# Перепосылать пакеты авторизации каждые 60 секунд
# Позволяет избежать обрыва соединения при отсутствии трафика
chap-interval 60
# Идентификатор соединения, используемый для поиска паролей в соответствующих файлах,
# А так же передаваемый ip-up и ip-down-скриптам
ipparam megafon
# Имя пользователя (пароль описывается в файле "/etc/ppp/chap-secrets") у Мегафона не требуется аутентификация, поэтому используем значение noauth.
#user "megafon"
noauth
# Отключаем любое сжатие
nopcomp
novjccomp
nobsdcomp
nodeflate
noaccomp
# Правильная обработка обрывов соединения
lcp-echo-interval 2
lcp-echo-failure 3
# IP адрес мы будем получать от провайдера, а не назначать сами
noipdefault

Затем настроим интерфейсы... Приводим файл /etc/network/interfaces примерно к такому виду:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.27.1
netmask 255.255.255.128

auto megafon
iface megafon inet ppp
provider megafon

Теперь можно перезагрузиться, после рестарта должен появиться Интернет.

3. Теперь разрешим форвардинг между интерфейсами.

В файле /etc/sysctl.conf расскомментируем строку
net.ipv4.ip_forward=1

4. Настроим файервол и NAT.

Добавим нужные правила фаейрвола:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A POSTROUTING -o ppp100 -j SNAT --to-source XX.XX.XX.XX (тут должен быть внешний ip-адрес)
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i ppp100 -p tcp -m tcp -m multiport --dports 22 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp100 -j ACCEPT
iptables -A FORWARD -s 192.168.27.0/25 -i eth0 -j ACCEPT
iptables -A FORWARD -i ppp12 -o eth0 -j ACCEPT


Теперь добавим эти правила в автозагрузку:
echo "#! /sbin/iptables-restore" > /etc/network/if-up.d/iptables-rules
iptables-save >> /etc/network/if-up.d/iptables-rules
chmod +x /etc/network/if-up.d/iptables-rules

5. Установим и настроим dhcp-сервер.

apt-get install dnsmasq

Откроем файл /etc/dnsmasq.conf и подправим 2-3 строки под наши нужды:

interface=eth0 
Интерфейс с которого раздаются адреса.

dhcp-range=192.168.27.40,192.168.27.125,12h
Область выдачи.

dhcp-option=option:dns-server,192.168.0.4,8.8.8.8
Назначаемые dns-серверы. Первый для VPN, второй при отсутствующем VPN.

Теперь можно перезагрузиться, а затем подключить по сети к серверу какой-нибудь ПК, и проверить назначение IP, а так же работу Интернет.

6. Теперь подключимся к VPN, и создадим скрипт мониторинга и управления соединениями.

Установим pptp-client

apt-get install pptp-linux

Создадим и отредактируем файл /etc/ppp/peers/vpn следующим образом:

pty "pptp XX.XX.XX.XX --nobuffer  --nolaunchpppd --loglevel 0" #тип и адрес сервера
name DOMAIN\\user
remotename VPN
require-mppe-128 #включаем поддержку MPPE
require-mschap-v2
defaultroute
replacedefaultroute
ms-dns 192.168.21.145
unit 12 #номер ppp интерфейса
persist #переподключаться при обрыве
maxfail 10 #количество попыток переподключения
holdoff 10 #интервал между подключениями
file /etc/ppp/options.pptp
ipparam $TUNNEL


в файле  /etc/ppp/chap-secrets пишем учетные данные для нашего vpn соединения:

"DOMAIN\\user"      VPN     "Pa$$W0rd"

Пробуем продключиться

pon vpn nodetach



Теперь создадим файл-скрипт /home/user/recconnect.sh для мониторинга и подключений соединений.

#!/bin/bash
if ! /bin/ping 8.8.8.8 -c 10 -q -w 30 &>/dev/null
then
/sbin/ifdown megafon
/bin/sleep 2
kill $(ps aux | grep '/usr/sbin/pppd' | awk '{print $2}')
/bin/sleep 2
/sbin/ifup megafon &
/bin/sleep 45
fi

if ! /sbin/ifconfig | grep ppp12
then
/usr/bin/poff vpn
/bin/sleep 5
/usr/bin/pon vpn
/bin/sleep 45
fi

if ! ping -I ppp12 192.168.28.13 -c 10 -q -w 30 &>/dev/null # пингуем другую точку тоннеля
then
/usr/bin/poff vpn
/bin/sleep 5
/usr/bin/pon vpn
/bin/sleep 45
fi

if ! route -n | grep 192.168.28.13 | grep 192.168.0.0
then
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.28.13 ppp12 # маршрут в сеть предприятия
/bin/sleep 5
fi

exit 0

Сделаем скрипт исполняемым:

chmod +x /home/user/recconnect.sh

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

crontab -e

*/03 * * * *    sudo /home/user/recconnect.sh

Теперь все должно работать автоматом.