Turning the Buffalo wireless bridge into a firewall

I had an extra wireless bridge (Buffalo WLA2-G54L) lying around and our current firewalling wireless AP (D-Link) was as crappy as can be. It’s probably ok for just surfing and stuff, but for keeping ssh connections open it just didn’t cut it, since it severed tcp connections every now and then. Also it froze every now and then and needed rebooting. So replacing that with a better solution was on the todo list.

The WLA2-G54L is just a wireless bridge – it has no conception of a firewall in it. So time to flash OpenWRT into it. Setting up OpenWRT is a bit of an adventure in itself, but quite a nice one. Internally the Buffalo units contain the actual computer, a wireless radio, and a normal 5-6 port switch. The computer is connected to one of the ports in the switch, and in firewalling models the switch can present all ports as separate interfaces so that one of them can be treated as the WAN port. However, in WLA2-G54L the switch is a bit different and it doesn’t show the ports separately (tried with robocfg, which did not detect the proper model and couldn’t do anything with it).

OK, so how to setup a firewall with just basically one interface, which is connected to a four port switch? Well, I came up with the solution to just use IP based filtering. Better suggestions are welcome. This basically means that I created an alias to the br0 interface (replace with your own public IP, netmask, and gateway):

ifconfig br0:1 123.123.123.123 netmask 255.255.255.000
route add default gw 123.123.123.1

Meanwhile the normal br0 interface is given an IP address in the LAN, say 10.0.0.1. Now you can quite easily separate the WAN from the LAN using IP addresses instead of interfaces. So instead of

WAN=$(nvram get wan_iface)
iptables -A INPUT -i $WAN -j DROP

you’d have

LANIP=$(nvram get lan_ipaddr)
LANNET=$(echo ${LANIP}/8)
NOTLAN=$(echo \! $LANNET)
iptables -A INPUT -s $NOTLAN -j DROP

And so on. The only problem comes when doing DHCP queries, as the client is probably not in the local network to start with. I solved this by using DHCP only in the wireless network, which is on its separate interface. So for wired access you’ll need to manually setup the network parameters. I can live with that. Another option is to carefully allow DHCP queries with a suitable filter command, and by adding extra checks into the DHCP server so it only server those you want it to serve.

So not a perfect solution, but works OK for me. I now have a low-cost wireless AP that I can ssh into, setup pretty much any kind of firewalling with iptables and otherwise configure to my heart’s desire.

Oh yeah, one more thing: when using WPA in the wireless network, you use the nas software as usual. But in the nas init script you need to remove the parameter “-l br0″. nas is proprietary, so there’s not much of an idea what it’s for, but at least in WLA2-G54L I had a problem with WPA connections not working until this parameter was removed. Then everything worked like a charm, as long as you remember that the WPA-PSK key (if you use that) needs to be given in passphrase format, not in hexadecimal (while WEP keys need to be given in hexadecimal). Weird, that.

Surprising results: greylisting gets you off some spam lists

OK, I put up with greylisting for nearly a week, but then got rid of it. Reason? I’m so heavily dependent on speedy delivery of e-mail that I just can’t work with 12 hour delays. Even if greylisting is set for just 10 minute delay periods, most MTAs will wait several hours or even a full day before retrying to send the message. Not good. Too much trouble. Plus some MTAs will send the sender a dangerous looking message stating that there’s some problems with delivery, which gets people agitated. Of course, this only happens once per each person sending mail (in one location), but still it’s too much of a hassle.

But another quite surprising result did occur: the amount of spam I received decreased from 540 spam/day to 440 spam/day. Apparently quite a few spam engines did not like the temporary deny result they got and removed me from their lists. I just talked to my colleague Hans today and he also mentioned that disabling an e-mail account temporarily gets rid of quite a bit of spam. Greylisting achieves the same, without blocking mail from legitimate senders. So maybe enabling greylisting during my holidays and other non-urgent periods would be a good thing…

Giving greylisting another go

Well, my spam/virus amounts have increased already to over 300 per day, and the unfortunate thing is that around 10-20 of them get through SpamAssassin, ClamAV and Bayesian analysis. So I thought I’d retry greylisting, which means that all MTAs that aren’t already known get a rude “temporarily not available”. If they retry their message later, the message is accepted. This blocks most open relays and viral machines, since they only send the messages once and then forget about them.

However, this will only be a small relief, since much of my mail comes from other sites that just forward the mail to my central staging area. And these sites will handle greylisting quite nicely. I’m still planning on adding recipient whitelisting, meaning that any people I’ve sent mail to get an added non-spam bonus when they send mail back to me.

