Разделение интернет-соединения

Опубликовано 1 Июля, 2008 под тегами Debian, Сеть, Debian, Сеть

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

Итак, существует следующая схема (нарисована в Kivio):

Схема сегмента сети для ICS

Далее я буду считать, что локальная сеть между 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 в помощь.

Чтобы разделять соединение с другой (другими?) машинами, необходимо две вещи:

  1. Разрешить форвардинг ip-пакетов
  2. Настроить трансляцию сетевых адресов (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

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