понедельник, 1 июня 2015 г.

Раздача интернета 3G в локальную сеть

Бывает такая ситуация, когда интернет подключён через 3G модем, но в доме больше одного компьютера. И всем нужен интернет. Выхода из положения тут 3:
1) Купить каждому компьютеру по модему.
2) Купить маршрутизатор (роутер) с USB разъёмом и раздавать интернет через него.
3) Расшарить модем в общий доступ по локальной сети.

Первый вариант нам не подходит, так как нужно раскошеливаться на ещё один или больше модемов. А это ещё и увеличенные ежемесячные абонентские платы. Второй вариант также затратен, но тут есть два преимущества: во первых вы платите один раз только за роутер, а во-вторых – простота настройки и подключения дополнительных устройств (например планшетов и смартфонов по wi-fi). Но мы не хотим ничего покупать, и имеем на руках один 3G модем и патч-корд (сетевой кабель) для соединения двух компов. Чтож, приступим.

Один из компьютеров будет выступать в качестве шлюза, раздающего интернет. Настройку я буду приводить на примере Debian, что также будет касаться и Ubuntu и прочих дэбианоподобных. Итак, в системе у нас одна сетевая карта, определённая как eth0, и 3G модем, определённый как ppp0. Для начала настроим статический IP адрес для сетевой карты. Вводим команду:

sudo nano /etc/network/interfaces

Перед нами будет примерно такое содержимое:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

Изменим его таким образом:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255


Сохраняем и перезапускаем сеть
Для Debian 8/Ubuntu 15.04
sudo systemctl restart networking

Для Debian 7/Ubuntu 14.04/14.10
sudo ifdown -a
sudo ifup -a

Отлично. Самое простое сделали :) Что дальше? Нам нужно настроить наш шлюз таким образом, чтобы он принимал все сетевые пакеты с интерфейса ppp0 (нашего модема) и передавал их на нашу локальную сеть (eth0), и наоборот. Для этого нужно насроить NAT (Netwiork Address Translation, трансляция сетевых адресов) и настроить фаерволл. Настройка будет проводиться через пакетный фильтр iptables – консольный интерфейс для "ядерного" фаерволла netfilter. Напишем несколько правил для него. Так как эти правила слетят после перезагрузки, дабы не вводить их по сто раз, напишем небольшой скрипт.

Для начала, нужно включить переадресацию в ядре. Открываем файл /etc/systctl.conf

sudo nano /etc/sysctl.conf

Ищем строку net.ipv4.ip_forward=1, удаляем перед ней решётку и сохраняем (Ctrl+O, Enter, Ctrl+X)
Применяем изменения
sudo sysctl -p

Теперь создадим файл gateway.sh со следующим содержимым:
 
#!/bin/sh

# Очищаем правила
iptables -v -F
iptables -v -X

# Определяем выходной интерфейс для которого будет применяться замена адресов (NAT)
iptables -v -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# Пересылаем все пакеты, пришедшие на модем из глобальной сети (0.0.0.0/0) в локальную сеть (192.168.0.0/24)
iptables -v -A FORWARD -i ppp0 -o eth0 -s 0.0.0.0/0 -d 192.168.0.0/24 -j ACCEPT

# Пересылаем все пакеты, пришедшие из локальной сети (192.168.0.0/24) в глобальную (0.0.0.0/0)
iptables -v -A FORWARD -i eth0 -o ppp0 -s 192.168.0.0/24 -d 0.0.0.0/0 -j ACCEPT

Сохраняем и даём права на выполнение:

chmod +x gateway.sh

Скрипт нужно запускать от sudo. Всё что теперь осталось – настроить второй ПК. Для этого в его сетевых настройках нужно указать в качестве шлюза 192.168.0.1, а также указать DNS-сервер (например стандартный Гугловский 8.8.8.8). Для этого откройте файл /etc/resolv.conf, и добавьте в начало строку:

nameserver 8.8.8.8

Можно также поднять DNS-сервер на самом шлюзе, но это лишнее.

Ссылки:
Русскоязычное руководство по iptables
Руководство по iptables на Ubuntu Wiki

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

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