MediaPC:n toinen tuleminen

Technotrendin 2.1 Premium C -malli saapui ja asentui. MythTV:n kuvan puskeminen kortin oman tv-out-liitännän läpi osoittautui jokseenkin työlääksi, joten vaihdoin sujuvasti vdr-ohjelmaan (linvdr), joka ei käytä X:ää lainkaan, vaan vain tv-kortin tv-out-liitäntää.

Kortin kanssa tuli hankittua myös erilliset laajennuskortit, jotka kytkeytyvät kortilla olevaan 10 piikin liittimeen. Ensimmäinen kortti antaa ulos SCART-liittimen, josta siis saa esim. s-video- ja komponenttilähdöt. Toinen kortti antaa ulos koaksiaali- ja optiset digitaaliäänilähdöt. Nämä kortit voi kätevä kolvaaja rakentaa itsekin (ohjeet ovat netissä), mutta ne voi ostaa kohtuuhintaan esim. Akibasta.

Näissä laajennuskorteissa tuli kaksi ongelmaa. Ensimmäinen oli etukäteen tiedossa: SCART- ja äänilaajennukset eivät mahdu suoraan samaan liittimeen yhtäaikaa. Noh, tämä nyt selvisi helposti: äänilaajennuksen johdosta poistetaan liitin, johtojen päitä kuoritaan hieman, päät kieritetään ja sitten tökätään SCART-laajennuksen liittimen vastaaviin reikiin (katso liitinkaavio) alhaaltapäin ja liitin painetaan tv-kortin piikkeihin. Äänilaajennuksessa on vain kolme piuhaa: +5V, maa sekä spdif-signaali. Hyvin toimii. Tai toimii, kunhan se toinen ongelma ratkeaa: tietyissä Technotrendin korteissa tämä J10-liitin on jostain syystä väärinpäin – siis 180 astetta kääntyneenä. Tämän huomaa viimeistään sitten, kun laajennuskortit eivät toimi. Itse ihmettelin tätä vähän pidempäänkin, koska asiasta ei mainittu missään ohjeissa, vaan ainoastaan yhdellä sivulla gif-kuvassa saksankielisessä lisähuomautuksessa. Jep jep. No, kun kerran ostaa halpaa Technotrendiä, on kai turha toivoa käyttäjäystävällisyyttä, kun teknologia kerran on identtinen kalliimpien Hauppaugen korttien kanssa. Mutta nyt toimii. Kuva on kirkas, samoin ääni.

Ja kyllä, full feature -kortin ansiosta voin vanhalla PIII 450MHz:lla nauhoittaa paria kanavaa ja katsoa kolmatta (samasta kanavakimpusta, tietenkin, koska kortteja on (toistaiseksi) vain yksi), prosessorikuorman nousematta yli 10%:n.

MediaPC:n hankinnasta

Tavoite: televisiolähetyksiä vastaanottava, tallentava ja näyttävä laite, johon mahtuu riittävästi nauhoituksia, joka osaa tallentaa nauhoituksia dvd-levyille, streamata/lähettää niitä verkon yli tietokoneille ja jota voi ohjata www-liittymällä.

Ratkaisu: Vanha Pentium III 500 MHz, jossa Debian GNU/Linux, vanha Hauppaugen analoginen tv-viritin sekä MythTV-ohjelmisto.

Eniten säätämistä oli loppujenlopuksi ohjelmisto-RAIDin ja LVM2:n käyttöönotossa. Koska laitteessa oli kolme vanhaa kiintolevyä (40+60+40 GiB), katsoin parhaaksi varautua levyrikkoihin. Sen lisäksi, että smartd valvoo levyjä ja lähettää sähköpostia levyjen alkaessa nikotella, kaikki tärkeä sisältö on kahdennettu ohjelmisto-raidin mirror-toiminnolla. Joka
levyltä on varattu noin 12 GiB osio raidin käyttöön. Ohjelmisto-raid käyttää kahta osiota jatkuvasti ja jommankumman pettäessä ottaa kolmannen käyttöön. Tämä mirroroitu osio, samoin kuin kaikki muut levyosiot, on annettu LVM2:lle fyysisinä osioina. Näistä osioista on rakennettu kaksi levyryhmää, joista toinen käyttää mirroroitua laitetta ja toinen tavallisia levyjä. Mirrorin
päällä oleva levyryhmä on jaettu loogisiin osioihin, jotka sisältävät tavaraa, jota ei voi noin vain generoida uudelleen (/, /home, /var, /usr/local). Ei-mirroroidusta levyryhmästä on jaettu vähemmän kriittiset loogiset osiot (/tmp, /var/cache, /usr, /scratch). Suurin osa levytilasta on annettu /scratch:lle, jonne mythtv:n videot ja kaikki muukin multimedia tallennetaan.

