ASUS: Porovnání verzí

Z HKfree wiki
Skočit na navigaci Skočit na vyhledávání
 
(Není zobrazeno 33 mezilehlých verzí od 11 dalších uživatelů.)
Řádek 1: Řádek 1:
 
== Skriptiky/Watchdogy ==
 
== Skriptiky/Watchdogy ==
  
'''Watchdog pro klienta'''
+
=== Watchdog pro klienta ===
  
  #!/bin/sh
+
#!/bin/sh
 
    
 
    
  if ! $(wl bssid > /dev/null 2>&1); then
+
if ! $(wl bssid > /dev/null 2>&1); then
    wl ssid $(nvram get wl0_ssid)
+
  wl ssid $(nvram get wl0_ssid)
   fi
+
fi
 +
Je potřeba ho pravidelně spouštět. Kontroluje jestli je ASUS jako klient správně asociován na AP.
 +
 
 +
 
 +
=== Watchdog pro WAN Port ===
 +
Při používání WAN Portu na Asusu dochází k jeho zasekávání. Bohužel je to neduha tak vymakaného zařízení jakým je Asus. To me donutilo sepsat Watchdog, který hlídá protější stranu. Když začnou narůstat velikostí pingů ( testováno v if (min>7))tak provede nové nastavení FullDuplexu na Wanportu. Pokud uplně stratí protější stranu, tak provede ifconfig down a pak zase up Wanportu. Celý tento skript volám 1x za minutu Cronem.
 +
 
 +
Credits:
 +
* LADA z J-Netu napsal pasáž s AWK
 +
* Kendy finálně doladil Watchdog a udělal logování
 +
 
 +
#!/bin/sh
 +
#
 +
 +
#Zalozit pid
 +
if [ -f /tmp/wandog.pid ]; then
 +
  echo 0 > /dev/null
 +
else
 +
  echo 0 > /tmp/wandog.pid
 +
fi
 +
 +
#nacist obsah
 +
A=`cat /tmp/wandog.pid`
 +
NULA=0
 +
 +
#Nebezi uz ?
 +
if [ "$A" = "$NULA" ]; then
 +
 +
echo 1 > /tmp/wandog.pid
 +
 +
ping -c 2 10.107.0.13|awk '
 +
($3=="from"){
 +
  a=substr($7,6,length($7)-5)
 +
  #print a
 +
}
 +
 +
($1=="round-trip"){
 +
  #round-trip min/avg/max = 40.2/179.6/341.6 ms
 +
  min=substr($4,1,index($4,"/")-1)+0
 +
  #print "min " min
 +
  if (min>7) {
 +
  text="force FD"
 +
  print strftime("%Y-%m-%d %H:%M") " "text >> "/tmp/wandog.log"
 +
  system("et -i eth1 speed 10full")
 +
  }
 +
}
 +
 +
($9=="loss"){
 +
  if ($7=="100%"){
 +
  datum = strftime("%Y-%m-%d %H:%M");
 +
  text = "reset eth1"
 +
  #print "shiiiit, nic nedorazilo :)"
 +
  print strftime("%Y-%m-%d %H:%M") " "text >> "/tmp/wandog.log"
 +
  system("ifconfig eth1 down")
 +
  system("ifconfig eth1 up")
 +
  }
 +
}'
 +
 +
echo 0 > /tmp/wandog.pid
 +
 +
else
 +
  echo "Wandog uz bezi. Koncim" > /dev/null
 +
fi
 +
 
 +
=== Watchdog pro WAN Port - pro Ronju ===
 +
Pokud máme ve WAN portu připojenou ronju, která se vyznačuje nulovým packet lossem za normálních okolností, je ideální, pokud dojde k pádu portu, ho oživit co nejdříve. To vyžaduje časté spouštění skriptu, a proto je potřeba, aby byl skript co nejjednodušší.
 +
Co se týká hlídání velikosti pingů, já jsem vypozoroval, že při maximálním zatížení ronji pingy vylezou někam kolem hodnoty 100ms a zase se vrátí na původní hodnotu, jakmile zatížení ustane, proto pingy tento skript nesleduje.
 +
#!/bin/sh
 +
 +
#pokud existuje FLAG, nelogovat, ze resetujem port
 +
FLAG=/tmp/ronja_dead
 +
#IP adresa protistrany
 +
IP=10.107.0.245
 +
LOG=/tmp/ronjadog.log
 +
 +
ping -q -c 1 $IP > /dev/null
 +
if [ $? -ne 0 ]; then
 +
  et -i eth1 speed 10full
 +
  [ -e $FLAG ] || {
 +
    echo $(date "+%d.%m.%y %H:%M:%S") Resetting eth1 >> $LOG
 +
    touch $FLAG
 +
    }
 +
  else
 +
  [ -e $FLAG ] && {
 +
    echo $(date "+%d.%m.%y %H:%M:%S") eth1 link OK >> $LOG
 +
    rm $FLAG
 +
  }
 +
fi
 +
 
 +
Skript spouštím takto
 +
sh -c "while sleep 2s; do /usr/local/sbin/ronjadog; done"&
 +
Pokud tedy dojde ke spadnutí WAN portu, je oživen v nejhorším případě do 2-3s. V logu je zapsán čas, kdy bylo zjištěno, že port spadl a byl resetován. Obvykle to je taky čas, kdy byl port úspěšně oživen. To se ale testuje až při dalším cyklu (proto se z logu může zdát, že každý výpadek trvá 2-3 sekundy). Pokud ale dojde k delšímu výpadku, je krásně vidět jeho délka. Když dojde k packetlossu na ronje kvůli mlze apod., bude skript resetovat WAN port pokaždé, co se ztratí testovací paket. To ovšem tolik nevadí - během ping floodu z protistrany a resetnutí portu se ztratily 2 pakety o velikosti 56 byte.
 +
 
 +
Skript napsal Lada z JNetu. Od Kendyho jsem převzal příkaz pro oživení portu.
 +
 
 +
=== "Monitoring" sítě ===
 +
Tento skriptík není dokonalý, neumí žádné logování. Je tu od toho, když vypadne internet, aby uživatelé mohli otevřít jednu stránku, kde uvidí, jaký kus trasy je dostupný. Pokud je dostupné alespoň něco, měli by být poučeni, že problém je v jiné oblasti a týká se jiného správce.
 +
 
 +
Nejprve je třeba zprovoznit webserver, návod je dole.
 +
 
 +
Následující skript pingá na d-network, pmw a seznam.cz, upravte dle libosti
 +
 
 +
/usr/local/sbin/inetstats
 +
#!/bin/sh
 +
 +
ping -q -c 4 10.107.3.1 > /dev/null
 +
if [ $? -ne 0 ]; then
 +
  color=red
 +
else
 +
  color=green
 +
fi
 +
first="<font color=$color>d-network</font><br>"
 +
 +
ping -q -c 4 10.107.0.129 > /dev/null
 +
if [ $? -ne 0 ]; then
 +
  color=red
 +
else
 +
  color=green
 +
fi
 +
second="<font color=$color>pmv</font><br>"
 +
 +
ping -q -c 4 212.71.131.225 > /dev/null
 +
if [ $? -ne 0 ]; then
 +
  color=red
 +
else
 +
  color=green
 +
fi
 +
third="<font color=$color>internet</font><br>"
 +
 +
echo $first > /tmp/inetstats.txt
 +
echo $second >> /tmp/inetstats.txt
 +
echo $third >> /tmp/inetstats.txt
 +
 
 +
skript pro www server
 +
/usr/local/web/cgi-bin/inetstats
 +
#!/bin/sh
 +
 +
echo "Content-type: text/html"
 +
echo ""
 +
echo "<HTML>"
 +
# echo "<TITLE>JNet.HKFree.org</TITLE>"
 +
echo "<table width=100% height=100% border=0><tr><td><CENTER>"
 +
# echo "Stav trasy do internetu:"
 +
