Jump to content
  • Announcements

    • Где взять тестовые прошивки   08/23/2016

      Кратко: на files.keenopt.ru Подробнее: CLI мануалы для всех устройств: files.keenopt.ru/cli_manual/. Багфиксовые прошивки из серий 2.06, 2.07, 2.08, 2.09, 2.10 (они же delta): files.keenopt.ru/firmware/. Повторяют то, что официально выпущено как "Релиз" или "Бета-версия", но выпускаются еженедельно и содержат дополнительные исправления. При их установке вы автоматически будете получать обновления, обозначенные как "Отладочная версия". Экспериментальные прошивки из серии 2.11 (они же draft): files.keenopt.ru/experimental/. Также выпускаются еженедельно, и также автоматически обновляются через меню "Отладочная версия". Экспериментальные прошивки никогда официально не публиковались, впервые тестируются вне компании. Могут содержать как много нового интересного функционала, так и неприятные баги (вплоть до неработоспособности роутера). Будьте осторожны и заранее узнайте, как вернуть на место стабильную версию через режим восстановления. После заливки файла delta или draft, взятого с files.keenopt.ru, появляется выбор "Отладочная версия" на вкладке "Обновления".

        Для различных моделей Keenetic фиксируется версия прошивки, на которой будет заморожена их поддержка Версия 2.04: Keenetic Keenetic Giga Keenetic Lite Keenetic 4G Дальнейшие официальные релизы не запланированы.   Версия 2.05 (журнал изменений): Keeentic DSL Keenetic LTE (активная разработка возобновлена с 09.2016) Keenetic VOX Keenetic III (активная разработка возобновлена с 09.2016) Keenetic Start Keenetic 4G II Официальная поддержка: исправление критических ошибок и проблем в безопасности.   Версия 2.06 (журнал изменений): Keenetic II Keenetic Giga II Keenetic Ultra Официальная поддержка: исправление критических ошибок и проблем в безопасности.   Версия 2.07 (журнал изменений): Keenetic Lite II Keenetic Omni Официальная поддержка: исправление критических ошибок и проблем в безопасности.   Версия 2.08 (журнал изменений): Keenetic Lite III Keenetic Extra Keenetic Omni II Keenetic Viva Keenetic III Keenetic LTE Официальная поддержка: исправление критических ошибок и проблем в безопасности.   Версия 2.09 (журнал изменений), 2.10 (журнал изменений), 2.11 (журнал изменений) и выше: Keenetic Start II Keenetic 4G III rev. B Keenetic Lite III rev. B Keenetic Giga III Keenetic Ultra II Keenetic Extra II Keenetic Air Находятся на активной стадии поддержки и разработки.   Версия 2.09 (журнал изменений), 2.10 (журнал изменений), 2.11 (журнал изменений) и выше — неофициальная: Keenetic Lite II Keenetic Lite III Keenetic Omni Keenetic Omni II Keenetic II Keenetic III Keenetic Giga II Keenetic Ultra Keenetic LTE Keenetic DSL Keenetic VOX Выпускается по инициативе разработчиков, официальная поддержка не оказывается. Проверенные временем версии (на данный момент 2.09.C.X) находятся в канале delta, тестовые версии (на данный момент 2.11.A.X) - как всегда в draft). Публикация продолжается в рамках принятой схемы: Здесь, на форуме, сообщения об ошибках принимаются только для версий из draft. Поскольку в поддержке обращение по прошивке с версией из delta завернут, смотри п. 1 По мере выхода проверенных временем версий мы будем собирать их в delta для старых моделей. Гарантией работы будет только то, что кто-то другой на форуме потрудился над прошивкой, пока она была в draft.
Sign in to follow this  
peter0

source (policy) based routing или как пустить через vpn только одного клиента

6 posts in this topic

Здравствуйте!

Это мое первое сообщение, так что для начала хочу сказать спасибо всем за проект entware и за всю полезную информацию, которую нашел на этом форуме.

Хочу настроить роутер таким образом, чтобы можно было все соединения от одного из клиентов в сети пустить через vpn, а остальные клиенты чтобы шли через isp подключение как обычно.

Это нужно племяннику для play station 4, потому как sony иногда блокирует внешний ip адрес провайдера, кроме того, для совсем полноценной работы требуется куча портов открытых для входящих соединений. Заодно я сам хотел немного подучиться настраивать сеть, на этом примере.

