Warning: Memcache::addserver() expects parameter 2 to be long, string given in /usr/home/rpc/domains/rpc.one.pl/public_html/libraries/joomla/cache/storage/memcache.php on line 84 Ustawienia domyślne konfiguracji przy kompilacji czyli uci-defaults w OpenWrt
 
 
Ustawienia domyślne konfiguracji przy kompilacji czyli uci-defaults w OpenWrt Drukuj Email
Wpisany przez rpc   
wtorek, 19 stycznia 2010 08:33

Ustawienia domyślne konfiguracji przy kompilacji czyli uci-defaults w OpenWrt

 

W routerach przeważnie mamy małą ilość pamięci FLASH w której możemy zmieścić OpenWrt (standardem jest 4MB FLASH co dla OpenWrt jest minimalną ilością pamięci do wgrania). Jedną z metod zaoszczędzenia miejsca w routerze jest skompilowanie OpenWrt jako system plików SquashFS i wgranie do pamięci FLASH naszego urządzenia. SquashFS jest systemem plików o bardzo dużej kompresji jednak jest tylko do odczytu. Alternatywą jest system plików JFFS, który jest systemem plików do zapisu. Uogólniając, różnica to przede wszystkim to, iż w SquashFS zmieścimy więcej pakietów i plików z konfiguracją niż w JFFS. Z racji tego iż SquashFS jest tylko do odczytu aby OpenWrt mógł przechowywać na stałe konfigurację tworzy sobie małą partycję JFFS w której przechowuje wszelkie zmiany. Poprzez uzyskanie bardzo dużej kompresji SquashFS uzyskujemy możliwość spakowania większej ilości pakietów a co za tym idzie dostajemy więcej miejsca na naszą konfigurację w utworzonej automatycznie w czasie pierwszego startu partycji JFFS.

Często chcemy aby po restarcie routera do ustawień domyślnych przywracała się nam konfiguracja, którą sobie przygotowaliśmy - taka podstawowa nasza konfiguracja np. po resecie routera nie tracimy ustawień sieci, haseł, itp. rzeczy. Niestety wiąże się to z wkompilowaniem na stałe tych opcji do pliku OpenWrt w formacie SquashFS. Oczywiście ktoś powie że sobie zrobi kopie tych plików a potem przywróci. Otóż przy SquashFS za każdym razem gdy zmieniamy konfigurację, coś zapisujemy, tworzymy nowe pliki, doinstalowujemy pakiety pomniejsza się automatycznie wielkość partycji JFFS do zapisu. Może się zdarzyć, że po prostu zabraknie na miejsca na nowe rzeczy. A przecież lepiej to umieścić od razu w SquashFS i mieć super skompresowane mając automatycznie więcej wolnego miejsca na partycję JFFS.

Przykładowy rozkład partycji w routerze AG241V2-EU:

root@OpenWrt:~# df
Filesystem           1k-blocks      Used Available Use% Mounted on
rootfs                    1792      1792         0 100% /
/dev/root                 1792      1792         0 100% /rom
tmpfs                     6368        72      6296   1% /tmp
tmpfs                      512         0       512   0% /dev
/dev/mtdblock4            1344       276      1068  21% /jffs
mini_fo:/jffs             1792      1792         0 100% /

Jak powyżej widzimy mamy partycję JFFS zajętą w 21%.

 

Sami wiemy jak dużo czasu zajmuje nam konfiguracja wszystkich ustawień routera od początku. Mamy dwa możliwe rozwiązania tego problemu:

  • Pierwszym jest modyfikacja plików w każdym z pakietów oddzielnie i kompilacja OpenWrt. Nie jest to wygodne ponieważ trzeba pamiętać gdzie co umieściliśmy lub zmieniliśmy. Pół biedy jeśli przekompilowujemy tę samą dystrybucję. Ale jeśli chcemy np. przejść z 8.09.1 na 8.09.2 no to musimy sobie przypomnieć gdzie wprowadzaliśmy nasze zmiany.
  • Drugim jest utworzenie domyślnych konfiguracji naszych pakietów. Umieszczenie w katalogu uci-defaults. Skompilowanie naszej wersji dystrybucji OpenWrt. Teraz jak router uruchomi się po raz pierwszy nasze zmiany zostaną wprowadzone automatycznie. Pliki służące do konfiguracji zostają automatycznie usunięte z JFFS, a otrzymujemy w pełni skonfigurowany router wedle naszych wymagań.

Pierwszy sposób jest mniej pamięciożerny, drugi zaś mniej uciążliwy ponieważ trzymamy wszystko w jednym miejscu i łatwo można przenosić między dystrybucjami nasze konfiguracje oczywiście dostosowując je do danej dystrybucji - jakieś zmiany zawsze mogą wystąpić.

Opiszę tutaj jak korzystać z katalogu uci-defaults w którym będziemy umieszczać nasze konfiguracje w OpenWrt 8.09.2.

Jeśli nie mamy to ściągamy źródła OpenWrt 8.09.2 na dysk

svn co svn://svn.openwrt.org/openwrt/tags/8.09.2/
cd 8.09.2
./scripts/feeds update -a
./scripts/feeds install -a
cd ..

jeśli mamy np. AG241V2-EU przechodzimy do katalogu - w ar7 katalog uci-defaults nie istnieje trzeba go utworzyć ręcznie:

mkdir 8.09.2/target/linux/ar7/base-files/etc/uci-defaults
cd 8.09.2/target/linux/ar7/base-files/etc/uci-defaults

jeśli mamy np. Fonero 2100 przechodzimy do katalogu:

cd 8.09.2/target/linux/atheros/base-files/etc/uci-defaults

Generalnie przechodzimy do katalogu zwracając uwagę na jaką platformę kompilujemy OpenWrt.


Część przykładów będzie specyficzna dla routera AG241V2-EU, większość zaś uniwersalna - proszę na to zwrócić uwagę.

 

Katalog ten jest albo pusty albo coś tam już jest zdefiniowane przez developerów OpenWrt.

Nasze konfiguracje możemy trzymać albo w jednym pliku albo w kilku plikach oddzielnie. Ja preferuje kilka oddzielnych podzielonych na pakiety które wstępnie konfigurujemy sobie.

Wszystkie pliki można pobrać z mojego repozytorium:

 

Tworzymy sobie poszczególne pliki (wybierz dla siebie odpowiednie konfiguracje):

touch firewall
touch firewall.user
touch ipv6adres
touch radvd
touch system
touch updateadd
touch ethers
touch dropbear
touch aiccu
touch network
touch rc.local
touch 89-leds
touch vncrepeater

 

Ja nazwałem sobie pliki tak samo jak nazwa plików konfiguracji ale nie jest to konieczne - nazwa może być dowolna.

Po przeanalizowaniu poniższych plików od razu widać, że konfiguracja to tak naprawdę miszmasz komend UCI OpenWrt oraz zwykłych poleceń bash.

 

uci batch<<EOF
.............
.............
#poszczególne komendy UCI
.............
EOF

Czyli wszystko co znajduje się między znakami EOF jest przetwarzane przez komendę UCI. Zauważ iż nie wstawiam samego słowa UCI pominąłem je bo wysyłam komendy bezpośrednio do UCI poprzez skrypty "batch". reszta poleceń jest analogicznie użyta.

Jeszcze jedno. Poszczególne pakiety mają już jakąś wstępną konfigurację (możesz sprawdzić w źródłach danych pakietów lub na działającym systemie uci show).  Dlatego część komend modyfikujemy poprzez UCI np. set firewall.@defaults[0].input=ACCEPT oznacza że modyfikujemy istniejącą wartość pierwszej reguły łańcucha firewall.default.input - mówi o tym [0] w nawiasie. Część komend dokładamy identycznie jak w działającym systemie za pomocą UCI.

Jeszcze jedno. Tak naprawdę w UCI zawartość nawiasów klamrowych to:
[0] - oznacza, że modyfikujemy pierwszy klucz od góry
[1] - oznacza, że modyfikujemy drugi klucz od góry
[2] - oznacza, że modyfikujemy trzeci klucz od góry
[..]

[-1] - oznacza, że modyfikujemy ostatni klucz od od dołu
[-2] - oznacza, że modyfikujemy przedostatni klucz od dołu
[-..]

 

Dla jasności przykładów podałem całą definicję kluczy w plikach konfiguracyjnych. Jednakże tak naprawdę wystarczy zdefiniować tylko klucze modyfikowane. Czego nie ruszamy nie musimy modyfikować. Przez to skrypty będą szybciej wykonywane i będą mniejsze. W plikach w repozytorium zamieściłem wersje podstawowe/uboższe, czyli to co uważałem za stosowne zmienić. Wpisów niepotrzebnych nie umieszczałem. Można sobie porównać pliki z zawartością tej na stronie.

 

Pozostała część to zwykłe polecenia BASH.

 

Plik firewalls może wyglądać następująco:

#!/bin/sh

uci batch<<EOF

set firewall.@defaults[0]=defaults
set firewall.@defaults[0].syn_flood=1
set firewall.@defaults[0].input=ACCEPT
set firewall.@defaults[0].output=ACCEPT
set firewall.@defaults[0].forward=REJECT

set firewall.@zone[0]=zone
set firewall.@zone[0].name=lan
set firewall.@zone[0].input=ACCEPT
set firewall.@zone[0].output=ACCEPT
set firewall.@zone[0].forward=REJECT

set firewall.@zone[1]=zone
set firewall.@zone[1].name=wan
set firewall.@zone[1].input=REJECT
set firewall.@zone[1].output=ACCEPT
set firewall.@zone[1].forward=REJECT
set firewall.@zone[1].masq=1
set firewall.@zone[1].mtu_fix=1

set firewall.@forwarding[0]=forwarding
set firewall.@forwarding[0].src=lan
set firewall.@forwarding[0].dest=wan

set firewall.@rule[0]=rule
set firewall.@rule[0].src=wan
set firewall.@rule[0].proto=udp
set firewall.@rule[0].dest_port=68
set firewall.@rule[0].target=ACCEPT

add firewall rule
set firewall.@rule[-1].proto=41
set firewall.@rule[-1].target=ACCEPT

add firewall rule
set firewall.@rule[-1].dest_port=3740
set firewall.@rule[-1].target=ACCEPT

add firewall rule
set firewall.@rule[-1].proto=tcp
set firewall.@rule[-1].dest_port=22
set firewall.@rule[-1].target=ACCEPT

add firewall rule
set firewall.@rule[-1].src=wan
set firewall.@rule[-1].proto=ICMP
set firewall.@rule[-1].target=ACCEPT

add firewall redirect
set firewall.@redirect[-1].src=wan
set firewall.@redirect[-1].src_dport=5500
set firewall.@redirect[-1].dest=lan
set firewall.@redirect[-1].dest_ip=192.168.1.2
set firewall.@redirect[-1].dest_port=5500
set firewall.@redirect[-1].proto=tcp

add firewall redirect
set firewall.@redirect[-1].src=wan
set firewall.@redirect[-1].src_dport=8010
set firewall.@redirect[-1].dest=lan
set firewall.@redirect[-1].dest_ip=192.168.1.2
set firewall.@redirect[-1].dest_port=8010
set firewall.@redirect[-1].proto=tcp

add firewall redirect
set firewall.@redirect[-1].src=wan
set firewall.@redirect[-1].src_dport=5004-5100
set firewall.@redirect[-1].dest=lan
set firewall.@redirect[-1].dest_ip=192.168.1.3
set firewall.@redirect[-1].dest_port=5004-5100

add firewall redirect
set firewall.@redirect[-1].src=wan
set firewall.@redirect[-1].src_dport=15000-20000
set firewall.@redirect[-1].dest=lan
set firewall.@redirect[-1].dest_ip=192.168.1.3
set firewall.@redirect[-1].dest_port=15000-20000

set firewall.@include[0]=include
set firewall.@include[0].path=/etc/firewall.user

commit firewall
EOF

exit 0

 

Plik firewalls.user może wyglądać następująco:

#!/bin/sh

cat >> /etc/firewall.user<<EOF

###regulki ipv6

#///////////////////////////////////////////////////////////////////////////////////
#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
# INPUT

ip6tables -F INPUT
ip6tables -P INPUT DROP
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -p icmpv6 -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

ip6tables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
ip6tables -A INPUT -p tcp --dport 1080 -j REJECT --reject-with tcp-reset

#uslugi udostepnione na routerze
ip6tables -A INPUT -p tcp --dport 2122 -m state --state NEW -j ACCEPT
ip6tables -A INPUT -p tcp -i ! sixxs --dport 53 -j ACCEPT


#//////////////////////////////////////////////////////////////////////////////////////
#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
# FORWARD
ip6tables -F FORWARD
ip6tables -P FORWARD DROP
ip6tables -A FORWARD -p icmpv6 -j ACCEPT
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

ip6tables -A FORWARD -p tcp --dport 113 -j REJECT --reject-with tcp-reset

ip6tables -A FORWARD -p tcp --dport 1080 -j REJECT --reject-with tcp-reset

ip6tables -A FORWARD -p tcp --dport 2122 -m state --state NEW -j ACCEPT

#redulki puszczajace ruch z lan do sieci - blokada uslug w lan
ip6tables -A FORWARD -i ! sixxs -j ACCEPT

EOF
exit 0

 

Plik ipv6adres może wyglądać następująco:

#!/bin/sh

cat > /etc/init.d/ipv6adres<<EOF
#!/bin/sh /etc/rc.common

START=98

lista_interfejsow=`uci show network | grep ip6addr | cut -d. -f2`

start() {

for lista in ${lista_interfejsow}
do
ip6adres=`uci show network.${lista}.ip6addr | cut -d= -f 2`
ip6name=`uci show network.${lista}.ifname | cut -d= -f 2`
ifconfig ${ip6name} add ${ip6adres}
done

}
stop() {
for lista in ${lista_interfejsow}
do
ip6adres=`uci show network.${lista}.ip6addr | cut -d= -f 2`
ip6name=`uci show network.${lista}.ifname | cut -d= -f 2`
ifconfig ${ip6name} del ${ip6adres}
done

}

EOF

chmod +x /etc/init.d/ipv6adres
/etc/init.d/ipv6adres enable
/etc/init.d/ipv6adres start

exit0


Plik radvd może wyglądać następująco:

#!/bin/sh

uci batch<<EOF

set radvd.@interface[0]=interface
set radvd.@interface[0].interface=lan
set radvd.@interface[0].AdvSendAdvert=1
set radvd.@interface[0].AdvManagedFlag=0
set radvd.@interface[0].AdvLinkMTU=1280
set radvd.@interface[0].AdvOtherConfigFlag=0
set radvd.@interface[0].ignore=0

set radvd.@prefix[0]=prefix
set radvd.@prefix[0].interface=lan
set radvd.@prefix[0].prefix=2002:7b0:15a:1210::/64
set radvd.@prefix[0].AdvOnLink=1
set radvd.@prefix[0].AdvAutonomous=1
set radvd.@prefix[0].AdvRouterAddr=1
set radvd.@prefix[0].ignore=0

set radvd.@rdnss[0]=rdnss
set radvd.@rdnss[0].interface=lan
set radvd.@rdnss[0].addr=
set radvd.@rdnss[0].ignore=1


commit radvd
EOF
exit 0

 

Plik system może wyglądać następująco:

#!/bin/sh

uci batch<<EOF
set system.@system[0]=system
set system.@system[0].hostname=OpenWrt
set system.@system[0].timezone=CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00

commit system
EOF
exit 0

 

Plik updateadd może wyglądać następująco:

#!/bin/sh

uci batch<<EOF
set updatedd.@updatedd[0]=updatedd
set updatedd.@updatedd[0].service=dyndns
set updatedd.@updatedd[0].username=nazwa_uzytkownika
set updatedd.@updatedd[0].password=haslo
set updatedd.@updatedd[0].host=vpn.dyndns.biz
set updatedd.@updatedd[0].update=1

commit updateadd
EOF
exit 0

 

 

Plik aiccu może wyglądać następująco:

#!/bin/sh

uci batch<<EOF