cat /tmp/inetstats.txt
 +
# echo "<a href=../info.html target=_blank></a>"
 +
echo "</CENTER></td></tr></table>"
 +
echo "</HTML>"
 +
 
 +
Teč už jenom stačí spouštět pravidelně monitorovací skript.
 +
V Olegově firmwaru do post-boot přidejte
 +
watch -n 60 /usr/local/sbin/inetstats&
 +
a v OpenWRT
 +
crontab -e
 +
a přidat řádek
 +
* * * * * /usr/local/sbin/inetstats
 +
 
 +
Pak stačí do prohlížeče zadat vaši IP a cestu /cgi-bin/inetstats. Pokud chcete statistiku nějak pěkně integrovat do vašeho webu, asi nezbyte nic jiného, než šikovně použít frames.
 +
 
 +
=== Zebradog ===
 +
Tenhle skript jsem vytvořil poté, co mi několik uživatelů popisovalo výpadky, které nesly příznaky toho, že zebra ztratila default routu. Tento skript se to pokouší řešit a hlavně píše kdy a na jak dlouho ke ztrátě routy došlo...
 +
#!/bin/sh
 +
 +
GW="10.107.0.129"
 +
 +
ip route | grep -q default || {
 +
  route add default gw $GW
 +
  echo $(date "+%d.%m.%y %H:%M") ROUTE LOST, setting static route >> /tmp/zebradog.log
 +
 +
  while sleep 30s; do
 +
  route del default
 +
  if ip route|grep default>/dev/null;then
 +
    echo $(date "+%d.%m.%y %H:%M") ROUTE RESTORED >> /tmp/zebradog.log
 +
    exit
 +
  else
 +
    echo $(date "+%d.%m.%y %H:%M") ROUTE STILL LOST >> /tmp/zebradog.log
 +
    route add default gw $GW
 +
  fi
 +
   done
 +
}
 +
 
 +
 
 +
=== Maškaráda ===
 +
Pár skriptů, které usnadní maškarádování některých IP do internetu - správce může snadno dočasně povolit internet některému připojenci.
 +
 
 +
* /usr/local/sbin/acc_enable
 +
#!/bin/sh
 +
if [ "$1" != "" ]; then
 +
  iptables -t nat -A POSTROUTING -o eth2 -d 10.107.4.100 -s $1 -j MASQUERADE
 +
  iptables -t nat -A POSTROUTING -o eth2 -d ! 10.107.0.0/16 -s $1 -j MASQUERADE
 +
  echo $1 byl povolen přístup do internetu.
 +
else
 +
  echo "Použití: enable IP.AD.RE.SA"
 +
fi
 +
 
 +
* /usr/local/sbin/acc_disable
 +
#!/bin/sh
 +
if [ "$1" != "" ]; then
 +
  iptables -t nat -D POSTROUTING -o eth2 -d ! 10.107.0.0/16 -s $1 -j MASQUERADE
 +
  iptables -t nat -D POSTROUTING -o eth2 -d 10.107.4.100 -s $1 -j MASQUERADE
 +
  echo $1 byl zakázán přístup do internetu.
 +
else
 +
  echo "Použití: disable IP.AD.RE.SA"
 +
fi
 +
 
 +
* /usr/local/sbin/acc_list
 +
#!/bin/sh
 +
iptables -t nat -L POSTROUTING
 +
 
 +
=== Databáze ===
 +
Možná je tento nadpis trochu nadnesený, ale v podstatě jde o jede soubor, ve kterém je shromaždiště všech potřebných údajů pro generování konfiguráků. Vychází z ní několik mých skriptů.
 +
 
 +
databáze je soubor uložený v /usr/local/root/db
 +
má následující formát:
 +
xx:xx:xx:xx:xx:xx 10.107.3.66 0 013 Lada    Pecho \
 +
xx:xx:xx:xx:xx:xx 10.107.3.67 0 013 TOM      Pecho \
 +
atd...
 +
MAC adresa, IP adresa, maškarádovat, ID, DNS, pravé jméno, lomítko
 +
 
 +
můžeme vytvořit konfiguráky pro DHCP server, DNS server, rychlé dočasné puštění internetu trubkou správce, změna MAC adres...
 +
 
 +
==== dbparse ====
 +
 
 +
#!/bin/sh
 +
 +
db=/usr/local/root/db
 +
tmp=/tmp/tmp
 +
accscript=/usr/local/sbin/acc_script
 +
hosts=/etc/hosts
 +
ethers=/etc/ethers
 +
# OpenWRT
 +
hostsprev=/etc/hosts_tmp
 +
ethersprev=/etc/ethers_tmp
 +
 +
# Oleguv
 +
#hostsprev=/usr/local/etc/hosts_tmp
 +
#ethersprev=/usr/local/etc/ethers_tmp
 +
#hosts2=/usr/local/etc/hosts
 +
#ethers2=/usr/local/etc/ethers
 +
#
 +
 +
echo "#!/bin/sh" > $accscript
 +
echo "iptables -t nat -F POSTROUTING" >> $accscript
 +
 +
chmod +x $accscript
 +
rm $hosts > /dev/null
 +
rm $ethers > /dev/null
 +
cp $hostsprev $hosts > /dev/null
 +
cp $ethersprev $ethers > /dev/null
 +
 +
read db < $db
 +
echo $db > $tmp
 +
 +
while read MAC IP ACC ID DNS NAME rest < $tmp && [ "$MAC" != "" ]; do
 +
  echo $MAC $IP >> $ethers
 +
  echo $IP $DNS.JNet.hkfree.org >> $hosts
 +
  if [ "$ACC" -eq "1" ]; then
 +
    echo "/usr/local/sbin/acc_enable $IP" >> $accscript
 +
  fi
 +
  echo $rest > $tmp;
 +
done
 +
rm $tmp
 +
# Oleguv
 +
# cp $ethers $ethers2
 +
# cp $hosts $hosts2
 +
/usr/local/sbin/acc_script
 +
killall -HUP dnsmasq
 +
Vygeneruje konfiguráky pro dnsmasq. Pro Olegův firmware odstraňte komentáře. Aby se v Olegově firmwaru změny projevily i po rebootu, je potřeba do post-boot přidat:
 +
# backup the original content of /etc
 +
mkdir /etc/bak
 +
