пятница, 12 ноября 2010 г.

Новый скрипт

скрипт, сделаный и протестеный мною только что
#!/bin/sh -v
LOGIN_INT="***"
PASSW_INT="***"
LOGIN_LAN="***/local"
PASSW_LAN="***"
VLAN="***"
DNS3=192.168.1.1
DNS1=10.152.195.41
DNS2=8.8.8.8

#jdem, poka router progruzit vse svoi servisy
sleep 3

#podnimaev VLAN esli nyzhno########
if [ -n 'ifconfig |grep ${VLAN}' ]; then
ifconfig ${VLAN} up
sleep 1
fi

#ochischaem marshruty
iptables -t nat -F POSTROUTING

#-----------------------------------------------
#Sozdanie failov(configov) podklyuchenii
################################################
echo "plugin /usr/lib/rp-pppoe.so
nic-${VLAN}
noccp
nomppc
noipdefault
noauth
defaultroute
noaccomp
nobsdcomp
nodeflate
nopcomp
nomppe
user '${LOGIN_INT}'
password '${PASSW_INT}'
default-asyncmap
mtu 1492
mru 1492
unit 0
persist
maxfail 0
holdoff 30
lcp-echo-interval 10
lcp-echo-failure 5" > /tmp/int.pppoe

echo "plugin /usr/lib/rp-pppoe.so
nic-${VLAN}
noccp
nomppc
noipdefault
noauth
nodefaultroute
noaccomp
nobsdcomp
nodeflate
nopcomp
nomppe
user '${LOGIN_LAN}'
password '${PASSW_LAN}'
default-asyncmap
mtu 1492
mru 1492
unit 1
persist
maxfail 0
holdoff 30
lcp-echo-interval 10
lcp-echo-failure 5" > /tmp/loc.pppoe

#-----------------------------------------------
#Sozdaem fail, podnimayuschii soedinenie s internetom,
#i propisyvayuschii marshrutizaciyu
################################################
echo '#!/bin/sh -v
#podnimaet soedinenie
pppd file /tmp/int.pppoe
#Pishem marshrutizaciyu
WLAN_SUBNET=192.168.1.0/24
iptables -t nat -I POSTROUTING -s ${WLAN_SUBNET} -o ppp0 -j MASQUERADE
' > /tmp/run_int.sh
#-----------------------------------------------

#-----------------------------------------------
#Sozdaem fail, podnimayuschii soedinenie s lokalkoi,
#ojidayuschii ustanovlenie soedineniya, propisyvayuschii
#marshrutizaciyu i otkryvayuschii porty
################################################
echo '#!/bin/sh -v
#podnimaet soedinenie
pppd file /tmp/loc.pppoe
#ojidanie ustanovleniya soedineniya
i=0
while [ -n `ifconfig |grep ppp1` ] && [ $i -le 500 ]; do
let i=$i+3
sleep 3
done
#Pishem marshrutizaciyu
WLAN_SUBNET=192.168.1.0/24
LAN_SUBNET=10.152.0.0/16
OPEN_PORT=12312
OPEN_PORT_2=12313
LOCAL_CLIENT=192.168.1.100
LOCAL_CLIENT_2=192.168.1.101

iptables -t nat -I POSTROUTING 2 -s ${WLAN_SUBNET} -d ${LAN_SUBNET} -o ppp1 -j MASQUERADE
ip ro add ${LAN_SUBNET} dev ppp1
# ip ro flush cache

iptables -t nat -I PREROUTING -p tcp --dport ${OPEN_PORT} -i ppp1 -s ${LAN_SUBNET} -j DNAT --to-destination ${LOCAL_CLIENT}:${OPEN_PORT}
iptables -t nat -I PREROUTING -p udp --dport ${OPEN_PORT} -i ppp1 -s ${LAN_SUBNET} -j DNAT --to-destination ${LOCAL_CLIENT}:${OPEN_PORT}
iptables -t nat -I PREROUTING -p tcp --dport ${OPEN_PORT_2} -i ppp1 -s ${LAN_SUBNET} -j DNAT --to-destination ${LOCAL_CLIENT_2}:${OPEN_PORT_2}
iptables -t nat -I PREROUTING -p udp --dport ${OPEN_PORT_2} -i ppp1 -s ${LAN_SUBNET} -j DNAT --to-destination ${LOCAL_CLIENT_2}:${OPEN_PORT_2}

' > /tmp/run_loc.sh
#-----------------------------------------------

#Delaem faily ispolnyaemymi
chmod +x /tmp/run_int.sh
chmod +x /tmp/run_loc.sh

#Startuem skripty soedinenii
/tmp/run_int.sh
/tmp/run_loc.sh

sleep 3

