ASUS

Z HKfree wiki
Skočit na navigaci Skočit na vyhledávání

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.

"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.

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í standartní 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.

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.