Маршрутизация/ptables/2 канала (пустить rdp по отдельному каналу)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
h0rn3t
Сообщения: 11
ОС: Debian

Маршрутизация/ptables/2 канала

Сообщение h0rn3t »

Есть роутер(Debian), два pppoe канала (ppp0 и ppp1) как заставить по второму каналу ходить только на определенный адрес с rdp
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Re: Маршрутизация/ptables/2 канала

Сообщение Voler »

h0rn3t писал(а):
21.08.2012 10:54
Есть роутер(Debian), два pppoe канала (ppp0 и ppp1) как заставить по второму каналу ходить только на определенный адрес с rdp


route add address dev ppp1 gw your_out_address
address - внешний адрес
your_out_address - внешний адрес линка.


Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Маршрутизация/ptables/2 канала

Сообщение pelmen »

надо с помощью iptables маркировать необходимый трафик ("на определенный адрес с rdp"), далее создать таблицу маршрутизации с маршрутом по-умолчанию $GW_ppp1 и с помощью iproute2 направлять этот помеченный трафик на эту таблицу. Не забыть проверить, чтобы iptables делал masquerade или SNAT правильно.
Спасибо сказали:
Аватара пользователя
h0rn3t
Сообщения: 11
ОС: Debian

Re: Маршрутизация/ptables/2 канала

Сообщение h0rn3t »

Код: Выделить всё

export LAN=eth1
export WAN=ppp0
export WAN2=ppp1
####### FLUSH ################
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
####### DEFAULT ##############
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
####### GATEWAY ##############
iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE
iptables -A FORWARD -i ${LAN} -j ACCEPT
iptables -t nat -A POSTROUTING -o ${WAN2} -j MASQUERADE
iptables -A FORWARD -i ${LAN} -j ACCEPT
####### BALANCE ##############
ip route replace default scope global \
nexthop via *.*.216.193 dev ppp0 weight 1 \
nexthop via *.*.216.193 dev ppp1 weight 1
ip route add default via *.*.216.193 dev ppp0 table wan1
ip route add default via *.*.216.193 dev ppp1 table wan2
ip rule add priority 101 fwmark 0x1/0x1 lookup wan1
ip rule add priority 102 fwmark 0x2/0x2 lookup wan2
iptables -t mangle -A INPUT -i ppp0 -j CONNMARK --set-mark 0x1
iptables -t mangle -A INPUT -i ppp1 -j CONNMARK --set-mark 0x2
iptables -t mangle -A INPUT -i eth+ -j CONNMARK --set-mark 0x8
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m mark ! --mark 0x0 -j ACCEPT
iptables -t mangle -A OUTPUT -d *.*.181/32 -j MARK --set-mark 0x1
iptables -t mangle -A FORWARD -d *.*.13.181/32 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -d *.*.13.181/32 -p tcp -m tcp --dport 3389 -j MARK --set-mark 0x1
iptables -t mangle -A FORWARD -d *.*.13.181/32 -p tcp -m tcp --dport 3389 -j MARK --set-mark 0x1



Сделал через маркировку (хз верно ли ) но клиенты всеравно ходят через оба канала в следствии чего РДП коннект разрывается
хочу подчеркнуть что оба канала имеют один и тот же шлюз (2 канала от одного провайдера)
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: Маршрутизация/ptables/2 канала

Сообщение KiWi »

Можно посмотреть на счётчики правил в iptables и увидеть -- доходит до MARK что-нибудь или нет.
Спасибо сказали:
Аватара пользователя
h0rn3t
Сообщения: 11
ОС: Debian

Re: Маршрутизация/ptables/2 канала

Сообщение h0rn3t »

посмотрел подозреваю что

Код: Выделить всё

 ip route replace default scope global \
nexthop via *.*.216.193 dev ppp0 weight 1 \
nexthop via *.*.216.193 dev ppp1 weight 1

было лишним , так как есть же

Код: Выделить всё

ip route add default via *.*.216.193 dev ppp0 table wan1
ip route add default via *.*.216.193 dev ppp1 table wan2


сделал дефолтным только один маршрут, и рдп трафик начал ходить по другому каналу, завтра проверю на живых юзерах
Спасибо сказали:
Аватара пользователя
h0rn3t
Сообщения: 11
ОС: Debian

Re: Маршрутизация/ptables/2 канала

Сообщение h0rn3t »

Не работает. Когда я пингую промаркированый IP то попадаю под правила

Код: Выделить всё

iptables -t mangle -A OUTPUT -d  *.*.13.181/32 -j MARK --set-mark 0x1
iptables -t mangle -A FORWARD -d *.*.13.181/32 -j MARK --set-mark 0x1

а юзеры не попадают, что не так помогите:(


Код: Выделить всё

#!/bin/sh
echo "1" > /proc/sys/net/ipv4/ip_forward
####### CONSTANTS ############
export LAN=eth1
export WAN=ppp0
export WAN2=ppp1
####### FLUSH ################
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
####### DEFAULT ##############
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
####### BALANCE ##############
ip route replace default scope global via  *.*..216.193 dev ppp1
ip route add default via  *.*..216.193 dev ppp0 table wan1
ip route add default via  *.*..216.193 dev ppp1 table wan2
ip rule add priority 101 fwmark 0x1/0x1 lookup wan1
ip rule add priority 102 fwmark 0x2/0x2 lookup wan2
iptables -t mangle -A INPUT -i ppp0 -j CONNMARK --set-mark 0x1
iptables -t mangle -A INPUT -i ppp1 -j CONNMARK --set-mark 0x2
iptables -t mangle -A INPUT -i eth+ -j CONNMARK --set-mark 0x8
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m mark ! --mark 0x0 -j ACCEPT
iptables -t mangle -A OUTPUT -d  *.*..13.181/32 -j MARK --set-mark 0x1
iptables -t mangle -A FORWARD -d  *.*..13.181/32 -j MARK --set-mark 0x1
####### GATEWAY ##############
iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE
iptables -A FORWARD -i ${LAN} -j ACCEPT
iptables -t nat -A POSTROUTING -o ${WAN2} -j MASQUERADE
iptables -A FORWARD -i ${LAN} -j ACCEPT
Спасибо сказали:
Аватара пользователя
infra_hdc
Сообщения: 376
ОС: GNU/Linux

Re: Маршрутизация/ptables/2 канала

Сообщение infra_hdc »

h0rn3t писал(а):
21.08.2012 10:54
Есть роутер(Debian), два pppoe канала (ppp0 и ppp1) как заставить по второму каналу ходить только на определенный адрес с rdp


Ну Вы и написали! Перевожу для себя:

ДАНО: У Вас есть роутер в локалке, у которого внутренний интерфейс eth1 и у локалки адрес сети LAN-NET (192.168.0.0/24 к примеру), роутер получает интернет через 2 ppp(oe) девайса ppp0 и ppp1 и раздает его в локалку.
НАЙТИ: Способ сделать так, чтобы тем, кто внутри локалки, можно было ходить на определённый адрес RDP1-IP, который в интернете, при этом связь по протоколу RDP с ним была бы через ppp1.

РЕШЕНИЕ:

Поскольку, судя по всему, у провайдера в пуле для раздачи [роутеру] динамические IP-адреса, задача немного усложняется.

Но, допустим мы знаем адрес, который выдался интерфейсу ppp1: он равен PPP1-IP.

Тогда добавление нужного правила будет примерно таким:
iptables -t nat -I POSTROUTING -p tcp -m tcp -s ${LAN-NET} --dport 3389 -d ${RDP1-IP} -j SNAT --to-source ${PPP1-IP}

Немного забегая вперёд, скажу, что нам понадобится и команда для удаления этого правила:
iptables -t nat -D POSTROUTING -p tcp -m tcp -s ${LAN-NET} --dport 3389 -d ${RDP1-IP} -j SNAT --to-source ${PPP1-IP}

Но поскольку адрес PPP1-IP выбирается из пула динамически, поэтому значение его случайно и меняется во времени, то мы не можем навсегда знать адрес PPP1-IP, который можно было бы добавить в скрипт вручную, придётся применить триггер: при получении/обновлении адреса на интерфейсе ppp1, выполняется скрипт, который удаляет старое правило (со старым значением адреса) и вставляет новое правило (с новым значением адреса).

По поводу того, как конкретно: вот тут уже идёт моя фантазия в стиле NO WARRANTY + результаты поиска по гуглу и копания на инструментальном хосте:

На той машине, которая у меня, работу клиента DHCP обеспечивает пакет isc-dhcp-client. Поскольку у меня тоже Debian-based дистрибутив, как и у Вас на роутере, и ставилось всё без выкрутасов, с большой вероятностью и у Вас тот же пакет.
Идём в маны (man 5 dhclient.conf) и ищем по слову script: попалось упоминание (man 8 dhclient-script) что и смотрим.

Вам надо создать скрипт, путь к которому указан в dhclient.conf (впишите путь в параметр script для интерфейса ppp1).
При запуске этот скрипт должен обрабатывать события, связанные с клиентом dhcp, для чего смотрим переменные окружения этого скрипта:

Если первая привязка адреса к интерфейсу, т.е. "$reason" == "BOUND", то если "$interface" == "ppp1", то вызываем добавление правила:

Код: Выделить всё

iptables -t nat -I POSTROUTING -p tcp -m tcp -s ${LAN-NET} --dport 3389 -d ${RDP1-IP} -j SNAT --to-source $new_ip_address


Когда идёт обновление адреса, т.е. "$reason" == "RENEW" для того же ppp1, в этом же скрипте надо дать две команды: для удаления старого и для вставки нового правила:

Код: Выделить всё

iptables -t nat -D POSTROUTING -p tcp -m tcp -s ${LAN-NET} --dport 3389 -d ${RDP1-IP} -j SNAT --to-source $old_ip_address
iptables -t nat -I POSTROUTING -p tcp -m tcp -s ${LAN-NET} --dport 3389 -d ${RDP1-IP} -j SNAT --to-source $new_ip_address

Если исходить из того, что в реале будет всё просто, картина будет примерно такой.

Но возможно, понадобятся и обработки других событий и использование дополнительных переменных окружения скрипта, усложнение приведённых выше обработчиков событий (например, если, BOUND случайно наступит не вначале ppp-сессии, а в середине, также если нужно обрабатывать события освобождения адреса и/или опускания интерфейса ppp1 в конце сеансов ppp, чтобы не скапливался мусор в правилах iptables). Несущественные подробности типа iptables -t filter -A FORWARD также опущены, но могут пригодиться.
Спасибо сказали: