Подскажите, кто пользуется данными скриптами, можно ли в скрипте udhcpc.sh написать запись маршрутов?
Они же вроде приходят, и их видно через msroutes. Если можно покажите пример.
Заранее спасибо.
PS: опыта работы в линухе нету.
припоминаю фидошные времена и параметр fucking_telebit YES в одном интересном почтареCode:Если используется кабельный модем Terayon tj7xx то задать nvram set wan2_fucking_terayon=1
Подскажите, кто пользуется данными скриптами, можно ли в скрипте udhcpc.sh написать запись маршрутов?
Они же вроде приходят, и их видно через msroutes. Если можно покажите пример.
Заранее спасибо.
PS: опыта работы в линухе нету.
все можно
переменные то экспортятся routes и msroutes
тока они там в каком то бинарном виде
писать парсилку банально лень
да и тестить негде
если покажете содержимое переменных - попробую что то наваять
Спасибо Вам за скрипты и ответ!
вот содержимое переменных
routes: ''
msroutes: '16 192 168 10 49 128 1 12 10 48 10 49 128 1 24 10 100 12 10 49 128 1 24 78 29 0 10 49 128 1'
скорее всего шаблон такой: mask dest gw
получается что-то вроде (ненужные нули в dest убраны):
192.168/16
10.49.128.1
10.48/12
10.49.128.1
10.100.12/24
10.49.128.1
78.29.0/24
10.49.128.1
в исходниках нашел ф-цию add_wanx_routes, вроде то что нужно.
(Теперь нужно найти время научиться Bourne shell и заскриптовать ее)
там кстати не bash
я написал скрипт. но что то он тормозно работает
странно все это
жалкие 200 маршрутов добавляет секуд 7мь
это очень долго
видно томозит test
на асусе скрипт
for i in `seq 1 2000` ; do [ -z "$ddd" ] ; done
real 0m 50.64s
user 0m 13.37s
sys 0m 36.36s
на нормальной машине
real 0m0.009s
user 0m0.000s
sys 0m0.012s
толи штуки бизибокса. не пойму пока
поле куска
if [ "$proto" = "dhcp" ]; then
if [ ! -z `nvram get ${wan}_testip_1` ]; then
$LOG "set routes for test ip adresses"
ip route replace `nvram get ${wan}_testip_1` via $gw
ip route replace `nvram get ${wan}_testip_2` via $gw
fi
можно вкрячить что то вроде
но гадский тест (вернее бизибокс) тормозит :( на 2000 маршрутах работает порядка минутыCode:if [ ! -z "$msroutes" ]; then set $msroutes while [ $# -gt 5 ]; do if [ $1 -eq 0 ]; then $LOG "DO NOT set default route in this script" shift 5 continue elif [ $1 -lt 9 ]; then route="$2.0.0.0/$1" shift 2 elif [ $1 -lt 17 ]; then route="$2.$3.0.0/$1" shift 3 elif [ $1 -lt 25 ]; then route="$2.$3.$4.0/$1" shift 4 else route="$2.$3.$4.$5/$1" shift 5 fi router="$1.$2.$3.$4" shift 4 case "$router" in 0.0.0.0) $LOG "set route to $route via interface $interface" ip route replace $route dev $interface ;; *) $LOG "set route to $route via $router" ip route replace $route via $router ;; esac done fi
ну и типа тут проверок ноль
если маршрута к переданному таким образом гейту нет (например он находится в сети отличной от сети в которой наш интерфейс) тогда оппа
ну и все такое
и еще. если по dhcp нам выдали тот же адрес, маску и гейт то мой скрипт ничего не делает. однако возможна ситуация когда выдали старый адрес и гейт, но новые маршурты (в теории). тогда надо старые убирать, новые добавлять. в теории. на практике это не делается.
Last edited by gaaronk; 27-07-2008 at 21:33.
да. вот так код некрасивый но быстрый
Code:if [ ! -z "$msroutes" ]; then set $msroutes while true; do case "$1" in 0) $LOG "DO NOT set default route in this script" shift 5 continue ;; 1|2|3|4|5|6|7|8) route="$2.0.0.0/$1" shift 2 ;; 9|10|11|12|13|14|15|16) route="$2.$3.0.0/$1" shift 3 ;; 17|18|19|20|21|22|23|24) route="$2.$3.$4.0/$1" shift 4 ;; 25|26|27|28|29|30|31|32) route="$2.$3.$4.$5/$1" shift 5 ;; "") break ;; *) $LOG "strange bitmask - $1, skipping" shift 5 continue ;; esac router="$1.$2.$3.$4" shift 4 case "$router" in 0.0.0.0) $LOG "set route to $route via interface $interface" ip route replace $route dev $interface ;; *) $LOG "set route to $route via $router" ip route replace $route via $router ;; esac done fi
в тестах на 600 маршрутов этот код выполняется 0m 1.21s
а с использованием test - 1m 24.03s
чудовещная разница
Уважаемый автор! Хотелось бы выразить глубокую признательность за труд и поднятие очень важной темы.
Пользуются и еще как пользуются. Я например. В Линуксе мало что соображаю но кое что понимаю в программировании, хотел может быть указать на ошибку(всего нашел 2. Вторую исправил только вчера. Была связана с dyndns - в новой версии смотрю она тоже исправлена, а именно добавлен sleep 5) . А вот в скрипте pinger.sh как стояло просто ping так и стоит. Я так понимаю пингер должен пинговать удаленный хост исключительно через заданный интерфейс?
Определение интерфейса для пингования делается так:
interface=`nvram get $1_ifname`
А само пингование происходит следующим образом:
if arping $host1 -c 1 -I $interface > /dev/null 2>&1 || arping $host2 -c 1 -I $interface > /dev/null 2>&1 ; then
Но для того чтобы это работало потребовалось установить пакет arping
ipkg install arping
Или если я чегото не понимаю, поправте меня ?
Логика тут такая. Мы явно задаем маршруты к двум адресам которые считаем тестовыми. Если интерфейс еще не поднят или упал (ppp или для dhcp) то перемаршрутизируем эти адреса на loopback.
Итого так как маршрутизация для хостов задана явно, то выбор source address пойдет согласно таблицы маршрутизации, а записи для хостов /32 имеют больший приоритет. Если интрефейса нет то "тестовые" адреса заручены на loopback и пинговаться через скажем соседний WAN не будут.
Насчет arping - хотелось бы сделать все стандартными средствами.
Второй момент, arping использует arp запросы, естественно немаршрутизируемые. Это не совсем удобно скажем когда у вас dhcp подключение, дефолт гейт отвечает, а дальше в сети провайдера затык. А тестовым адресом назначен хост находящийся за пределами сети сконфигурированной на интерфейсе. То есть линк поднят, байтики к провайдеру бегают, но такой канал логичнее считать "мертвым".
А в случае pptp и pppoe arping вообще не применим - какой же arp на point-to-point интерфейсах?
Last edited by gaaronk; 30-07-2008 at 13:54.
Несмотря на заявление автора, что это не готовый тулкит, я все равно пытаюсь просто завести скрипты Роутер - 500gP 1.9.2.7-7g.
Нужно сделать 2 штуки PPPoE. Для этого я сделал LAN#1 WAN'ом:
К порту LAN#1 подключен ADSL модем от МГТС, на модеме ВЫключен PPPoE (звонит 500gP), IP 172.30.1.1.Code:robocfg vlan 2 ports "1 5t" vlan 0 ports "2 3 4 5t" vconfig add eth0 2 ifconfig vlan2 172.30.1.2 broadcast 172.30.1.255 netmask 255.255.255.0 up
Кстати, нет ли у кого мана на robocfg? Гуглом не нашлось так вот сразу.
Затем добавил это в самое начало /usr/local/sbin/post-boot:
Команда /usr/local/sbin/init_wan.sh в /usr/local/sbin/post-boot осталось.Code:nvram set wan1_testip_1=10.10.70.1 # nvram set wan1_testip_2=2.2.2.2 # wan1 nvram set wan1_ifname=vlan1 nvram set wan1_protocol=pppoe nvram set wan1_pppoe_srv=Starnet_Service # nvram set wan1_pppoe_acn=Concentrator nvram set wan1_pppoe_username=starnet_login nvram set wan1_pppoe_password=starnet_password nvram set wan1_pppoe_extra="holdoff 60" nvram set wan1_pppoe_mtu=1492 nvram set wan1_pppoe_mru=1492 nvram set wan1_pppoe_type=dhcp nvram set wan1_sub_ipaddr_t=10.10.70.78 nvram set wan1_sub_netmask_t=255.255.0.0 nvram set wan1_macaddr_x=0010DCFD451D # nvram set wan_hwaddr_x =00AABBCCDDEE # wan2 nvram set wan2_ifname=vlan2 nvram set wan2_protocol=pppoe nvram set wan2_pppoe_srv=MGTS_ADSL_Service # nvram set wan2_pppoe_acn=ADSL_Modem nvram set wan2_pppoe_username=MGTS****@mgts nvram set wan2_pppoe_password=mgts_password # nvram set wan2_pppoe_extra="nomppe nomppc" nvram set wan2_pppoe_mtu=1492 nvram set wan2_pppoe_mru=1492 nvram set wan2_pppoe_type=dhcp nvram set wan2_sub_ipaddr_t=172.30.1.2 nvram set wan2_sub_netmask_t=255.255.0.0 nvram set wan2_macaddr_x=0010DCFD451D # nvram set wan_hwaddr_x =00AABBCCDDEE # ddns nvram set ddns_username_1=ddnsuser nvram set ddns_passwd_1=ddnspassword nvram set ddns_hostname_wan1=ddnsuser.dyndns.org nvram set ddns_username_2=ddnsuser nvram set ddns_passwd_2=ddnspassword nvram set ddns_hostname_wan2=ddnsuser.dyndns.org
Кстати, если просто выполнить "nvram set" много раз, после ребута переменных - нет в "nvram show".
Затем сделал "wri", выставил IP в 0.0.0.0, "static IP", перегрузил роутер.
После перезагрузки нового vlan'а просто нет, скрипты не запустились.
Линукса не боюсь, но железка ведет себя слегка не так, как я привык с другими линукс-железками, так что вопрос вышли ламерские
запусти его без параметров увидишь описание комманд
проще добавить туда две строки:
/usr/sbin/pppd file /usr/local/etc/ppp/options.ppp0
/usr/sbin/pppd file /usr/local/etc/ppp/options.ppp1
и соответсвенно создать файлы options.ppp0 и options.ppp1 c настройками для каждого pppoe линка
Запустил. Выдало в числе прочего:
1) ASUS WL-500g Deluxe stock config (eth0 is WAN, eth0.1 is LAN):
robocfg switch disable vlans enable reset vlan 0 ports "0 5u" vlan 1 ports "1 2 3 4 5t" port 0 state enabled stp none switch enable
Мои порты на роутере - они 0-1-2-3-4 или 1-2-3-4-5? Если писать "1 2 3 4 5t" - все порты будут "tagged" или только 5-й? А WAN порт - он 0-й или 5-й или 4-й?
А что такое "eth0.1 is LAN"? eth - он либо eth0, либо eth1, а вот это "eth0.1" - я не понимаю.
Нет. Ман - нужен :-)
И держать оба линка поднятыми все время? А авторские скрипты так понимают? Ох блин неохота переписывать все...
Кстати, тут еще вопросы есть.
Сделаю две штуки ppp/options*, запущу 2 демона. Могу сделать скрипт, который в фоне будет переключать гейтвей, но переключать DNS - не могу - не понимаю чем генерится resolv.conf. Точнее, генерится то он pppd'ом, но как поменять его имя?
Last edited by aik; 04-10-2008 at 21:27.
Имеем роутер wl500gP с 2 WAN и соответственно 2 PPPoE. Оба PPPoE подняты, один из них приоритетный и на него сделан дефолтный роутинг (это все мультиван скрипты - http://wl500g.info/showthread.php?t=6208 ).
Теперь хочется один (и только один) комп изнутри LAN запустить на НЕдефолтный PPPoE.
Как это сделать по-дешевле?
По каким ключевым словам это искать?
сделай маршрутизацию по источнику
ip route add default via xx.xx.xx.xx table 202
ip rule add from yy.yy.yy.yy table 202
где xx.xx.xx.xx - недефолтный шлюз , yy.yy.yy.yy - адрес компа
если адрес wan статический то можно прям в post-boot
если динамический то в post-firewall и адрес шлюза придется прочухать