Разделение интернет-соединения
В одном из читаемых мной блогов появился вопрос. Поскольку я с этим уже некоторое время как отмаялся, решил написать развернутый ответ. Хотя все довольно просто.
Итак, существует следующая схема (нарисована в Kivio):
Далее я буду считать, что локальная сеть между Client и Server настроена, пинги идут, и подключение к интернету с сервера настроено.
Пусть ifconfig сервера таков (с незначительными изменениями взято с этого сервера)
# ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:77.246.109.221 Bcast:77.246.109.255 Mask:255.255.255.0
inet6 addr: xxxxxxxxxxxxxxxxxxxxxxxxx Диапазон:Ссылка
ВВЕРХ BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2383071 errors:0 dropped:0 overruns:0 frame:0
TX packets:3067695 errors:0 dropped:0 overruns:0 carrier:0
коллизии:0 txqueuelen:1000
RX bytes:648097379 (618.0 MB) TX bytes:3749447015 (3.4 GB)
Прервано:21 Base address:0xd200
eth1 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: xxxxxxxxxxxxxxxxxxxxxxxxxx Диапазон:Ссылка
ВВЕРХ BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1877997 errors:0 dropped:0 overruns:0 frame:0
TX packets:2484147 errors:0 dropped:0 overruns:0 carrier:0
коллизии:0 txqueuelen:1000
RX bytes:149732757 (142.7 MB) TX bytes:2307453700 (2.1 GB)
Прервано:20 Base address:0x2000
Перейдем к настройке.
Настройка сервера
Поскольку мы считаем, что оба интерфейса настроены, я не буду на этом останавливаться, ибо это материал для отдельной статьи, к тому же ничего сложного и даже никаких тонкостей в процессе нет. man interfaces в помощь.
Чтобы разделять соединение с другой (другими?) машинами, необходимо две вещи:
- Разрешить форвардинг ip-пакетов
- Настроить трансляцию сетевых адресов (NAT)
Форвардинг
Первый пункт достаточно тривиален. Нужно раскомментировать (то есть удалить # в начале строки) строчку
#net.ipv4.ip_forward=1
В файле /etc/sysctl.conf и либо перезагрузиться, либо выполнить команду
$ sudo bash -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
Фактически, исправляя файл /etc/sysctl.conf , мы говорим системе выполнять эту команду при загрузке.
NAT
NAT чаще всего настраивается при помощи iptables (man iptables для интересующихся). В данном конкретном случае нас интересует лишь одна, максимум две таблицы (из четырех :) )
Подробнее о всех производимых далее манипуляциях рекомендую почитать здесь (ссылка на OpenNet)
Итак, во-первых, есть два варианта: простой и параноидальный. Простой включается одной командой, а именно, такой:
$ sudo iptables -t nat -o eth0 -A POSTROUTING -j MASQUERADE
eth0, как видно из схемы, интерфейс, смотрящий в интернет.
Если IP-адрес “интернетового” интерфейса статический, то можно сэкономить немного процессорного времени, явно указав IP для маскарада:
$ sudo iptables -t nat -A POSTROUTING -o eth0 -m mark --mark 0x1 -j SNAT --to-source 77.246.109.221
Где eth0 - “интернетовый” интерфейс, 77.246.109.221 - его ip-адрес.
Казалось бы, что еще нужно. Однако, если помимо eth0 и eth1 есть другие интерфейсы, или если вы соединяетесь с интернетом через VPN-туннель (что с точки зрения nat есть одно и то же), то помимо вашего второго компьютера, теоретически ВСЕ пользователи “третьего” интерфейса могут использовать ваш канал в интернет. Это в общем случае не есть хорошо. Поэтому вашему вниманию предлагается вариант второй, параноидальный:
$ sudo iptables -t mangle -A PREROUTING -i eth1 -j MARK --set-mark 0x1
$ sudo iptables -t nat -A POSTROUTING -o eth0 -m mark --mark 0x1 -j MASQUERADE
Все ранее упомянутые поправки из обычного способа применимы.
Поясню, что значат эти команды. Первая команда маркирует все пакеты, пришедшие на сервер с интерфейса eth1, а вторая промускает через NAT только маркированные пакеты. Таким образом, разрешены только соединения с локального интерфейса.
Так же, чтобы не вызывать каждый раз эти команды, можно воспользоваться таким скриптом, который следует положить в init.d и разрешить командой update-rc.d:
#!/bin/bash
case $1 in
start)
iptables-restore < /etc/iptables.conf
;;
esac
Например, сохранить этот скрипт как /etc/init.d/iptables и выполнить
$ sudo update-rc.d iptables defaults
Настройка клиента
Настройка клиентских машин проста как топор. Нужно установить gateway на ip eth1 сервера.
Делается это просто: в /etc/network/interfaces к конфигурации eth0 дописывается одна строчка. Например:
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
Вот, собственно, и все премудрости.