Підключаємо кілька локальних мереж з пересічною адресацією до одного комп’ютера
Локальні призначені для користувача мережі стихійно з'являються і зникають всюди, вони можуть охоплювати як цілі міські райони, так і з'єднувати лише пару комп'ютерів в квартирі.
Одні цю проблему вирішують фізичним підключенням тільки однією з «проблемних» мереж до комп'ютера і «перетикая» кабелі в міру необхідності.
Інші встановлюють для кожної мережі окрему плату в системний блок і «перемикають» мережі на рівні операційної системи, активізуючи потрібний мережний інтерфейс і вимикаючи всі непотрібні.
Треті використовують для управління мережевим «зоопарком» додаткове обладнання, благо простенький маршрутизатор варто зараз зовсім недорого, крім того, в його ролі можна використовувати старий нікому не потрібний комп'ютер.
Останній підхід універсальний, але при всіх своїх плюсах вимагає, по-перше, додаткове «залізо», а по-друге - вміння це «залізо» налаштовувати.
Для початку рекомендую ознайомитися з матеріалами [1, 2].
Ці матеріали можна знайти і російською мовою, але знайдені мною переклади дещо застаріли.
Вимоги до системи:
- Ядро Linux 2.6 (я використовував 2.6.17.9), зібране з підтримкою наступних опцій netfilter:
У більшості ядер з дистрибутивів потрібні опції вже включені, але для їх роботи потрібно довантажити потрібні модулі ядра.
- IPTables 1.2.9 і вище (я використовував 1.3.3).
При тестуванні роботи схеми використовувався дистрибутив Slackware Linux 10.2, але ви можете працювати з іншими збірками, так як схема універсальна.
Команди, наведені в статті, можна просто набирати з консолі, але краще оформити їх в якості командного файлу, що запускається при старті системи, я для цих цілей використовую /etc/rc.local.
Вихідні дані для підключень
Схематично це вони представлені на малюнку.
Завдання конфігурації системи можна розбити на три, більш дрібні:
- Ідентифікація та ініціалізація вхідного трафіку.
- Ініціалізація і маршрутизація відповідного трафіку.
- Ініціалізація і маршрутизація власного трафіку системи.
Під ідентифікацією трафіку мається на увазі визначення мережі джерела, а під инициализацией - надання ідентифікованим пакетам деяких специфічних рис, розмова про які піде далі.
Ідентифікація та ініціалізація вхідного трафіку
ip address add 192.168.1.10/32 dev eth1
iptables -t NAT -A PREROUTING -i eth1 -s 192.168.0.0/24 -j DNAT --to-destination 192.168.1.10
Ініціалізація і маршрутизація відповідного трафіку
Створимо в системі додаткову таблицю маршрутизації для кожної мережі. З консолі дайте наступні команди:
echo / etc / iproute2 / rt_tables >> 10 TO_ETH0
echo / etc / iproute2 / rt_tables >> 20 TO_ETH1
або додайте в файл / etc / iproute2 / rt_tables рядки відповідні «10 TO_ETH0», «20 TO_ETH1» вручну. У скрипт ці команди додавати не потрібно, достатньо запустити їх один раз.
Додаємо маршрут за замовчуванням в ці таблиці:
ip route add default dev eth1 table TO_ETH1
ip route add default dev eth0 table TO_ETH0
iptables -t mangle -A OUTPUT -s 192.168.0.10/24 -j MARK --set-mark 0
iptables -t mangle -A OUTPUT -s 192.168.1.10/24 -j MARK --set-mark 1
Маршрутізіруем в залежності від мітки:
ip rule add fwmark 1 table TO_ETH1
ip rule add fwmark 0 table TO_ETH0
iptables -t nat -A OUTPUT -s 192.168.1.10 -j DNAT --to 192.168.0.10
Тепер наш комп'ютер може відповідати на запити (наприклад, DNS або ICMP) з обох підключених мереж. Можна спробувати його «попінговать» і насолодитися отриманим ефектом.
Ініціалізація і маршрутизація власного трафіку системи
Описаних дій досить для організації роботи сервера в двох мережах, що відповідає на запити, що приходять з обох мереж, але не генерує власного трафіку.
В реальності таку ситуацію уявити складно, тому займемося трафіком, який генерує сам хост.
При зверненні до мережі, підключеної до інтерфейсу eth0 все залишається по-старому.
iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -j NETMAP -to 192.168.0.0
І все. Пакети будуть коректно отмаршрутізіровани за допомогою правил, створених нами вище.
Будьте гранично уважні при наборі правил, тому що навіть найменші помилки можуть привести до серйозних проблем, тому перед підключенням до реальних мереж працездатність конфігурації настійно рекомендую перевірити на «випробувальному стенді»: вашому ПК і декількох підключених до нього.