Isoin vaiva oli root-osion sijoittaminen raid-lvm2-osiolle. Lopulta homma hoituu suhteellisen helposti: kerneliin käännetään staattisesti mukaan raid- ja lvm-toiminnot (MD, DM, RAID*) sekä initrd-tuki. Tämän jälkeen tehdään tarvittava initrd-image sopivalla apuohjelmalla (lvm2create_initrd) ja homma alkaa jo pelittää.

MythTV:n heittäminen sisään on sinänsä aika suoraviivaista, mutta analogivirittimen kanssa kannattaa varata esille kanavien viritystiedot, sillä ne joutuu käsin syöttämään järjestelmään.

500 MHz:n PIII riittää analogisyötteenkin tallentamiseen varsin kivasti – televisiosignaali tallennetaan RTjpeg-codecilla, joka on erittäin kevyt käyttää (se vaatii ehkä 60-80% koneen tehoista), mutta joka toisaalta syö levytilaa iloiset 8 gigatavua tunnissa. Onneksi MythTV:n voi säätää ajamaan heti nauhoituksen jälkeen transkoodaus, jossa RTjpeg muunnetaan MPEG-4:ksi, joka vie kohtuulliset noin 1 gigatavua tuntia kohti (säädettävissä vapaasti tiukemmaksikin, jos kuvanlaadulla ei ole niin väliä). Tällä kokoonpanolla puolen tunnin ohjelman transkoodaus vie reilun tunnin.

Television katsominen suoraan media-PC:ltä ei onnistu, koska signaalin tallentaminen RTjpeginä syö sen verran tehoja, että signaalin purkaminen ja skaalaaminen ruudulle menee yli koneen kapasiteetin. Mutta netin yli toiselta koneelta katsottuna (eli frontend asennettuna toiselle koneelle) tehot riittävät hyvin.

Kunhan saan hankittua Digi-TV-virittimen, on transkoodaus jo turhaa ja prosessorikuormaa ei tule näinkään paljoa, kun lähetykset ovat valmiiksi MPEG-2-muodossa ja voidaan suoraan vain tallentaa levylle.

Software Suspend 2 on Linux 2.6.x

Software Suspend 2 is a nice system to completely hibernate your computer without need for ACPI or APM. Here are the steps needed to make it work:

  1. Get the correct version of the system from http://www.suspend2.net matching your kernel version.
  2. Get the kernel source and configure it for you, compile and setup, making sure it works.
  3. Run the apply script of the SS2 you downloaded. On 2.6.11 Debian there’s one network interface driver that isn’t present but is in the patch set that is applied. Skip that file and everything should work out.
  4. Reconfigure the kernel, selecting Software Suspend 2 from the power control section.
  5. Compile and install the kernel.
  6. Download the matching hibernate script from www.suspend2.net and set it up. Done.

Printing on both sides of the paper

Assuming your printer is a proper PostScript capable device, it’s enough to say
lpr -o DuplexNoTumble file.ps

to get a double sided printout, with flipping on the long edge, which is
probably what you want. If you need to flip on the short edge, the option is
“DuplexTumble”. So there.

Java ja Firefox

Olipas tässäkin hieman hommaa. Java-plugin toimii lopulta siten, että hakee
Sunin sivuilta J2SE 1.4.2 RE:n tar.gz-version, purkaa sen sopivaan paikkaan
(esim /usr/local/java.sun/), linkittää plugin-alikansiosta löytyvän
kirjaston /usr/lib/mozilla-firefox/plugins/-kansioon ja käynnistää Firefoxin
uudelleen. Presto!

Aiemmat yritykset Blackdownin Javalla (1.4.0) ja Sunin RPM-versiolla ei
tuottaneet hyviä tuloksia (edellinen ei toiminut, jälkimmäinen kaatoi
selaimen).

Wings Z6 ja Linux

Wings Z6 myydään ilman Windowsia, mikä on Linux-käyttäjälle hyvä juttu. Ja
palaset ovat sen verran standardeja, että Linuxin saa toimimaan suhteellisen
kivuttomasti. Kyseessä on todellisuudessa muuten Asus M3000N. Tätä tietoa
tarvitsee, kun netistä etsii tietoa läppärin toiminnoista.