set aiccu.@aiccu[0]=aiccu
set aiccu.@aiccu[0].username=nazwa_uzytkownika
set aiccu.@aiccu[0].password=haslo
set aiccu.@aiccu[0].protocol=tic
set aiccu.@aiccu[0].server=tic.sixxs.net
set aiccu.@aiccu[0].interface=sixxs
set aiccu.@aiccu[0].tunnel_id=T14913
set aiccu.@aiccu[0].requiretls=0
set aiccu.@aiccu[0].defaultroute=1
set aiccu.@aiccu[0].nat=1
set aiccu.@aiccu[0].heartbeat=1

commit aiccu
EOF
exit 0

 

Plik dropbear może wyglądać następująco:

#!/bin/sh

uci batch<<EOF
set dropbear.@dropbear[0]=dropbear
set dropbear.@dropbear[0].PasswordAuth=on
set dropbear.@dropbear[0].Port=22

commit dropbear
EOF
exit 0


Plik ethers może wyglądać następująco:

#!/bin/sh

cat > /etc/ethers<<EOF
00:16:ea:49:14:fe 192.168.1.2
00:1f:16:00:fe:a3 192.168.1.4
EOF
exit 0

 

Plik network może wyglądać następująco (AG241V2-EU):

#!/bin/sh

uci batch<<EOF
set network.loopback=interface
set network.loopback.ifname=lo
set network.loopback.proto=static
set network.loopback.ipaddr=127.0.0.1
set network.loopback.netmask=255.0.0.0

set network.lan=interface
del network.lan.type=bridge
set network.lan.ifname=eth0
set network.lan.proto=static
set network.lan.ipaddr=192.168.1.1
set network.lan.netmask=255.255.255.0
set network.lan.ip6addr=2002:7b0:15a:1210::1/64
set network.lan.nat=1

set network.wan=interface
set network.wan.ifname=ppp0
set network.wan.unit=0
set network.wan.proto=pppoa
set network.wan.encaps=vc
set network.wan.vpi=0
set network.wan.vci=35
set network.wan.keepalive=5,5
set network.wan.username=rejestracja @ neostrada.pl
set network.wan.password=rejestracja

commit network
EOF
exit 0


Plik rc.local może wyglądać następująco (AG241V2-EU):

#!/bin/sh

cat > /etc/rc.local<<EOF

# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
sleep 5
sh /etc/ppp/ip-down.d/89-leds
sleep 30
ifup wan &

exit 0
EOF
exit 0


Plik 89-leds może wyglądać następująco (AG241V2-EU):

#!/bin/sh

mkdir /etc/ppp/ip-down.d
mkdir /etc/ppp/ip-up.d

cat > /etc/ppp/ip-down.d/89-leds<<EOF
#!/bin/sh
echo default-on > /sys/devices/platform/leds-gpio/leds/status/trigger
echo 2 > /sys/devices/platform/leds-gpio/leds/status/brightness
exit 0
EOF

cat > /etc/ppp/ip-up.d/89-leds<<EOF
#!/bin/sh
echo default-on > /sys/devices/platform/leds-gpio/leds/status/trigger
echo 0 > /sys/devices/platform/leds-gpio/leds/status/brightness
exit 0
EOF

chmod +x /etc/ppp/ip-down.d/89-leds
chmod +x /etc/ppp/ip-up.d/89-leds

exit 0

 

Plik vncrepeater może wyglądać następująco:

#!/bin/sh
cat > /etc/init.d/vncrepeater<<EOF

#!/bin/sh /etc/rc.common

START=98

start() {
vncrepeater 2>/var/log/vncrepeater.log &
}

stop() {
killall vncrepeater
}

EOF

chmod +x /etc/init.d/vncrepater
/etc/init.d/vncrepeater enable
/etc/init.d/vncrepeater start

uci batch<<EOF

add firewall rule
set firewall.@rule[-1].proto=tcp
set firewall.@rule[-1].dest_port=5901
set firewall.@rule[-1].target=ACCEPT

add firewall rule
set firewall.@rule[-1].proto=tcp
set firewall.@rule[-1].dest_port=5501
set firewall.@rule[-1].target=ACCEPT

commit firewall
EOF

exit 0


 

Wszystkie pliki można pobrać z mojego repozytorium:

 

.

svn co svn://svn.openwrt.org/openwrt/branches/8.09


Podziel się tą informacja z innymi:
Poprawiony: sobota, 23 stycznia 2010 23:31