Инструменты пользователя

Инструменты сайта


doc:os:ubuntu:setting_up_gateway_in_case_external_port-forwarding

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
doc:os:ubuntu:setting_up_gateway_in_case_external_port-forwarding [d.m.Y H:i] dbehterevdoc:os:ubuntu:setting_up_gateway_in_case_external_port-forwarding [d.m.Y H:i] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +====== Настройка шлюза в случае внешнего порт-форвардинга ======
  
 +Итак, пусть в компании имеется два шлюза с внутренними IP адресами:
 +  * Windows-шлюз 192.168.0.90
 +  * Ubuntu-шлюз 192.168.0.250
 +Шлюз с IP 192.168.0.90 выполняет проброс порта PPTP (TCP 1723) на другой шлюз с IP 192.168.0.250. Такое имеет место быть: Ubuntu-шлюз подключен к WiMax провайдеру Yota и не имеет доступного извне IP адреса, кроме того, IP адрес Ubuntu шлюз получает по DHCP из сети 10.0.0.0/8 (поэтому решение на базе DYNDNS отпадает). Win шлюз же имеет внешний постоянный адрес.
 +Итак, вы настроили проброс с Win-шлюза по порту PPTP на Ubuntu шлюз, но ничего не работает...
 +Посмотрим на таблицу маршрутизации на Ubuntu-шлюзе:
 +<code>
 +route -n
 +Таблица маршутизации ядра протокола IP
 +Destination Gateway Genmask Flags Metric Ref Use Iface
 +192.168.0.240   0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
 +192.168.0.0     0.0.0.0         255.255.255.0            0        0 eth2
 +10.133.112.0    0.0.0.0         255.255.240.0            0        0 wimax0
 +0.0.0.0         10.133.112.1    0.0.0.0         UG    0      0        0 wimax0
 +</code>
 +Мы видим, что имеется 1 маршрут по-умолчанию, отсылающий пакеты к шлюзу провайдера Yota. Т.О., когда приходят проброшенные пакеты с Windows-шлюза, Ubuntu-шлюз отправляет их по маршруту по-умолчанию, что не приемлемо. Нужно сделать так, чтобы все проброшенные пакеты шли обратно по-тому же маршруту, по которому пришли. 
 +Решим проблему с помощью дополнительной таблицы маршрутизации.
 +
 +**1.** Добавим в файл /etc/iproute2/rt_tables строку вида "Числовой_номер Имя_Таблицы":
 +<code>
 +4 4
 +</code>
 +Для удобства я всегда присваиваю для обоих полей числовой номер. Мы создали новую дополнительную таблицу маршрутизации с номером 4 и именем 4. Пока она пуста: вывод ip route show table 4 пуст. 
 +
 +**2.** Будем работать с таблицей mangle IPtables. Таблица mangle используется для модификации проходящих пакетов TCP/IP и работаем с пятью "цепочками" (man iptables): 
 +  * До версии ядра 2.4.17: PREROUTING - для модификации входящих пакетов перед маршрутизацией;
 +  * До версии ядра 2.4.17: OUTPUT (для модификации локально-сгенерированных пакетов перед маршрутизацией)
 +  * INPUT - для модификации пакетов, которые заходят в шлюз
 +  * FORWARD - для модификации пакетов, которые идут через шлюз (т.е. предназначены для хоста, отличного от данного шлюза)
 +  * POSTROUTING - для модификации пакетов, которые вышли из шлюза.
 +
 +Поскольку мне нужно направить локально-сгенерированные пакеты по нужному маршруту, т.е. перед маршрутизацией, я выбираю цепочку OUTPUT. Пишем правило:
 +<code>
 +/sbin/iptables -t mangle -A OUTPUT -p TCP --sport 1723 -j MARK --set-mark 0x4
 +/sbin/iptables -t mangle -A OUTPUT -p GRE -s 192.168.0.250/32 -j MARK --set-mark 0x4 
 +</code>
 +Т.е. все локально-сгенерированные пакеты, с порта отправителя 1723, а также все GRE пакеты, помечаются меткой (как бы привязываются к нашей созданной ранее таблице маршрутизации).
 +<note tip>Обратите внимание, значение после --set-mark указывается в 16-ричном виде, тогда как в /etc/iproute2/rt_tables значения хранятся в 10-виде.</note>
 +
 +**3.** Пишем простой скрипт для инициализации дополнительной таблицы маршрутизации:
 +<code>
 +#!/bin/sh
 +
 +echo "Erase the route..."
 +
 +INET_GW="192.168.0.90"
 +
 +/bin/ip route flush cache
 +/bin/ip route flush table 4
 +
 +echo "Copy main routing table to table 4 (ID 4)"
 +
 +/bin/ip route show table main | grep -Ev ^default | while read ROUTE ; do ip route add table 4 $ROUTE ; done
 +/bin/ip route add table 4 default via $INET_GW
 +
 +/bin/ip rule add fwmark 4 table 4
 +
 +/bin/echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
 +/bin/echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
 +</code>
 +В этом скрипте мы очищаем таблицу маршрутизации и добавляем в нее все имеющиеся маршруты, кроме маршрута по-умолчанию. Маршрут по-умолчанию в таблице 4 теперь будет проходить через Win-шлюз (IP 192.168.0.90).
 +
 +Теперь надо, чтобы дополнительная таблица маршрутизации инициализировалась каждый раз при старте системы, т.е. можно просто добавить в секцию объявления какого-либо сетевого интерфейса в /etc/network/interfaces соответствующую директиву up (я добавил в секции описания моего Wimax модема):
 +<code>
 +auto wimax0
 +iface wimax0 inet dhcp
 +pre-up iptables-restore < /etc/iptables.rules.2       # правила фаерволла, в которые добавлена директива по работе с таблицей mangles (см. выше)
 +up /root/scripts/setup.routing.table.sh
 +</code>
 +
 +TAG: {{tag>Ubuntu iptables}}