Sekä Knoppix että Debianin tavallinen asennuslevy tunnistavat
automaattisesti kiintolevyn, näytönohjaimen, prosessorin, dvd-aseman,
kosketuslevyn, USB 1.1:n, USB 2.0:n, FireWiren sekä verkkokortin. Ainakin
kerneliä 2.6.8 käytettäessä.

Seuraavat palaset vaativat vähän lisätyötä:

WLAN-sovittimena on Intelin IPW2200. Versio 2100 on jo kernelissä 2.6
mukana, mutta tätä uudempaa ei ole. Mutta sen saa haettua osoitteesta
http://ipw2200.sourceforge.net. Firmware-palaset asennetaan hotplug-ohjelman
varastoon ja moduulit vaan ladataan. Kun Linuxin Wireless Extensions on
asennettu, pääsee WLAN-piirteitä säätämään, mutta sinänsä moduulien
lataaminen riittää kortin aktivoimiseksi eth2-tunnuksella.

LCD-näyttö tarjoaa luonnostaan vain resoluution 1024×768, mikä on hölmöä,
koska näytön todellinen tarkkuus on 1400×1050. Ongelma on se, että
näytönohjaimen BIOSiin on tallennettu vain tietty joukko näyttötiloja, ja ne
pari tarpeellisinta puuttuvat. No ei se mitään – apu on
855resolution-ohjelma, jonka saa osoitteesta
http://perso.wanadoo.fr/apoirier/. Ohjelma vain käännetään ja sitten
korvataan VBIOSista pari turhaa näyttötilaa tarvituilla, eli ainakin minun
tapauksessani:

855resolution 5c 1400 1050
855resolution 58 1280 960

Ja sitten on vain XF86Config-4:ssä kerrottava, että halutaan käyttää
resoluutiota “1450×1050″. Hyvin pyyhkii.

Virransäästö on myös oma lukunsa. ACPI toimii kyllä todella hyvin ja
acpid:llä on kiva rakennella skriptejä, jotka reagoivat kannen sulkemiseen,
akun irrotteluun, virtalähteen kytkemiseen tai erikoisnappeihin (Fn+F?? sekä
viisi erillistä nappulaa näppäimistön ulkopuolella). Valitettavasti
standby-tila ei vain toiminut oikein. Ehkäpä ACPI on sarjassa “buginen”.
Toimii Windowsissa kyllä, kun oikeat ajurit yms. on asennettu, mutta Linux
kaatuu.

Vaan eipä hätää! Software Suspend 2 -projekti hoitaa homman kotiin:
http://softwaresuspend.berlios.de/. Hakee sieltä patchin kerneliin 2.4 tai
2.6, patchaa kernelin, ajaa “make menuconfig” ja kääntää software suspend
2:n päälle (ilman acpi-tukea!) ja kääntää uuden kernelin. Samoilta sivuilta
voi myös hakea hibernate-skriptin ja asentaa sen. Itse säädin acpid:n
ajamaan hibernate-komennon standby:n sijaan. Hieman kestää pidempään kuin
tavallinen standby, mutta toisaalta virrankulutus on tasan 0. Toimii kuin
junan vessa, kunhan muistaa ajaa yllä mainitun näytönohjaimen
BIOS-päivityksen aina resume-vaiheessa – siis /etc/hibernate/hibernate.conf:

OnResume 86 855resolution 5c 1400 1050
OnResume 86 855resolution 58 1280 960

Ionin käyttöä

On se vaan myönnettävä, että yksinkertainen on kaunista. Kyllä tämä Ionin
ikkunointi on sen verran toimiva, että ihan oikeasti taitaa aikaa säästyä,
kun ei tarvitse ikkunoita säädellä käsipelillä.

KDE:n ja Gnomen jälkeen kaipailin kuitenkin jonkinlaista sessionhallintaa.
Eli lähtien vaikka siitä, että Ionin dock latautuisi niillä samoilla
ohjelmilla automaattisesti. No pikaviritelmähän on jotain tämän näköistä:

~/.xsession:

display -window root Debian-background.png
bin/ion-dock.sh &
exec ion3

~/bin/ion-dock.sh:

sleep 10
wmtime &
wmweather+ &
wmspaceweather &
wmsysmon &
wmfire &
wmxmms &
wmix &

Lyhyesti sanottuna siis forkataan taustalle tuo ion-dock.sh, jossa 10
sekunnin odottelun jälkeen käynnistetään kaikki dock-sovelmat taustalle
pyörimään. Viive siksi, että ion3 ehtii käynnistyä ja sovelmilla on paikka,
johon latautua.