Раздача интернета от Yota в локальную сеть через Debian 7.

Автор Leo, 05 февраля 2014, 23:08:52

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Leo

Цель:
Раздать интернет Yota в локальную проводную сеть через компьютер-шлюз с установленной системой Debian7.

Имеем:
1) системный блок с установленной базовой системой Debian 7, без окружения рабочего стола, с интегрированной в материнскую карту поддержкой локальной сети
2) модем Yota, работающий по технологии LTE
3) локальную сеть, которую надо накормить интернетом :)

Приступим.
Предполагается что используемое оборудование исправно, поэтому будет описываться только настройка.
Все операции выполняются с правами root.

Модем Yota, в отличии от обычных 3G модемов определяется как сетевая карта и для его работы в линукс не нужно устанавливать драйверов. Единственное что нужно сделать - выполнить правильную настройку интерфейса. С помощью команды ifconfig -a узнаем имена сетевых интерфейсов. У меня eth0 - это интегрированная сетевая карта, которая смотрит в локальную сеть, а eth1 - это Yota-модем. Дальше открываем файл /etc/network/interfaces и настраиваем интерфейсы
мой файл /etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

# Local network
auto eth0
allow-hotplug eth0
iface eth0 inet static
        address 192.168.0.1
        netmask 255.255.255.0

# Yota LTE-modem
auto eth1
allow-hotplug eth1
iface eth1 inet static
        address 10.0.0.10
        netmask 255.255.255.0
        gateway 10.0.0.1
        dns-nameservers 8.8.8.8
[свернуть]

Настроим ресольвер
мой файл /etc/resolv.conf
nameserver 8.8.8.8
[свернуть]

Настроим форвардинг пакетов и iptables
в файл /etc/init.d/firewall, кроме прочего я добавил следующие строки

# в функцию do_start() добавим следующее
    # включим перенаправление пакетов через ядро
    echo 1 > /proc/sys/net/ipv4/ip_forward
    # при настройке фаервола iptables включим маскарадинг
    /sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# остальные правила фаервола не приводятся, дабы не отступать от сути
[свернуть]

Берём вот этот исходник утилиты usbreset и сохраняем его в файл с именем usbreset.c
usbreset.c

/* usbreset -- send a USB port reset to a USB device */
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>

int main(int argc, char **argv)
{
   const char *filename;
   int fd;
   int rc;

   if (argc != 2) {
      fprintf(stderr, "Usage: usbreset device-filenamen");
      return 1;
   }
   filename = argv[1];

   fd = open(filename, O_WRONLY);
   if (fd < 0) {
      perror("Error opening output file");
      return 1;
   }

   printf("Resetting USB device %s\n", filename);
   rc = ioctl(fd, USBDEVFS_RESET, 0);
   if (rc < 0) {
      perror("Error in ioctl");
      return 1;
   }
   printf("Reset successfuln");

   close(fd);
   return 0;
}
[свернуть]

Компилируем файл с помощью любого компилятора C (cc/gcc) командой вида gcc usbreset.c -o usbreset (установить компилятор можно командой apt-get install gcc) , получаем исполняемый файл usbreset.
Даём ему права на выполнение chmod +x usbreset.
Программа usbreset оперирует не с сетевыми интерфейсами, а с устройствами, поэтому с помощью lsusb узнаём необходимые параметры нашего модема.
Выдача lsusb содержит строки вида:
Bus 004 Device 002: ID 04e8:60a6 Samsung Electronics Co., Ltd
Конкретно для этого девайса запуск usbreset будет таким:
./usbreset /dev/bus/usb/004/002
Если есть трудности с определением устройства можно выполнить lsusb -v, которая даёт более развёрнутый ответ и посмотреть там.

И, наконец, добавим в /etc/crontab мониторинг подключения и reset модема при обрыве связи:
моя запись в /etc/crontab

* *    * * *   root    ping -c 1 8.8.8.8 || ping -c 1 213.87.1.1 || ping -c 1 77.40.0.3 || ./home/leo/bin/usbreset /dev/bus/usb/001/002
[свернуть]
т.е. если не проходит пинг ни до одного из указанных ip-адресов - сбросить устройство при помощи программы usbreset.
Внимание! В /etc/network/interfaces для интерфейса Yota-модема обязательно должно быть прописано allow-hotplug eth1 (у меня он называется eth1), иначе он не будет автоматически подниматься после сброса.

На этом всё - простейший шлюз на основе базовой системы Debian 7 готов, осталось описать правила фаервола iptables, установить ssh, другие необходимые сервисы и можно пользоваться.

Шлюз запущен в тестовом режиме. Будут косяки - напишу.

Уточнения, конструктивная критика, замечания приветствуются.



Использовались материалы отсюда и отсюда



upd
если случается так что самопроизвольно меняется путь Yota-модема (например был /dev/bus/usb/001/002, а стал /dev/bus/usb/001/004), то можно сделать следующее: создать bash-скрипт, с предложенным ниже содержанием и вместо предложенной выше строчки в crontab поместить его.

#!/bin/bash
d1=`lsusb | grep "1076:8002" | awk '{print $2}'`
d2=`lsusb | grep "1076:8002" | awk '{print $4}' | sed 's/:/\ /g'`
/bin/ping -c 1 8.8.8.8 || /bin/ping -c 1 8.8.4.4 || /var/script/usbreset /dev/bus/usb/$d1/$d2

Здесь "1076:8002" - ven dev модема, для вашего модема значение будет другим.
Естественно всё что используется в скрипте должно быть установлено. :)
Решение предложено endru.