пятница, 28 июня 2013 г.

Компьютер на базе GNU/Linux в качестве шлюза

Предположим у нас есть 2 компьютера/ноутбука (не важно), на одном из которых две сетевые карты. Мы хотим обеспечить интернетом 2 этих компьютера без использования коммутатора/маршрутизатора.
Пусть первый компьютер имеет две сетевые карты и на нем установлен linux. На втором компьютере установлен windows. Имеется выход в интернет.
В качестве шлюза у нас будет выступать компьютер с linux на борту, от него будет принимать интернет, компьютер с windows на борту.
Схемка примерно такая:


Пусть у нас провайдер раздает ip-шники по DHCP. Тогда нам не надо париться со статическим ip-адресом для linux'а.

Первым делом нужно, естественно, настроить linux.
Первая сетевая карта (eth0) будет подключена к интернету, так как используется DHCP, то в файле /etc/network/interfaces для интерфейса eth0 можно написать:
auto eth0
iface eth0 inet dhcp

Тут все понятно. Если же провайдер раздает статические ip-шники, то нужно у него и спросить, тут писать не буду, еще гуглить по запросу «статический ip-адрес linux».

Вторая сетевая карта (eth1) будет связывать linux и windows.
Так как, DHCP сервер мы не настраивали, то ip-шник сделаем статическим.
В файл /etc/network/interfaces допишем настройки для eth1:
auto eth1
iface eth1 inet static #адрес статический
address 192.168.1.2 #ip-адрес
netmask 255.255.255.0 #маска


В итоге, после этих настроек, файл /etc/network/interfaces должен выглядеть примерно так:
auto lo #петля
iface lo inet loopback

auto eth0 #на интернет
iface eth0 inet dhcp

auto eth1 #на windows
iface eth1 inet static
address 192.168.1.2
netmask 255.255.255.0


Так, как мы отредактировали системный файл, мы должны перезагрузить демон сети:
$ sudo /etc/init.d/networking restart

Пока оставим в сторону linux, перейдем к настройке windows.
Соединим витухой сетевую карту eth1 (linux) и единственную сетевую карту на windows.
Должно установиться соединение и в настройках этого соединения в windows нужно прописать:
Ip-адрес: 192.168.1.3
Маска подсети: 255.255.255.0
Шлюз: 192.168.1.2 #ip-шник eth1 (linux)
DNS: 192.168.1.2 #ip-шник eth1 (linux)

Сохраняем это все дело.
Пробуем пинговать с windows наш linux, в командной строке пишем:
ping 192.168.1.2
Если пинг идет, значит коннект есть, но это не значит, что интернет уже доступен на windows, нужно еще настроить правила маршрутизации и DNS-сервер.

Опять возвращаемся к linux.
Первым делом нужно разрешить пересылку пакетов между интерфейсами, то есть чтобы, принятый пакет на eth0, можно было отправить на eth1:
$ sudo echo "1" > /proc/sys/net/ipv4/ip_forward
либо 
$ sudo nano /etc/sysctl.conf
найти строку и снять с нее комментарий:
net.ipv4.ip_forward=1 

Маршрутизацию пакетов мы разрешили, теперь нужно настроить правила, по которым пакеты будут отправляться от linux к windows.
Откроем файл /etc/rc.local и допишем перед! exit 0 такие строки: 
iptables -F 
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 
iptables -A FORWARD -i eth0 -o eth0 -j REJECT 
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Теперь установим пакет dnsmasq, он необходим для перенаправления DNS запросов, вышестоящим серверам:
$ sudo apt-get install dnsmasq

Попробуем проверить, работает ли DNS на windows.
В windows, в консоли, пишем:
nslookup ya.ru
Если идет ответ, а-ля:
Имя: ya.ru
Addresses: 87.250.251.3

То все нормально.
Перезагружаемся.

2 комментария:

Анонимный комментирует...

а про конфигурацию фаервола можешь написать по подробнее ?

Amet13 комментирует...

Что конкретно не понятно? man iptables решит большинство ваших проблем.