План был такой:

  • Cоздать в zyxel keenetic omni ii подключение pptp с низким приоритетом
  • Прибить ps4 к конкретному ip адресу в локальной сети
  • Настроить роутинг таким образом, чтобы шлюзом по умолчанию для ps4 было ppp0 соединение
  • Настроить проброс портов на ps4

Все внутренние адреса прибиты и заранее известны (адрес ps4, адрес выдаваемый pptp сервером)

Да, ps4 не умеет vpn.

Поставил прошивку 2.0.5 с OPKG (v2.05(AAUS.4)C4), включил opkg, зашел по ssh. Долго искал в каком пакете находится программа ip (оказалось ip-legacy), но выяснилось, что поддержка advanced routing и multiple tables судя по всему выключена в ядре.

Теперь вопросы

  • Правильным ли путём иду?
  • Можно ли включить в ядре CONFIG_IP_ADVANCED_ROUTER, CONFIG_IP_MULTIPLE_TABLES и еще параметры необходимые для policy based routing?
  • Как собрать своё ядро/прошивку с нужными параметрами (если это вообще возможно)?
  • Может быть в экспериментальной прошивке 2.0.7 с ядром 3.4 уже включены нужные опции?

PS

Немного погрепал по прошивке выложенной в gpl_release, для некоторых target опция ADVANCED_ROUTER выключена, для некоторых включена, не знаю с чем связано. В любом случае, собрать это пока не получилось.

Share this post


Link to post
Share on other sites

В 2.07 CONFIG_IP_ADVANCED_ROUTER и CONFIG_IP_MULTIPLE_TABLES включены везде (причем еще во времен 2.06), поскольку нужны для IPsec.

Share this post


Link to post
Share on other sites

peter0, напишите пожалуйста о результатах, тоже очень интересует этот вопрос

Share this post


Link to post
Share on other sites

Более менее получилось сделать задуманное.

Если совсем кратко, то достаточно поставить один пакет и выполнить пару команд.

Подготовка роутера (в моем случае Omni II):

  • Ставим прошивку 2.07 - экспериментальную из этой темы (кстати iproute2 и необходимые настройки ядра имеются также в стабильной прошивке 2.06 на Giga III).
  • Включаем OPKG по инструкции в этой теме.
  • Заходим по ssh на роутер
  • Ставим пакет ip-legacy
    opkg install ip-legacy


  • Проверяем что ядро поддерживает advanced router, команда ip rule должна вернуть дефолтные таблицы
    > ip rule
    0:      from all lookup local
    32766:  from all lookup main
    32767:  from all lookup default
    

Настройки

В роутере должно быть установлено vpn подключение, приоритет подключения должен быть ниже, чем у основного (иначе, ясное дело, все будут ходить через vpn)

Далее предполагаем, что клиент, который должен ходить через vpn, имеет в локальной сети адрес 192.168.73.33 (адрес можно прибить в разделе hosts через веб интерфейс)

vpn интерфейс называется ppp0 , peer адрес тоннеля (шлюз vpn) 192.168.212.1 (можно посмотреть командой ip a), номером таблицы пусть будет 200

  • Добавляем правило для таблицы с условием по исходящему адресу клиента
    ip rule add from 192.168.73.33 table 200
    


  • Добавляем роут по умолчанию через vpn для таблицы 200
    ip route add default via 192.168.212.1 dev ppp0 table 200
    


  • Очищаем кеш (хотя у меня работало и без этого)
    ip route flush cache
    

После этого клиент 192.168.73.33 должен ходить через vpn, остальные клиенты через основное соединение.

Проброс портов настраивается через веб-интерфейс, но это дело индивидуальное и отдельная тема, для play station 4 требуется целая куча портов.

Чтобы эти настройки выжили после перезагрузки, можно, в принципе, добавить скрипт в /opt/etc/init.d, который будет выполнять эти команды при старте роутера.


if [ "$1" = "start" ]; then
ip rule add from 192.168.73.33 table 200
ip route replace default via 192.168.212.1 dev ppp0 table 200
ip route flush cache
fi

Стоит не забыть добавить права на исполнение файла


chmod u+x /path/to/file

Я хотел сделать, чтобы этот маршрут отключался при падении vpn и включался при восстановлении. Пытался сделать скрипт в /opt/etc/ndm/wan.d, однако оказалось что (в этой прошивке во всяком случае) скрипт из wan.d всегда запускается с параметром start (что бы там ни происходило на самом деле). В итоге пришел к выводу, что удобнее использовать cron, получилось несколько громоздко, но вроде бы работает. Привожу для примера, может кому-то будет полезно, пока толком не тестировал, но вроде работает.