cp /etc/* /etc/bak
 +
 +
# copy customized /etc and parse db
 +
cp /usr/local/etc/* /etc
 +
# /usr/local/sbin/dbparse boot
 +
 +
# restart DHCP & DNS
 +
killall dnsmasq
 +
/usr/sbin/dnsmasq -l /etc/linuxigd/dnsmasq.log
 +
V OpenWRT není třeba dělat nic!
 +
 
 +
Aby se zaplo i maškarádování, tak dejte do
 +
post-firewall pro Oleguv firmware, nebo
 +
 
 +
/etc/init.d/S44post-firewall
 +
# process masquerading script
 +
/usr/local/sbin/acc_script
 +
==== cgi-bin/mac ====
 +
Tento skript umožní uživatelům si změnit svou MAC adresu. Je důležité, aby s cizí MAC dostali IP, ze které mohou kontaktovat web server a spustit skript. Ten zkontroluje, jestli je jejich MAC neznámá a jestli mají název počítače nastaven tak, jak mají - to je hlavní identifikátor. tenhle skript neřeší moc bezpečnost, ale spíše pohodlí uživatelů.
 +
 
 +
 
 +
Uložte ho do složky cgi-bin, kde máte web server. V ASUSu ho nahodíte příkazem httpd nebo busybox_httpd.
 +
 
 +
#!/bin/sh
 +
 +
maclog=/tmp/mac.log
 +
tmp=/tmp/tmpmac
 +
# OpenWRT
 +
log=/tmp/dnsmasq.leases
 +
# Oleg
 +
#log=/etc/linuxigd/dnsmasq.log
 +
db=/usr/local/root/db
 +
ethers=/etc/ethers
 +
dbbak=/tmp/dbbak
 +
 +
echo "Content-type: text/plain"
 +
echo ""
 +
 +
if [ "$REMOTE_ADDR" = "" ]; then
 +
  echo Spoustej POUZE pres www rozhrani !!!!
 +
  exit
 +
fi
 +
 +
grep $REMOTE_ADDR $log > $tmp
 +
read TIME MAC IP DNS BADMAC < $tmp
 +
rm $tmp
 +
 +
if [ "$MAC" = "" ]; then
 +
  echo "Vasi aktualni MAC se nepodarilo zjistit, pouzijte DHCP server!"
 +
  echo $(date "+%d.%m.%y %H:%M:%S") $REMOTE_ADDR unknown MAC >> $maclog
 +
  exit
 +
fi
 +
 +
if [ "$DNS" = "*" ]; then
 +
SEARCH=$MAC
 +
else
 +
SEARCH=$DNS
 +
fi
 +
 +
grep -i $SEARCH $db > $tmp
 +
read DBMAC DBIP ACC ID DBDNS DBNAME < $tmp
 +
rm $tmp
 +
 +
if [ "$MAC" = "$DBMAC" ]; then
 +
  echo "Vase MAC adresa $DBMAC je jiz v systemu zanesena."
 +
  echo $(date "+%d.%m.%y %H:%M:%S") $REMOTE_ADDR $MAC $DNS already in db >> $maclog 
 +
  exit
 +
else
 +
#  echo "Vase MAC byla zjistena..."
 +
  NOMAC=1
 +
fi
 +
 +
if $(echo "$DNS" |grep -i -q "$DBDNS"); then
 +
# if [ "$DNS" = "$DBDNS" ]; then
 +
#  echo "Vase PC bylo identifikovano podle jmena."
 +
  IDOK=1
 +
else
 +
  echo "Vas pocitac nelze identifikovat! (Mate spravne nastaveny nazev pocitace?)"
 +
  echo "Nastaveni najdete v sekci \"Pro nove uzivatele\" -> \"Nastaveni pocitace\""
 +
  echo $(date "+%d.%m.%y %H:%M:%S") $REMOTE_ADDR $MAC $DNS name unknown >> $maclog
 +
fi
 +
 +
if [ "$NOMAC" = "1" ] && [ "$IDOK" = "1" ]; then
 +
  sed "s/$DBMAC $DBIP/$MAC $DBIP/" $db > $tmp
 +
  mkdir -p $dbbak
 +
  cp $db $dbbak/$(date +%y.%m.%d_%H:%M:%S)
 +
  cp $tmp $db
 +
  rm $tmp
 +
 +
  sed "s/$DBMAC $DBIP/$MAC $DBIP/" $ethers > $tmp
 +
  cp $tmp $ethers
 +
  rm $tmp
 +
       
 +
  killall -HUP dnsmasq
 +
  echo "Vase MAC adresa sitove karty byla uspesne zanesena do databaze."
 +
  echo "$DBMAC -> $MAC"
 +
  echo "Zmena se projevi do 20 minut."
 +
  echo $(date "+%d.%m.%y %H:%M:%S") $REMOTE_ADDR $MAC $DNS success, old mac was $DBMAC >> $maclog
 +
 
 +
fi
 +
 
 +
=== QoS shaper ===
 +
Poměrně rozsáhlý [[QoS|návod o QoS]] už napsal jezz zde na wiki. Nejdůležitější věci se mi povedlo rozchodit za pomoci martink z JNetu.
 +
 
 +
Na OpenWRT jsme rozchodili prio, sfq, tbf, htb. Esfq se rozchodit nepodařilo.
 +
 
 +
Pokusil jsem se instalaci potřebných patchů co nejvíce zjednodušit. Bude vám stačit, když si do routeru stáhnete skript ''install_shaper.sh'' do flash paměti.
 +
wget http://charon.hkfree.org/~okoun/shaper/install_shaper.sh
 +
chmod +x install_shaper.sh
 +
a přidáte jej do nějakého skriptu, který se bude spouštět po rebootu ASUSe. Install stáhne z charona potřebné .o moduly, načte je, smaže a spustí standardní skript, který používám já. Je založený na skriptu od pavkrize a jezz. Pokud si budete chtí vytvořit vlastní, uložte ho opět někam na flash a upravte install_shaper.sh tak, aby po instalaci modulů spustil váš skript. Doporučuji alespoň zkusit experimentovat s maximálním limitem neznámeho trafficu.
 +
 
 +
V balíčku je nově přidán také skript [http://charon.hkfree.org/~okoun/shaper/htb.sh htb.sh] - musíte si ho ale pro svoji oblast poupravit. Umožňuje dělení se o určitý interface rovným dílem, jsem s ním spokojený ještě více, než s tím předchozím :-)
 +
 
 +
 
 +
=== Zalohovani ===
 +
Takže máte všechno nastavené... no jo, ale co když přijde povodeň, požár, nebo se někdy uklepnete a místo "ls" napíšete "rm -Rf /" a co potom? Samozřejmě, že není problém - kdo zálohuje, ten spí klidně :-)
 +
 
 +
Tento skriptík nahrajte do adresáře cgi-bin ve vašem web serveru v ASUSu. Pojmenujte ho třeba zaloha.tar.gz
 +
#!/bin/sh
 +
 +
cd /
 +
rm /tmp/zaloha.tar.gz > /dev/null
 +
tar czf /tmp/zaloha.tar.gz `find etc usr lib -type f` > /dev/null
 +
 +
echo "Content-type: application/octet-stream"
 +
echo ""
 +
cat /tmp/zaloha.tar.gz
 +
 
 +
A teč když budete chtít zálohovat, tak jednoduše stáhnete soubor cgi-bin/zaloha.tar.gz a je to! Dobrý nápad je udělat nějaký skriptík třeba na charonu a ten dát do crontabu, aby jednou za čas zálohu udělal sám. Pochopitelně můžete zálohovat i jiné adresáře než etc, usr a lib. Parametr -type f slouží k tomu, aby se nearchivovaly symlinky, které jsou v OpenWrt skoro všude, takže se uloží pouze změny, které jste provedli vy.
 +
 
 +
=== AP - wewimo ===
 +
#!/bin/sh
 +
 +
# velmi jednoduchy wewimo pro ASUS wl500b/g by Lada JNet, hkfree.org
 +
# html ozdoby pridal Kendy
 +
# laden pod OpenWrt firmwarem
 +
 +
# pokud neco zlepsite, dejte mi vedet na lada@hkfree.org pripadne kendy@hkfree.org
 +
 +
# verze 14.3.2005 0.32
 +
 +
# zobrazeni nekterych udaju
 +
# 0 - nezobrazi
 +
# 1 - zobrazi
 +
# 2 - vypise IP adresu x.x.x.x, nebo MAC xx:xx:xx:xx:xx:xx
 +
SHOW_MAC="0"
 +
SHOW_IP="1"
 +
SHOW_DNS="1"
 +
 +
# broadcast IP adresa - puzije se ke zjisteni IP neaktivnich HW krabicek
 +
BROADCAST="10.107.3.159"
 +
 +
# tady konci nastavitelne promenne.... dal uz nema cenu cokoliv cist
 +
 +
echo "Content-type: text/html"
 +
echo ""
 +
 +
HN=`uname -n`
 +
echo "&lt;h2>$HN&lt;/h2>&lt;hr>"
 +
echo "&lt;body>&lt;table border=0 cellpadding=0 cellspacing=0>"
 +
echo "&lt;tr>"
 +
 +
if [ "$SHOW_IP" != "0" ]; then echo "&lt;td>&lt;b>IP Adress&lt;/b>&lt;/td>";
 +
fi
 +
 +
if [ "$SHOW_MAC" != "0" ]; then echo "&lt;td>&lt;b>MAC Adress&lt;/b>&lt;/td>";
 +
fi
 +
 +
echo "&lt;td>&lt;b>Signal&lt;/b>&lt;/td>"
 +
 +
if [ "$SHOW_DNS" != "0" ]; then echo "&lt;td align=center>&lt;b>DNS Record&lt;/b>&lt;/td>";
 +
fi
 +
 +
 +
echo "&lt;/b>&lt;/tr>"
 +
 +
# pingnem broadcast, v ARP se snad objevi vsechny MAC a IP HW krabicek
 +
# windowsy na to neodpovidaji
 +
ping -c 1 $BROADCAST >/dev/null
 +
 +
wl assoclist | awk -v SHOW_MAC="$SHOW_MAC" -v SHOW_IP="$SHOW_IP" -v SHOW_DNS="$SHOW_DNS" \
 +
'
 +
BEGIN{
 +
getline <"/proc/net/arp"
 +
while (getline <"/proc/net/arp"){
 +
IP[$4]=$1;
 +
}
 +
close("/proc/net/arp");
 +
}
 +
 +
{
 +
MAC=$2;
 +
"wl rssi "MAC |getline
 +
SIGNAL=$3
 +
IP=IP[MAC];
 +
if (IP=="") {
 +
IP="            ";
 +
DNS="";
 +
}else{
 +
"nslookup " IP" |grep Name:" |getline
 +
DNS=$2
 +
}
 +
if (COL=="1") {printf "&lt;tr>";COL=0}
 +
else {printf "&lt;tr bgcolor=#dddddd>";COL=1}
 +
if (DNS=="") DNS="unknown"
 +
if (SHOW_IP=="1") printf "&lt;td>%s&amp;nbsp;&amp;nbsp;&lt;/td>",IP
 +
if (SHOW_IP=="2"){IP="x.x.x.x";printf "&lt;td>%s&amp;nbsp;&amp;nbsp;&lt;/td>",IP}
 +
if (SHOW_MAC=="1") printf "&lt;td>%s&amp;nbsp;&amp;nbsp;&lt;/td>",MAC
 +
if (SHOW_MAC=="2"){MAC="xx:xx:xx:xx:xx:xx";printf "&lt;td>%s&amp;nbsp;&amp;nbsp;&lt;/td>",MAC}
 +
printf "&lt;td align=right>%sdB&amp;nbsp;&amp;nbsp;&lt;/td>",SIGNAL
 +
if (SHOW_DNS=="1") printf "&lt;td>(%s)&lt;/td>",DNS
 +
printf "&lt;/tr>"
 +
printf "\n"
 +
}
 +
 +
'
 +
echo "&lt;/table>&lt;/body>&lt;hr>"
 +
echo "Version 0.32&amp;nbsp;&amp;nbsp;for HKfree developed by lada [at] hkfree [dot] org. Small hmtl extension by kendy [at] hkfree [dot] org"
  
 
== Oleguv firmware ==
 
== Oleguv firmware ==
 +
Pro základní nastavení použít web rozhraní.
  
 +
Kam přidat vlastní nastavení:
 +
/usr/local/sbin/post-boot
 +
/usr/local/sbin/post-firewall (inicializace iptables)
 +
(u FW starších než 1.8.x.x je místo sbin '''init''')
 +
 +
Pro pravidelné provádění skriptů, stačí do post-boot přidat
 +
watch -n 60 /usr/local/sbin/skript
 +
kde 60 je 60 sekund
  
 
== OpenWrt ==
 
== OpenWrt ==
 +
Pro základní nastavení použít telnet a příkaz setup. Heslo se mění příkazem passwd.
 +
 +
Kam přidat vlastní nastavení:
 +
/etc/init.d/
 +
vlastní skripty pojmenovat jako SXXNazev kde XX je číslo
 +
Jako ekvivalenty k Olegovýmu firmwaru doporučuju
 +
/etc/init.d/S44post-firewall
 +
/etc/init.d/S60post-boot
 +
Ale je to viceméně jedno.
 +
 +
Pro pravidelné spouštění skriptů slouží crontab (nezapomeňte v setupu mezi services přidat ''crond'')
 +
crontab -e
 +
spustí vi editor, řadky mají tento formát:
 +
* * * * * příkaz
 +
kde místo hvězdiček mohou být i čísla oddělené čarkami, nebo rozsah čísel v pomlčkách. Pořadí čísel je minuta (0-59), hodina (0-23), den v měsíci (1-31), měsíc (1-12), den v týdnu (1-7)
  
 +
Pozor! Čas je v OpenWRT posunutý o hodinu dozadu.
  
 
== Samba ==
 
== Samba ==
 +
K čemu? Bude se chovat jako browse master a obsluhovat procházení sítí. Nikdy se pak nestane, že člověk s nahozeným firewallem shodí síť Microsoft.
 +
 +
V '''Olegově firmwaru''' stačí nadefinovat hostname, upravit správně konfigurační soubor /etc/smb.conf
 +
 +
Já používám tento:
 +
[global]
 +
        netbios name = nameserver
 +
        workgroup = JNET
 +
        guest account = nobody
 +
        security = share
 +
        browseable = yes
 +
        guest ok = yes
 +
        guest only = yes
 +
        #log level = 1
 +
        max log size = 100
 +
        encrypt passwords = no
 +
        dns proxy = no
 +
        #wins support = yes
 +
        #wins proxy = yes
 +
        domain master = yes
 +
        os level = 99
 +
        preferred master = yes
 +
 +
hodnotu "netbios name" a pracovní skupinu si nastavte podle své situace. Dále je důležité mít nadefinovaný hostname v routru a mít pro něj správný záznam v /etc/hosts.
 +
 +
V /etc/hosts musíte mít řádek
 +
IP.AD.RE.SA hostname
 +
Oleguv FW by to měl mít automaticky, ale raději to omrkněte. (pokud máte mojí databázi, tak to už neplatí ;))
 +
 +
A pak spustit nmbd a smbd (obojí je kupodivu potřeba pro správné procházaení sítě)
 +
nmbd -D -d 3
 +
smbd -D
 +
parametr -d 3 zapne vypisování logů do
 +
/var/log/
 +
 +
Pozorovali jsme jev, kdy některé XP počítače ze seznamu okolních PC zmizely za 4 hodiny provozu. Po znovuspuštění samby se opět oběvují, proto jsem napsal skript:
 +
 +
/usr/local/sbin/sambakill
 +
#!/bin/sh
 +
 +
killall nmbd
 +
killall smbd
 +
 +
/tmp/nmbd -D -d 3
 +
/tmp/smbd -D -d 3
 +
 +
Ten spouštějte každou půlhodinu tak, že do post-boot přidáte řádku
 +
watch -n 1800 /usr/local/sbin/sambakill
 +
pro OpenWRT otevřít crontab -e a přidat řádek
 +
0,30 * * * * /usr/local/sbin/sambakill
 +
 +
Pro '''OpenWRT''' je nastavení obdobné, ale je potřeba sambu zkompilovat. Díky za to zaslouží martink, protože mi sambu pro OpenWRT zkompiloval on, wiki návod snad bude brzy ;) Binárky mám na charonu. Jak jsem předpokládal, tak se binárky do OpenWRT nevejdou, takže zbývá je po bootu stáhnout do RAM, nebo přechovávat na flashdisku.
 +
 +
vytvořte skript /usr/local/sbin/sambadl
 +
 +
#!/bin/sh
 +
 +
wget -P /tmp http://charon.hkfree.org/~okoun/smb/smbd && \
 +
wget -P /tmp http://charon.hkfree.org/~okoun/smb/nmbd && \
 +
chmod +x /tmp/smbd /tmp/nmbd && \
 +
touch /tmp/samba
 +
 +
if [ ! -e /tmp/samba ]; then
 +
sleep 60
 +
. $0&
 +
else
 +
mkdir /tmp/lock
 +
/usr/local/sbin/sambakill
 +
fi
 +
 +
A třeba do /etc/init.d/S60post-boot přidejte řádku
 +
/usr/local/sbin/sambadl&
 +
takže se skript spustí po bootu a pokusí se stáhnout binárky každou minutu dokuč se to nepovede. Pak vytvoří složku /tmp/lock a sambu spustí.
 +
 +
== Webserver ==
 +
Předpokládejme, že kořenový adresář pro web server je v /usr/local/web. Skripty umisťujte do /usr/local/web/cgi-bin. Nezapomeňte jim dát právo pro spouštění (viz. pozn. dole) a první řádek musí být '''#!/bin/sh'''.
 +
 +
=== Olegův FW ===
 +
Nejprve nastavíme přesměrování portu nového serveru na port 80
 +
do '''post-firewall''' zapíšeme
 +
# allow only localhost (or SSH) HTTP session...
 +
iptables -I INPUT -p tcp --dport 80 -s ! 127.0.0.1 -j DROP
 +
iptables -I INPUT -p tcp --dport 80 -s '''XX.XX.XX.XX''' -j ACCEPT
 +
 +
# redirect from admin pages to public pages
 +
iptables -t nat -A PREROUTING -p tcp -s ! 127.0.0.1 -d '''AA.AA.AA.AA''' --dport 80 -j DNAT --to-destination '''AA.AA.AA.AA:81'''
 +
iptables -t nat -I PREROUTING -d '''AA.AA.AA.AA''' -p tcp --dport 81 -j DROP
 +
Kde místo XX.XX.XX.XX dejte IP adresu klientského počítače, kterým často přistupujete k admin stránkám a místo AA.AA.AA.AA dejte IP adresu, která bude zobrazovat web server. Vzhledem k tomu, že ASUS bude mít určitě alespoň 2 IP adresy, tak adresa XX.XX.XX.XX při otevření jiné IP adresy než je AA.AA.AA.AA zobrazí admin stránky. Z jiné IP se k admin stránkám dá dostat třeba forwardnutím portu 80 přes SSH tunel.
 +
 +
do '''post-boot''' přidáme
 +
busybox_httpd -p 81 -h /usr/local/web
 +
 +
=== OpenWRT ===
 +
do spouštěcího skriptu (např. /etc/init.d/S60post-boot přidáme řádku
 +
httpd -p 80 -h /usr/local/web
 +
A je to.
 +
 +
 +
Poznámka na konec - všechny skripty musejí mít právo se spustit - to se dělá příkazem ''chmod +x skript''.
 +
 +
==Upload firmware==
 +
co delat kdyz nejde ani win klient
 +
 +
tftp.exe -i -v -t60 IP_ASUSE GET ASUSSPACELINK
 +
 +
tftp.exe -i -v -t60 IP_ASUSE PUT firmware.trx ASUSSPACELINK
 +
 +
Asus se rozblika
 +
 +
'''Funkcni upload s atftp''' (v Linuxu)
 +
*atftp
 +
*tftp> connect 192.168.1.1
 +
*tftp> GET ASUSSPACELINK
 +
*tftp> PUT openwrt-brcm-2.4-squashfs.trx ASUSSPACELINK
 +
 +
A hotovo
 +
 +
==Odkazy==
 +
[[ASUS_HW_reset|Jak zresetovat ASUS]]

Aktuální verze z 21. 11. 2007, 07:20

Skriptiky/Watchdogy

Watchdog pro klienta

#!/bin/sh
 
if ! $(wl bssid > /dev/null 2>&1); then
  wl ssid $(nvram get wl0_ssid)
fi

Je potřeba ho pravidelně spouštět. Kontroluje jestli je ASUS jako klient správně asociován na AP.


Watchdog pro WAN Port

Při používání WAN Portu na Asusu dochází k jeho zasekávání. Bohužel je to neduha tak vymakaného zařízení jakým je Asus. To me donutilo sepsat Watchdog, který hlídá protější stranu. Když začnou narůstat velikostí pingů ( testováno v if (min>7))tak provede nové nastavení FullDuplexu na Wanportu. Pokud uplně stratí protější stranu, tak provede ifconfig down a pak zase up Wanportu. Celý tento skript volám 1x za minutu Cronem.

Credits:
* LADA z J-Netu napsal pasáž s AWK
* Kendy finálně doladil Watchdog a udělal logování
#!/bin/sh
#

#Zalozit pid
if [ -f /tmp/wandog.pid ]; then
 echo 0 > /dev/null
else
 echo 0 > /tmp/wandog.pid
fi

#nacist obsah
A=`cat /tmp/wandog.pid`
NULA=0

#Nebezi uz ?
if [ "$A" = "$NULA" ]; then

echo 1 > /tmp/wandog.pid

ping -c 2 10.107.0.13|awk '
($3=="from"){
 a=substr($7,6,length($7)-5)
 #print a
}

($1=="round-trip"){
 #round-trip min/avg/max = 40.2/179.6/341.6 ms
 min=substr($4,1,index($4,"/")-1)+0
 #print "min " min
 if (min>7) {
  text="force FD"
  print strftime("%Y-%m-%d %H:%M") " "text >> "/tmp/wandog.log"
  system("et -i eth1 speed 10full")
 }
}

($9=="loss"){
 if ($7=="100%"){
  datum = strftime("%Y-%m-%d %H:%M");
  text = "reset eth1"
  #print "shiiiit, nic nedorazilo :)"
  print strftime("%Y-%m-%d %H:%M") " "text >> "/tmp/wandog.log"
  system("ifconfig eth1 down")
  system("ifconfig eth1 up")
 }
}'

echo 0 > /tmp/wandog.pid

else
 echo "Wandog uz bezi. Koncim" > /dev/null
fi

Watchdog pro WAN Port - pro Ronju

Pokud máme ve WAN portu připojenou ronju, která se vyznačuje nulovým packet lossem za normálních okolností, je ideální, pokud dojde k pádu portu, ho oživit co nejdříve. To vyžaduje časté spouštění skriptu, a proto je potřeba, aby byl skript co nejjednodušší. Co se týká hlídání velikosti pingů, já jsem vypozoroval, že při maximálním zatížení ronji pingy vylezou někam kolem hodnoty 100ms a zase se vrátí na původní hodnotu, jakmile zatížení ustane, proto pingy tento skript nesleduje.

#!/bin/sh

#pokud existuje FLAG, nelogovat, ze resetujem port
FLAG=/tmp/ronja_dead
#IP adresa protistrany
IP=10.107.0.245
LOG=/tmp/ronjadog.log

ping -q -c 1 $IP > /dev/null
if [ $? -ne 0 ]; then
  et -i eth1 speed 10full
  [ -e $FLAG ] || {
    echo $(date "+%d.%m.%y %H:%M:%S") Resetting eth1 >> $LOG
    touch $FLAG
    }
 else
  [ -e $FLAG ] && {
    echo $(date "+%d.%m.%y %H:%M:%S") eth1 link OK >> $LOG
    rm $FLAG
  }
fi

Skript spouštím takto

sh -c "while sleep 2s; do /usr/local/sbin/ronjadog; done"&

Pokud tedy dojde ke spadnutí WAN portu, je oživen v nejhorším případě do 2-3s. V logu je zapsán čas, kdy bylo zjištěno, že port spadl a byl resetován. Obvykle to je taky čas, kdy byl port úspěšně oživen. To se ale testuje až při dalším cyklu (proto se z logu může zdát, že každý výpadek trvá 2-3 sekundy). Pokud ale dojde k delšímu výpadku, je krásně vidět jeho délka. Když dojde k packetlossu na ronje kvůli mlze apod., bude skript resetovat WAN port pokaždé, co se ztratí testovací paket. To ovšem tolik nevadí - během ping floodu z protistrany a resetnutí portu se ztratily 2 pakety o velikosti 56 byte.

Skript napsal Lada z JNetu. Od Kendyho jsem převzal příkaz pro oživení portu.

"Monitoring" sítě

Tento skriptík není dokonalý, neumí žádné logování. Je tu od toho, když vypadne internet, aby uživatelé mohli otevřít jednu stránku, kde uvidí, jaký kus trasy je dostupný. Pokud je dostupné alespoň něco, měli by být poučeni, že problém je v jiné oblasti a týká se jiného správce.

Nejprve je třeba zprovoznit webserver, návod je dole.

Následující skript pingá na d-network, pmw a seznam.cz, upravte dle libosti

/usr/local/sbin/inetstats

#!/bin/sh

ping -q -c 4 10.107.3.1 > /dev/null
if [ $? -ne 0 ]; then
  color=red
else
  color=green
fi
first="<font color=$color>d-network</font><br>"

ping -q -c 4 10.107.0.129 > /dev/null
if [ $? -ne 0 ]; then
  color=red
else
  color=green
fi
second="<font color=$color>pmv</font><br>"

ping -q -c 4 212.71.131.225 > /dev/null
if [ $? -ne 0 ]; then
  color=red
else
  color=green
fi
third="<font color=$color>internet</font><br>"

echo $first > /tmp/inetstats.txt
echo $second >> /tmp/inetstats.txt
echo $third >> /tmp/inetstats.txt

skript pro www server /usr/local/web/cgi-bin/inetstats

#!/bin/sh

echo "Content-type: text/html"
echo ""
echo "<HTML>"
# echo "<TITLE>JNet.HKFree.org</TITLE>"
echo "<table width=100% height=100% border=0><tr><td><CENTER>"
# echo "Stav trasy do internetu:"
cat /tmp/inetstats.txt
# echo "<a href=../info.html target=_blank></a>"
echo "</CENTER></td></tr></table>"
echo "</HTML>"

Teč už jenom stačí spouštět pravidelně monitorovací skript. V Olegově firmwaru do post-boot přidejte

watch -n 60 /usr/local/sbin/inetstats&

a v OpenWRT

crontab -e

a přidat řádek

* * * * * /usr/local/sbin/inetstats

Pak stačí do prohlížeče zadat vaši IP a cestu /cgi-bin/inetstats. Pokud chcete statistiku nějak pěkně integrovat do vašeho webu, asi nezbyte nic jiného, než šikovně použít frames.

Zebradog

Tenhle skript jsem vytvořil poté, co mi několik uživatelů popisovalo výpadky, které nesly příznaky toho, že zebra ztratila default routu. Tento skript se to pokouší řešit a hlavně píše kdy a na jak dlouho ke ztrátě routy došlo...

#!/bin/sh

GW="10.107.0.129"

ip route | grep -q default || {
 route add default gw $GW
 echo $(date "+%d.%m.%y %H:%M") ROUTE LOST, setting static route >> /tmp/zebradog.log

 while sleep 30s; do
  route del default
  if ip route|grep default>/dev/null;then
   echo $(date "+%d.%m.%y %H:%M") ROUTE RESTORED >> /tmp/zebradog.log
   exit
  else
   echo $(date "+%d.%m.%y %H:%M") ROUTE STILL LOST >> /tmp/zebradog.log
   route add default gw $GW
  fi
 done
}


Maškaráda

Pár skriptů, které usnadní maškarádování některých IP do internetu - správce může snadno dočasně povolit internet některému připojenci.

  • /usr/local/sbin/acc_enable
#!/bin/sh
if [ "$1" != "" ]; then
  iptables -t nat -A POSTROUTING -o eth2 -d 10.107.4.100 -s $1 -j MASQUERADE
  iptables -t nat -A POSTROUTING -o eth2 -d ! 10.107.0.0/16 -s $1 -j MASQUERADE
  echo $1 byl povolen přístup do internetu.
else
  echo "Použití: enable IP.AD.RE.SA"
fi
  • /usr/local/sbin/acc_disable
#!/bin/sh
if [ "$1" != "" ]; then
  iptables -t nat -D POSTROUTING -o eth2 -d ! 10.107.0.0/16 -s $1 -j MASQUERADE
  iptables -t nat -D POSTROUTING -o eth2 -d 10.107.4.100 -s $1 -j MASQUERADE
  echo $1 byl zakázán přístup do internetu.
else
  echo "Použití: disable IP.AD.RE.SA"
fi
  • /usr/local/sbin/acc_list
#!/bin/sh
iptables -t nat -L POSTROUTING

Databáze

Možná je tento nadpis trochu nadnesený, ale v podstatě jde o jede soubor, ve kterém je shromaždiště všech potřebných údajů pro generování konfiguráků. Vychází z ní několik mých skriptů.

databáze je soubor uložený v /usr/local/root/db má následující formát:

xx:xx:xx:xx:xx:xx 10.107.3.66 0 013 Lada     Pecho \
xx:xx:xx:xx:xx:xx 10.107.3.67 0 013 TOM      Pecho \
atd...

MAC adresa, IP adresa, maškarádovat, ID, DNS, pravé jméno, lomítko

můžeme vytvořit konfiguráky pro DHCP server, DNS server, rychlé dočasné puštění internetu trubkou správce, změna MAC adres...

dbparse

#!/bin/sh

db=/usr/local/root/db
tmp=/tmp/tmp
accscript=/usr/local/sbin/acc_script
hosts=/etc/hosts
ethers=/etc/ethers
# OpenWRT
hostsprev=/etc/hosts_tmp
ethersprev=/etc/ethers_tmp

# Oleguv
#hostsprev=/usr/local/etc/hosts_tmp
#ethersprev=/usr/local/etc/ethers_tmp
#hosts2=/usr/local/etc/hosts
#ethers2=/usr/local/etc/ethers
#

echo "#!/bin/sh" > $accscript
echo "iptables -t nat -F POSTROUTING" >> $accscript

chmod +x $accscript
rm $hosts > /dev/null
rm $ethers > /dev/null
cp $hostsprev $hosts > /dev/null
cp $ethersprev $ethers > /dev/null

read db < $db
echo $db > $tmp

while read MAC IP ACC ID DNS NAME rest < $tmp && [ "$MAC" != "" ]; do
  echo $MAC $IP >> $ethers
  echo $IP $DNS.JNet.hkfree.org >> $hosts
  if [ "$ACC" -eq "1" ]; then
    echo "/usr/local/sbin/acc_enable $IP" >> $accscript
  fi
  echo $rest > $tmp;
done
rm $tmp
# Oleguv
# cp $ethers $ethers2
# cp $hosts $hosts2
/usr/local/sbin/acc_script
killall -HUP dnsmasq

Vygeneruje konfiguráky pro dnsmasq. Pro Olegův firmware odstraňte komentáře. Aby se v Olegově firmwaru změny projevily i po rebootu, je potřeba do post-boot přidat:

# backup the original content of /etc
mkdir /etc/bak
cp /etc/* /etc/bak

# copy customized /etc and parse db
cp /usr/local/etc/* /etc
# /usr/local/sbin/dbparse boot

# restart DHCP & DNS
killall dnsmasq
/usr/sbin/dnsmasq -l /etc/linuxigd/dnsmasq.log

V OpenWRT není třeba dělat nic!

Aby se zaplo i maškarádování, tak dejte do post-firewall pro Oleguv firmware, nebo

/etc/init.d/S44post-firewall

# process masquerading script
/usr/local/sbin/acc_script

cgi-bin/mac

Tento skript umožní uživatelům si změnit svou MAC adresu. Je důležité, aby s cizí MAC dostali IP, ze které mohou kontaktovat web server a spustit skript. Ten zkontroluje, jestli je jejich MAC neznámá a jestli mají název počítače nastaven tak, jak mají - to je hlavní identifikátor. tenhle skript neřeší moc bezpečnost, ale spíše pohodlí uživatelů.


Uložte ho do složky cgi-bin, kde máte web server. V ASUSu ho nahodíte příkazem httpd nebo busybox_httpd.

#!/bin/sh

maclog=/tmp/mac.log
tmp=/tmp/tmpmac
# OpenWRT
log=/tmp/dnsmasq.leases
# Oleg
#log=/etc/linuxigd/dnsmasq.log
db=/usr/local/root/db
ethers=/etc/ethers
dbbak=/tmp/dbbak

echo "Content-type: text/plain"
echo ""

if [ "$REMOTE_ADDR" = "" ]; then
  echo Spoustej POUZE pres www rozhrani !!!!
  exit
fi

grep $REMOTE_ADDR $log > $tmp
read TIME MAC IP DNS BADMAC < $tmp
rm $tmp

if [ "$MAC" = "" ]; then
  echo "Vasi aktualni MAC se nepodarilo zjistit, pouzijte DHCP server!"
  echo $(date "+%d.%m.%y %H:%M:%S") $REMOTE_ADDR unknown MAC >> $maclog
  exit
fi

if [ "$DNS" = "*" ]; then
SEARCH=$MAC
else
SEARCH=$DNS
fi

grep -i $SEARCH $db > $tmp
read DBMAC DBIP ACC ID DBDNS DBNAME < $tmp
rm $tmp

if [ "$MAC" = "$DBMAC" ]; then
  echo "Vase MAC adresa $DBMAC je jiz v systemu zanesena."
  echo $(date "+%d.%m.%y %H:%M:%S") $REMOTE_ADDR $MAC $DNS already in db >> $maclog  
  exit
else
#  echo "Vase MAC byla zjistena..."
  NOMAC=1
fi

if $(echo "$DNS" |grep -i -q "$DBDNS"); then
# if [ "$DNS" = "$DBDNS" ]; then
#  echo "Vase PC bylo identifikovano podle jmena."
  IDOK=1
else
  echo "Vas pocitac nelze identifikovat! (Mate spravne nastaveny nazev pocitace?)"
  echo "Nastaveni najdete v sekci \"Pro nove uzivatele\" -> \"Nastaveni pocitace\""
  echo $(date "+%d.%m.%y %H:%M:%S") $REMOTE_ADDR $MAC $DNS name unknown >> $maclog
fi

if [ "$NOMAC" = "1" ] && [ "$IDOK" = "1" ]; then
  sed "s/$DBMAC $DBIP/$MAC $DBIP/" $db > $tmp
  mkdir -p $dbbak
  cp $db $dbbak/$(date +%y.%m.%d_%H:%M:%S)
  cp $tmp $db
  rm $tmp

  sed "s/$DBMAC $DBIP/$MAC $DBIP/" $ethers > $tmp
  cp $tmp $ethers
  rm $tmp
        
  killall -HUP dnsmasq
  echo "Vase MAC adresa sitove karty byla uspesne zanesena do databaze."
  echo "$DBMAC -> $MAC"
  echo "Zmena se projevi do 20 minut."
  echo $(date "+%d.%m.%y %H:%M:%S") $REMOTE_ADDR $MAC $DNS success, old mac was $DBMAC >> $maclog
  
fi

QoS shaper

Poměrně rozsáhlý návod o QoS už napsal jezz zde na wiki. Nejdůležitější věci se mi povedlo rozchodit za pomoci martink z JNetu.

Na OpenWRT jsme rozchodili prio, sfq, tbf, htb. Esfq se rozchodit nepodařilo.

Pokusil jsem se instalaci potřebných patchů co nejvíce zjednodušit. Bude vám stačit, když si do routeru stáhnete skript install_shaper.sh do flash paměti.

wget http://charon.hkfree.org/~okoun/shaper/install_shaper.sh
chmod +x install_shaper.sh

a přidáte jej do nějakého skriptu, který se bude spouštět po rebootu ASUSe. Install stáhne z charona potřebné .o moduly, načte je, smaže a spustí standardní skript, který používám já. Je založený na skriptu od pavkrize a jezz. Pokud si budete chtí vytvořit vlastní, uložte ho opět někam na flash a upravte install_shaper.sh tak, aby po instalaci modulů spustil váš skript. Doporučuji alespoň zkusit experimentovat s maximálním limitem neznámeho trafficu.

V balíčku je nově přidán také skript htb.sh - musíte si ho ale pro svoji oblast poupravit. Umožňuje dělení se o určitý interface rovným dílem, jsem s ním spokojený ještě více, než s tím předchozím :-)


Zalohovani

Takže máte všechno nastavené... no jo, ale co když přijde povodeň, požár, nebo se někdy uklepnete a místo "ls" napíšete "rm -Rf /" a co potom? Samozřejmě, že není problém - kdo zálohuje, ten spí klidně :-)

Tento skriptík nahrajte do adresáře cgi-bin ve vašem web serveru v ASUSu. Pojmenujte ho třeba zaloha.tar.gz

#!/bin/sh

cd /
rm /tmp/zaloha.tar.gz > /dev/null
tar czf /tmp/zaloha.tar.gz `find etc usr lib -type f` > /dev/null

echo "Content-type: application/octet-stream"
echo ""
cat /tmp/zaloha.tar.gz

A teč když budete chtít zálohovat, tak jednoduše stáhnete soubor cgi-bin/zaloha.tar.gz a je to! Dobrý nápad je udělat nějaký skriptík třeba na charonu a ten dát do crontabu, aby jednou za čas zálohu udělal sám. Pochopitelně můžete zálohovat i jiné adresáře než etc, usr a lib. Parametr -type f slouží k tomu, aby se nearchivovaly symlinky, které jsou v OpenWrt skoro všude, takže se uloží pouze změny, které jste provedli vy.

AP - wewimo

#!/bin/sh

# velmi jednoduchy wewimo pro ASUS wl500b/g by Lada JNet, hkfree.org
# html ozdoby pridal Kendy
# laden pod OpenWrt firmwarem

# pokud neco zlepsite, dejte mi vedet na lada@hkfree.org pripadne kendy@hkfree.org

# verze 14.3.2005 0.32

# zobrazeni nekterych udaju
# 0 - nezobrazi
# 1 - zobrazi
# 2 - vypise IP adresu x.x.x.x, nebo MAC xx:xx:xx:xx:xx:xx
SHOW_MAC="0"
SHOW_IP="1"
SHOW_DNS="1"

# broadcast IP adresa - puzije se ke zjisteni IP neaktivnich HW krabicek
BROADCAST="10.107.3.159"

# tady konci nastavitelne promenne.... dal uz nema cenu cokoliv cist

echo "Content-type: text/html"
echo ""

HN=`uname -n`
echo "<h2>$HN</h2><hr>"
echo "<body><table border=0 cellpadding=0 cellspacing=0>"
echo "<tr>"

if [ "$SHOW_IP" != "0" ]; then echo "<td><b>IP Adress</b></td>";
fi

if [ "$SHOW_MAC" != "0" ]; then echo "<td><b>MAC Adress</b></td>";
fi

echo "<td><b>Signal</b></td>"

if [ "$SHOW_DNS" != "0" ]; then echo "<td align=center><b>DNS Record</b></td>";
fi


echo "</b></tr>"

# pingnem broadcast, v ARP se snad objevi vsechny MAC a IP HW krabicek
# windowsy na to neodpovidaji
ping -c 1 $BROADCAST >/dev/null

wl assoclist | awk -v SHOW_MAC="$SHOW_MAC" -v SHOW_IP="$SHOW_IP" -v SHOW_DNS="$SHOW_DNS" \
'
BEGIN{
getline <"/proc/net/arp"
while (getline <"/proc/net/arp"){
IP[$4]=$1;
}
close("/proc/net/arp");
}

{
MAC=$2;
"wl rssi "MAC |getline
SIGNAL=$3
IP=IP[MAC];
if (IP=="") {
IP="            ";
DNS="";
}else{
"nslookup " IP" |grep Name:" |getline
DNS=$2
}
if (COL=="1") {printf "<tr>";COL=0}
else {printf "<tr bgcolor=#dddddd>";COL=1}
if (DNS=="") DNS="unknown"
if (SHOW_IP=="1") printf "<td>%s&nbsp;&nbsp;</td>",IP
if (SHOW_IP=="2"){IP="x.x.x.x";printf "<td>%s&nbsp;&nbsp;</td>",IP}
if (SHOW_MAC=="1") printf "<td>%s&nbsp;&nbsp;</td>",MAC
if (SHOW_MAC=="2"){MAC="xx:xx:xx:xx:xx:xx";printf "<td>%s&nbsp;&nbsp;</td>",MAC}
printf "<td align=right>%sdB&nbsp;&nbsp;</td>",SIGNAL
if (SHOW_DNS=="1") printf "<td>(%s)</td>",DNS
printf "</tr>"
printf "\n"
}

'
echo "</table></body><hr>"
echo "Version 0.32&nbsp;&nbsp;for HKfree developed by lada [at] hkfree [dot] org. Small hmtl extension by kendy [at] hkfree [dot] org"

Oleguv firmware

Pro základní nastavení použít web rozhraní.

Kam přidat vlastní nastavení:

/usr/local/sbin/post-boot
/usr/local/sbin/post-firewall (inicializace iptables)

(u FW starších než 1.8.x.x je místo sbin init)

Pro pravidelné provádění skriptů, stačí do post-boot přidat

watch -n 60 /usr/local/sbin/skript

kde 60 je 60 sekund

OpenWrt

Pro základní nastavení použít telnet a příkaz setup. Heslo se mění příkazem passwd.

Kam přidat vlastní nastavení:

/etc/init.d/
vlastní skripty pojmenovat jako SXXNazev kde XX je číslo

Jako ekvivalenty k Olegovýmu firmwaru doporučuju

/etc/init.d/S44post-firewall
/etc/init.d/S60post-boot

Ale je to viceméně jedno.

Pro pravidelné spouštění skriptů slouží crontab (nezapomeňte v setupu mezi services přidat crond)

crontab -e

spustí vi editor, řadky mají tento formát:

* * * * * příkaz

kde místo hvězdiček mohou být i čísla oddělené čarkami, nebo rozsah čísel v pomlčkách. Pořadí čísel je minuta (0-59), hodina (0-23), den v měsíci (1-31), měsíc (1-12), den v týdnu (1-7)

Pozor! Čas je v OpenWRT posunutý o hodinu dozadu.

Samba

K čemu? Bude se chovat jako browse master a obsluhovat procházení sítí. Nikdy se pak nestane, že člověk s nahozeným firewallem shodí síť Microsoft.

V Olegově firmwaru stačí nadefinovat hostname, upravit správně konfigurační soubor /etc/smb.conf

Já používám tento:

[global]
       netbios name = nameserver
       workgroup = JNET
       guest account = nobody
       security = share
       browseable = yes
       guest ok = yes
       guest only = yes
       #log level = 1
       max log size = 100
       encrypt passwords = no
       dns proxy = no
       #wins support = yes
       #wins proxy = yes
       domain master = yes
       os level = 99
       preferred master = yes

hodnotu "netbios name" a pracovní skupinu si nastavte podle své situace. Dále je důležité mít nadefinovaný hostname v routru a mít pro něj správný záznam v /etc/hosts.

V /etc/hosts musíte mít řádek

IP.AD.RE.SA hostname

Oleguv FW by to měl mít automaticky, ale raději to omrkněte. (pokud máte mojí databázi, tak to už neplatí ;))

A pak spustit nmbd a smbd (obojí je kupodivu potřeba pro správné procházaení sítě)

nmbd -D -d 3
smbd -D

parametr -d 3 zapne vypisování logů do

/var/log/

Pozorovali jsme jev, kdy některé XP počítače ze seznamu okolních PC zmizely za 4 hodiny provozu. Po znovuspuštění samby se opět oběvují, proto jsem napsal skript:

/usr/local/sbin/sambakill

#!/bin/sh

killall nmbd
killall smbd

/tmp/nmbd -D -d 3
/tmp/smbd -D -d 3

Ten spouštějte každou půlhodinu tak, že do post-boot přidáte řádku

watch -n 1800 /usr/local/sbin/sambakill

pro OpenWRT otevřít crontab -e a přidat řádek

0,30 * * * * /usr/local/sbin/sambakill

Pro OpenWRT je nastavení obdobné, ale je potřeba sambu zkompilovat. Díky za to zaslouží martink, protože mi sambu pro OpenWRT zkompiloval on, wiki návod snad bude brzy ;) Binárky mám na charonu. Jak jsem předpokládal, tak se binárky do OpenWRT nevejdou, takže zbývá je po bootu stáhnout do RAM, nebo přechovávat na flashdisku.

vytvořte skript /usr/local/sbin/sambadl

#!/bin/sh

wget -P /tmp http://charon.hkfree.org/~okoun/smb/smbd && \
wget -P /tmp http://charon.hkfree.org/~okoun/smb/nmbd && \
chmod +x /tmp/smbd /tmp/nmbd && \
touch /tmp/samba

if [ ! -e /tmp/samba ]; then
sleep 60
. $0&
else
mkdir /tmp/lock
/usr/local/sbin/sambakill
fi

A třeba do /etc/init.d/S60post-boot přidejte řádku

/usr/local/sbin/sambadl&

takže se skript spustí po bootu a pokusí se stáhnout binárky každou minutu dokuč se to nepovede. Pak vytvoří složku /tmp/lock a sambu spustí.

Webserver

Předpokládejme, že kořenový adresář pro web server je v /usr/local/web. Skripty umisťujte do /usr/local/web/cgi-bin. Nezapomeňte jim dát právo pro spouštění (viz. pozn. dole) a první řádek musí být #!/bin/sh.

Olegův FW

Nejprve nastavíme přesměrování portu nového serveru na port 80 do post-firewall zapíšeme

# allow only localhost (or SSH) HTTP session...
iptables -I INPUT -p tcp --dport 80 -s ! 127.0.0.1 -j DROP
iptables -I INPUT -p tcp --dport 80 -s XX.XX.XX.XX -j ACCEPT

# redirect from admin pages to public pages
iptables -t nat -A PREROUTING -p tcp -s ! 127.0.0.1 -d AA.AA.AA.AA --dport 80 -j DNAT --to-destination AA.AA.AA.AA:81
iptables -t nat -I PREROUTING -d AA.AA.AA.AA -p tcp --dport 81 -j DROP

Kde místo XX.XX.XX.XX dejte IP adresu klientského počítače, kterým často přistupujete k admin stránkám a místo AA.AA.AA.AA dejte IP adresu, která bude zobrazovat web server. Vzhledem k tomu, že ASUS bude mít určitě alespoň 2 IP adresy, tak adresa XX.XX.XX.XX při otevření jiné IP adresy než je AA.AA.AA.AA zobrazí admin stránky. Z jiné IP se k admin stránkám dá dostat třeba forwardnutím portu 80 přes SSH tunel.

do post-boot přidáme

busybox_httpd -p 81 -h /usr/local/web

OpenWRT

do spouštěcího skriptu (např. /etc/init.d/S60post-boot přidáme řádku

httpd -p 80 -h /usr/local/web

A je to.


Poznámka na konec - všechny skripty musejí mít právo se spustit - to se dělá příkazem chmod +x skript.

Upload firmware

co delat kdyz nejde ani win klient

tftp.exe -i -v -t60 IP_ASUSE GET ASUSSPACELINK

tftp.exe -i -v -t60 IP_ASUSE PUT firmware.trx ASUSSPACELINK

Asus se rozblika

Funkcni upload s atftp (v Linuxu)

  • atftp
  • tftp> connect 192.168.1.1
  • tftp> GET ASUSSPACELINK
  • tftp> PUT openwrt-brcm-2.4-squashfs.trx ASUSSPACELINK

A hotovo

Odkazy

Jak zresetovat ASUS