#-----------------------------------------------
#propisovaem DNS
################################################
nvram set wan_dns="$DNS1 $DNS2 $DNS3"
echo "nameserver $DNS1" >/tmp/resolv.dnsmasq
echo "nameserver $DNS2" >>/tmp/resolv.dnsmasq
echo "nameserver $DNS3" >>/tmp/resolv.dnsmasq
echo "address=/torrent.dml/10.152.195.95
address=/taunt.local/10.152.203.3
address=/decker.local/10.152.196.50
address=/radio.local/10.152.205.167
address=/cat.dsl/10.152.203.3
address=/forum.local/10.152.205.139
address=/img.local/10.152.195.4
" >>/tmp/dnsmasq.conf
pr="$(ps|awk '/dnsmasq/ {print $1}')"
kill -9 $pr
dnsmasq --conf-file=/tmp/dnsmasq.conf


#-----------------------------------------------
#Sozdaem fail, proveryayuschii nalichie marshruta
#k lokalke. Reconnect route control block.
################################################
echo '#!/bin/sh
LAN_SUBNET=10.152.0.0/16
if [ -n `ip ro|grep ${LAN_SUBNET}` ]; then
ip ro add ${LAN_SUBNET} dev ppp1
fi' > /tmp/loc.ip-up

#Delaem fail ispolnyaemym i dobavlyaem na
#zapusk kajdye 2 minuty v cron
chmod +x /tmp/loc.ip-up
echo "*/2 * * * * root /tmp/loc.ip-up" >> /tmp/cron.d/cron_jobs

#Blok dlya pravil'noi raboty cron
/usr/bin/killall -9 cron
/bin/rm /tmp/cron.d/check_ps
/bin/touch /tmp/cron.d/check_ps
/usr/sbin/cron

# ifconfig
# ip ro
# iptables -t nat -n -L
# Copyright dE1l v 2.0

Известные проблемы - при реконекте отваливается маршрут ip ro add ${LAN_SUBNET} dev ppp1
Из подводных камней - если не работает ДНС - проверьте /tmp/dnsmasq.conf на наличие записей вида address=/
Если их нет, значит скрипт сработал быстрей, чем загрузился дефолтный dnsmasq демон роутера. Выход - увеличить sleep перед прописыванием dns.

4 комментария:

  1. на мой взгляд, скрипт достаточно простой и стабильный. Не работает только локалка после реконекта. Всё остальное - ок.

    Для обхода - можно прикрутить проверку наличия маршрута через крон. Она будет достаточно простая.. Вообщем подумаю.

    ОтветитьУдалить
  2. опять велосипед через cron?
    1. используй jffs
    1.0 Создай загрузочный файл, который будет производить все настройки системы один раз, параметры для подключения ему можно передать с помощью атрибутов.
    1.1 Создай шаблон файла для подключения ppp соединения.
    1.1.0 Создаешь для каждого подключения отдельную папку
    1.1.1 Копируешь туда шаблоный файл подключения
    1.1.2 Изменяешь его допустим через sed либо чем-то другим.
    1.1.3 Создаешь файл ip-up и ip-down, если они не сработают, то можно написать демон, который проверяет состояние подключение и поднимает маршрут. Также сюда можно указать донастройку iptables либо убрать ее в скрипты .startup и .wanup
    1.2 Автоподключение делаешь через скрипты .startup, если у тебя все-таки отрабатывается .wanup, то подключение ставить через него.
    1.3 ddns лучше сделать через вэб морду. Не надо будет его перезапускать каждый раз.

    ОтветитьУдалить
  3. да делал я всё эт. именно так и хотел. и практически готовый скрипт уже есть.. но я напаролся на неработающий ip-up и пришлось искать другие враианты. Не представляешь как обидно =(

    нравится текущий вариант нем, что он мега прост! поставил прошивку. сунул в команд стартап скрипт и всё заработало! некаких лишних телодвижений!

    на счёт крона.. да. огород. но, скорей маленький участочек. там получится всего ~4 строки скрипта (проверить наличие маршрута, если нет - прописать). он будет очень простым.
    из минусов - локалка будет оставаться нерабочей <= времени вызова крона(имхо не очень критично, всётаки это локалка а не инет) + дополнительная нагрузка на роутер работой крона(мелочи)

    из плюсов - добавить в текущий работающий скрипт 10 строчек - и всё будет работать как надо = простота

    воротить через jffs и ipup
    да, идеологически решение красивое и правильное. И я именно так и хотел..
    Но, я попробую еще раз сегодня заставить работать ipup в /tmp/ppp/
    если не полуится - окончательно откажусь от этой идеи.

    ОтветитьУдалить
  4. итак, я доделал его, через cron. Скрипт рабочий, реконект тоже.

    ОтветитьУдалить