Тайна стареющего мозга
21 час назад
ppp0 .--------. .-----> web (10.16.7.2) <-----O | eth0 | | router |-----------|-----> proxy (10.16.7.3) <-----O | 10.16.7.1 | ppp1 `--------' `-----> samba (10.16.7.4)Правила MASQUERADE добавляются в таблицы таким образом:
# iptables -t nat -A POSTROUTING -o ppp0 -s 10.16.7.0/24 -j MASQUERADE # iptables -t nat -A POSTROUTING -o ppp1 -s 10.16.7.0/24 -j MASQUERADEНе буду вдаваться в подробности тарифов и таблиц маршрутизации, намеренно упрощу изложение. Допустим что сеть 172.16.0.0/16 является внешней и принадлежит провайдеру. Обращаться к этой подсети, за исключением адреса 172.16.0.1, выгодно через интерфейс ppp1. Ко всем остальным адресам, включая 172.16.0.1, выгодно обращаться через интерфейс ppp0.
# ip route add 172.16.0.1 dev ppp0 # ip route add 172.16.0.0/16 dev ppp1 # ip route add default dev ppp0С трафиком из подсети 10.16.7.0/16 всё просто - он в любом случае будет замаскирован под IP-адрес того интерфейса, через который он пойдёт.
# ip route add 172.16.0.1 dev ppp0 src ppp0_IP # ip route add 172.16.0.0/16 dev ppp1 src ppp1_IP # ip route add default dev ppp0 src ppp0_IPГде ppp0_IP и ppp1_IP - IP-адреса на соответствующих интерфейсах.
201 table_ppp0 202 table_ppp1В каждую из таблиц добавим по единственному маршруту по-умолчанию в соответствующие направления следующими командами:
# ip route add default dev ppp0 table table_ppp0 # ip route add default dev ppp1 table table_ppp1Теперь нужно указать в каких случаях какой таблицей пользоваться. Нужно чтобы пакеты с исходным адресом ppp0_IP уходили по маршрутам в таблице table_ppp0, а пакеты с исходным адресом ppp1_IP уходили по маршрутам в таблице table_ppp1. Это мы сделаем с помощью следующих команд:
# ip rule add from ppp0_IP table table_ppp0 # ip rule add from ppp1_IP table table_ppp1Общий список всех команд для настройки Policy Based Routing в нашем примере будет таким (в первой группе команд на всякий случай явно укажем таблицу маршрутизации main):
# ip route add 172.16.0.1 dev ppp0 src ppp0_IP table main # ip route add 172.16.0.0/16 dev ppp1 src ppp1_IP table main # ip route add default dev ppp0 src ppp0_IP table main # ip route add default dev ppp0 table table_ppp0 # ip route add default dev ppp1 table table_ppp1 # ip rule add from ppp0_IP table table_ppp0 # ip rule add from ppp1_IP table table_ppp1После этого не будет проблем с трафиком с самого маршрутизатора, с трафиком из локальной сети 10.16.7.0/24, трафиком, адресованным самому маршрутизатору.
# iptables -t nat PREROUTING -i ppp0 -d ppp0_IP -p tcp --dport 80 -j DNAT --to 10.16.7.2:80 # iptables -t nat PREROUTING -i ppp1 -d ppp1_IP -p tcp --dport 80 -j DNAT --to 10.16.7.2:80Однако не стоит так торопиться, на самом деле всё чуть сложнее. Возвратный трафик от web-сервера к маршрутизатору будет обрабатываться в соответствии с правилами в таблице main и пакеты могут уйти на тот интерфейс, с которого это соединение инициировано не было.
# iptables -t nat PREROUTING -i ppp0 -d ppp0_IP -p tcp --dport 80 -j DNAT --to 10.16.7.2:80 # iptables -t nat PREROUTING -i ppp1 -d ppp1_IP -p tcp --dport 80 -j DNAT --to 10.16.7.5:80А для того, чтобы пакеты от веб-сервера попадали на нужный интерфейс, на маршрутизаторе можно было бы добавить ещё два правила выбора таблиц:
# ip add rule from 10.16.7.2 table table_ppp0 # ip add rule from 10.16.7.5 table table_ppp1Правда в этом случае весь трафик с web-сервера подчинялся бы этим правилам. Приходит на ум ещё одно решение: добавить web-серверу ещё один адрес и использовать все три таблицы маршрутизации. Для этого изменим правила DNAT таким образом:
# iptables -t nat PREROUTING -i ppp0 -d ppp0_IP -p tcp --dport 80 -j DNAT --to 10.16.7.5:80 # iptables -t nat PREROUTING -i ppp1 -d ppp1_IP -p tcp --dport 80 -j DNAT --to 10.16.7.6:80Правила выбора таблицы маршрутизации для web-сервера будут такими:
# ip add rule from 10.16.7.5 table table_ppp0 # ip add rule from 10.16.7.6 table table_ppp1Можно, конечно, сделать ещё более тонкую настройку - ужесточить два последних правила выбора таблицы маршрутизации использовав для отбора пакетов правила iptables:
# iptables -t nat PREROUTING -i ppp0 -d ppp0_IP -p tcp --dport 80 -j DNAT --to 10.16.7.5:80 # iptables -t nat PREROUTING -i ppp1 -d ppp1_IP -p tcp --dport 80 -j DNAT --to 10.16.7.6:80 # iptables -t mangle -A PREROUTING -s 10.16.7.5 -p tcp --sport 80 -j MARK --set-mark 1 # iptables -t mangle -A PREROUTING -s 10.16.7.6 -p tcp --sport 80 -j MARK --set-mark 2 # ip add rule fwmark 1 table table_ppp0 # ip add rule fwmark 2 table table_ppp1Можно не назначать дополнительные адреса web-серверу, а заставить web-сервер принимать соединения на двух портах: 80 и 81.
# iptables -t nat PREROUTING -i ppp0 -d ppp0_IP -p tcp --dport 80 -j DNAT --to 10.16.7.2:80 # iptables -t nat PREROUTING -i ppp1 -d ppp1_IP -p tcp --dport 81 -j DNAT --to 10.16.7.2:81 # iptables -t mangle -A PREROUTING -s 10.16.7.2 -p tcp --sport 80 -j MARK --set-mark 1 # iptables -t mangle -A PREROUTING -s 10.16.7.2 -p tcp --sport 81 -j MARK --set-mark 2 # ip add rule fwmark 1 table table_ppp0 # ip add rule fwmark 2 table table_ppp1Итак, полностью рабочая и наиболее точная схема обработки трафика в целом будет выглядеть так:
# iptables -t nat -A POSTROUTING -o ppp0 -s 10.16.7.0/24 -j MASQUERADE # iptables -t nat -A POSTROUTING -o ppp1 -s 10.16.7.0/24 -j MASQUERADE # ip route add 172.16.0.1 dev ppp0 src ppp0_IP table main # ip route add 172.16.0.0/16 dev ppp1 src ppp1_IP table main # ip route add default dev ppp0 src ppp0_IP table main # ip route add default dev ppp0 table table_ppp0 # ip route add default dev ppp1 table table_ppp1 # ip rule add from ppp0_IP table table_ppp0 # ip rule add from ppp1_IP table table_ppp1 # iptables -t nat PREROUTING -i ppp0 -d ppp0_IP -p tcp --dport 80 -j DNAT --to 10.16.7.2:80 # iptables -t nat PREROUTING -i ppp1 -d ppp1_IP -p tcp --dport 80 -j DNAT --to 10.16.7.2:81 # iptables -t mangle -A PREROUTING -s 10.16.7.2 -p tcp --sport 80 -j MARK --set-mark 1 # iptables -t mangle -A PREROUTING -s 10.16.7.2 -p tcp --sport 81 -j MARK --set-mark 2 # ip add rule fwmark 1 table table_ppp0 # ip add rule fwmark 2 table table_ppp1Теперь представьте что у вас во внутренней сети работает не один сервис. А теперь представьте, что и соединений с провайдерами больше. А теперь представьте, что всё это хозяйство должно динамически изменяться при установке и падении связи с определённым провайдером. Не думаю, что вы будете в восторге от такой головной боли.
GW1 GW2 ^ ^ | | IP1 | | IP2 [eth1] | | [eth2] .o-----o. | | | gw | | | `-------' 10.0.3.250 | 10.0.3.254 [eth0] | [eth0:1] | | 10.0.3.249 | 10.0.3.253 [eth1] | [eth1:1] .-------. | | | pgw | | | `-------' | 10.0.3.6 | [eth0] |В примечании к схеме указано:
на панель 110 на розетки (схема B) синяя -------\ оранжевая (1 разъём) оранжевая -------/ зелёная (1 разъём) зелёная -------\ оранжевая (2 разъём) коричневая-------/ зелёная (2 разъём)2. Если в розетку можно задействовать под компьютер целиком, то разводка будет такой:
на панель 110 на розетку (схема B) синяя -------\ синяя оранжевая --------\ оранжевая зелёная --------/ зелёная коричневая-------/ коричневая3. Если розетку можно задействовать под телефон целиком, то разводка будет такой:
на панель 110 на розетку (схема B) синяя -------> синяя оранжевая зелёная коричневаяОднако при этом развести розетку для телефона лучше точно так же, как и для компьютера, чтобы розетка была универсальной и её легко можно было перекоммутировать на панели для подключения компьютера.
на панель 110 на розетку (схема B) синяя -------> синяя оранжевая - - - - \ оранжевая зелёная - - - - / зелёная коричневая- - - -/ коричневая4. Теперь самый интересный вариант. Разводим телефон и компьютер. Тут есть два варианта.
на панель 110 на розетку (схема B) синяя - - - -> синяя (1 разъём) оранжевая --------\ оранжевая (1 разъём) зелёная --------/ зелёная (1 разъём) коричневая-------> синяя (2 разъём)4.2. И второй:
на панель 110 на розетку (схема B) синяя -------> синяя (1 разъём) оранжевая --------\ оранжевая (2 разъём) зелёная --------/ зелёная (2 разъём) коричневая- - - -> синяя (2 разъём)На фотографиях ниже наглядно представлена схема разводки розетки.