crond уже есть в составе busybox, нужно только сделать init.d скрипт и создать каталог


mkdir -p /opt/var/spool/cron/crontabs

init скрипт скопировал из скрипта для dropbox и поменял команду и аргументы, получилось вот что

cat /opt/etc/init.d/S51crond


#!/bin/sh

ENABLED=yes
PROCS=crond
ARGS="-L /dev/null"
PREARGS=""
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

. /opt/etc/init.d/rc.func

Содержимое crontab (редактирутся командой crontab -e, либо файл /opt/var/spool/cron/crontabs/root)

crontab -l


* * * * * /opt/vpn-upstream monitor

Ну и далее сам скрипт, который я положил в файл /opt/vpn-upstream

Состояние интерфейса ppp0 проверяется каждую минуту, если оно изменилось, то запускается start или stop в зависимости от наличия нужного ip адреса на интерфейсе. Статус файл записывается в /tmp/, чтобы при рестарте автоматически очищаться.

Тоже стоит не забыть добавить права на исполнение файла:


chmod u+x /opt/vpn-upstream


vpnIface="ppp0"
vpnGateway="192.168.212.1"
# clients to be always routed via vpnIface, separated by spaces
# vpnClients="192.168.73.33 192.168.73.34"
vpnClients="192.168.73.33"

routeTable="vpn-upstream"
routeTableId="200"

verbose=""

statusFile="/tmp/vpn-upstream.status"


flushRules() {
# Drop all rules from $routeTable
ip rule l|grep $routeTable|cut -f0 -d:|xargs -rn1 ip rule del pref
}

# Update status of vpn interface
updateStatusFile() {
ip a|grep $vpnIface > $statusFile;
}

stop() {
debugMsg stop;
# echo `date` stopping >> /opt/vpn-up.log;
updateStatusFile;
# do nothing if routeTable is not defined
grep -v '^#' /opt/etc/iproute2/rt_tables|grep "$routeTable" > /dev/null || return 0;

# delete default route from table if exists
if ip route l table $routeTable|grep default > /dev/null; then
ip route del default table $routeTable;
fi
flushRules
ip route flush cache
}

start() {
debugMsg start;
updateStatusFile;
# echo `date` starting >> /opt/vpn-up.log;
# Add new table routeTable if not exist
grep -v '^#' /opt/etc/iproute2/rt_tables|grep "$routeTable" > /dev/null || echo "$routeTableId $routeTable" >> /opt/etc/iproute2/rt_tables
flushRules
for client in $vpnClients; do
ip rule add from $client table $routeTable
done
ip route replace default via $vpnGateway dev $vpnIface table $routeTable
ip route flush cache

}

# monitor vpn interface status change and run autoStartStop if changed
monitor() {
debugMsg monitor;
state=$(ip a|grep $vpnIface)
if [ ! -f $statusFile ]; then
touch $statusFile
fi
oldState=$(cat $statusFile);
stateHash=$(echo $state|sha1sum);
oldStateHash=$(echo $oldState|sha1sum);
if [ ! "$oldStateHash" = "$stateHash" ]; then
debugMsg 'auto start or stop';
autoStartStop;
fi
echo -n $state > $statusFile
}

autoStartStop() {
debugMsg "auto start or stop";
# start if has vpnGateway, stop otherwise
if ip a l|grep $vpnGateway > /dev/null; then
start;
else
stop;
fi
}

debugMsg() {
[ "$verbose" = "1" ] && echo `date` "$@"
}

status() {
debugMsg status
grep -v '^#' /opt/etc/iproute2/rt_tables|grep "$routeTable" > /dev/null || return 0;
ip rule l|grep $routeTable
ip route l table $routeTable
}

if [ "$2" = "-v" ]; then
verbose="1"
fi

case $1 in
"monitor")
monitor;
;;
"stop")
stop;
;;
"start")
start;
;;
"auto")
autoStartStop;
;;
*)
status;
;;
esac

Ну и, конечно, LARTC, другая документация и этот форум в помощь.

Share this post


Link to post
Share on other sites

правильно я понимаю, что если у меня

~ # cat /proc/sys/net/ipv4/conf/all/accept_source_route
0
~ # cat /proc/sys/net/ipv4/conf/all/rp_filter
0
то PBR у меня не будет?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×