Маршрутизация/ptables/2 канала (пустить rdp по отдельному каналу)
Модераторы: SLEDopit, Модераторы разделов
-
h0rn3t
- Сообщения: 11
- ОС: Debian
Маршрутизация/ptables/2 канала
Есть роутер(Debian), два pppoe канала (ppp0 и ppp1) как заставить по второму каналу ходить только на определенный адрес с rdp
-
Voler
- Сообщения: 498
- ОС: Fedora
-
pelmen
- Сообщения: 1268
- ОС: debian
Re: Маршрутизация/ptables/2 канала
надо с помощью iptables маркировать необходимый трафик ("на определенный адрес с rdp"), далее создать таблицу маршрутизации с маршрутом по-умолчанию $GW_ppp1 и с помощью iproute2 направлять этот помеченный трафик на эту таблицу. Не забыть проверить, чтобы iptables делал masquerade или SNAT правильно.
-
h0rn3t
- Сообщения: 11
- ОС: Debian
Re: Маршрутизация/ptables/2 канала
Код: Выделить всё
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 канала
Можно посмотреть на счётчики правил в iptables и увидеть -- доходит до MARK что-нибудь или нет.
-
h0rn3t
- Сообщения: 11
- ОС: Debian
Re: Маршрутизация/ptables/2 канала
посмотрел подозреваю что
было лишним , так как есть же
сделал дефолтным только один маршрут, и рдп трафик начал ходить по другому каналу, завтра проверю на живых юзерах
Код: Выделить всё
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 канала
Не работает. Когда я пингую промаркированый 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 канала
Ну Вы и написали! Перевожу для себя:
ДАНО: У Вас есть роутер в локалке, у которого внутренний интерфейс 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 также опущены, но могут пригодиться.
Спасибо сказали: