Photos and other rants

Meny Stäng

Sida 3 av 61

Gone to Tallinn / Vi far till Tallinn

We are going to Tallinn for a cruise over the weekend. Be back in business on Monday again, but if you should need to get hold of me, use my private number in the weekend as I am leaving the work phone at home.

Vi reser till Tallinn på en kryssning över helgen. Återkommer måndag morgon igen men om du behöver få tag i mig, använd min privata telefon eftersom jag kommer lämna arbetstelefonen hemma.




IP-Tables control of traffic by Country

Recently I have had quite a few bouts with people trying all sorts of nefarious things with my VPS from various places in the world. I realized the best way is to take whole countries out of the equation and I wanted to make this a nice easy way of doing this.

First of all, I soon realized that I needed to be a little bit restrictive but since some of the domains that runs on the server is probably legitimately accessed I wanted to divide all countries up in three categories:

0 – No restrictions
1 – Restricted access, basically just allowing ICMP and http on port 80
2 – Complete blocking, drop all packets

So countries in the 0 class would be Sweden and all countries where there is a reasonable legal system and where I have not yet seen too many attempts on the security from. Class 1 would be places like Russia, where there are legit traffic but also a lot of crap coming from and Class 2 would be china where there is likely no legit traffic and still a lot of attempts on the security.

First of all, you need to get hold of a zone file divided on country by country. This is also called a CIDR file (Classless Internet Domain Routing) where all the IP blocks assigned on an international level are put in the right file. You can find this here. Just download the file with all the blocks in and keep it somewhere. You may want to refresh this now and then, say on a montly basis or so.

I am assuming you already have an iptables script file and that you are just looking at adding this functionality. Open the script file and add the following to it

# Loop over all lists of banned networks
# Any rules below this will not work on these ranges as they will
# drop before they reach any other rule. If you want to open some ports
# even for banned countries, then you need to put those rules in front
# of this rule!
echo "Kill line certain CIDR, one way of blocking suspect countries!"
for f in /etc/iptables/banned-hosts/*
  echo "Processing k-line file $f..."
  while read p
    $IPTABLES -A INPUT -s $p -j CBLK
  done < $f

This script should be placed before any rules that will allow any traffic what so ever!

After this part you place the rules that allows any traffic you wish to allow from the restricted countries and then you place this after those rules:

# Restricted hosts here from CIDR files in the restricted session
# these guys will only be able to do ICMP and http, nothing else
# and that should be quite a few countries
echo "Restrict line certain CIDR, one way of blocking suspect countries!"
for f in /etc/iptables/restricted-hosts/*
  echo "Processing r-line file $f..."
  while read p
    $IPTABLES -A INPUT -s $p -j CBLK
  done < $f

Now you should create the following directories:

sudo mkdir /etc/iptables
sudo mkdir /etc/iptables/banned-hosts/
sudo mkdir /etc/iptables/restricted-hosts/

Explode the file you downloaded with all the IP Blocks in country by country into the /etc/iptables/banned-hosts/ directory and you should get a bunch of files called af.zone, al.zone and so on. Each of these referrs to a ISO 2 letter country code.

Do not run the iptables script at this point. Start by removing the file for your own country. In my case that would be se.zone for Sweden. Your mileage may vary here. Refer to this page if you do not know the country codes (which are the same as these countries internet domains).

Delete the files that you do not wish to impose any restrictions on.

Move the files for the countries you want to restrict to the /etc/iptables/restricted-hosts/ dir.

Anything remaining when you are done in the /etc/iptables/banned-hosts/ will be denied access when you run your iptables script.

So run the script now, it may take some time.

When you are done run the command iptables-save > /etc/iptables/tables to save your iptables then add the line in /etc/rc.local or some other similar place iptables-restore < /etc/iptables/tables in order to automatically load your tables on boot time.

Full example

echo "### IP-tables ###"


echo "Default policies."

echo "Flushing old rules"

echo "Create LOGDROP chain"
$IPTABLES -A LOGDROP -j LOG --log-prefix "IPT: DROP " --log-level 7

echo "Create LOGACCEPT chain"
$IPTABLES -A LOGACCEPT -j LOG --log-prefix "IPT: ACCEPT " --log-level 7

echo "Create INVALIDDROP chain"
$IPTABLES -A INVALIDDROP -j LOG --log-prefix "IPT: INVALID " --log-level 7

echo "Killfile certain IP chain"
$IPTABLES -A BANNED -j LOG --log-prefix "IPT: BANNED " --log-level 7

echo "Create a country block chain"
$IPTABLES -A CBLK -j LOG --log-prefix "IPT: CBLK " --log-level 7

# Loop over all lists of banned networks
# Any rules below this will not work on these ranges as they will
# drop before they reach any other rule. If you want to open some ports
# even for banned countries, then you need to put those rules in front
# of this rule!

echo "Kill line certain CIDR, one way of blocking suspect countries!"
for f in /etc/iptables/banned-hosts/*
 echo "Processing k-line file $f..."
  while read p
    $IPTABLES -A INPUT -s $p -j CBLK
  done < $f

echo "Enabling ICMP"

echo "Enabling http on standard port"
$IPTABLES -A INPUT  -p tcp --dport http -m state --state NEW         -j LOGACCEPT
$IPTABLES -A INPUT  -p tcp --dport http -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport http -m state --state ESTABLISHED -j ACCEPT

# Restricted hosts here from CIDR files in the restricted session
# these guys will only be able to do ICMP and http, nothing else
# and that should be quite a few countries

echo "Restrict line certain CIDR, one way of blocking suspect countries!"
for f in /etc/iptables/restricted-hosts/*
 echo "Processing r-line file $f..."
  while read p
    $IPTABLES -A INPUT -s $p -j CBLK
  done < $f

echo "Dropping invalid packets"

echo "Enabling DNS server connections."
$IPTABLES -A INPUT  -p tcp --sport domain -j ACCEPT
$IPTABLES -A INPUT  -p udp --sport domain -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport domain -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport domain -j ACCEPT

echo "Enabling NTP server connections."
$IPTABLES -A INPUT  -p udp --sport 123 -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 123 -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 123 -m state --state NEW         -j LOGACCEPT

echo "Applying rules for inbound and outbound ssh"
$IPTABLES -A INPUT  -p tcp --dport gopher -m state --state NEW         -j LOGACCEPT
$IPTABLES -A INPUT  -p tcp --dport gopher -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport gopher -m state --state ESTABLISHED -j ACCEPT

$IPTABLES -A INPUT  -p tcp --sport gopher -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport gopher -m state --state NEW         -j LOGACCEPT
$IPTABLES -A OUTPUT -p tcp --dport gopher -m state --state ESTABLISHED -j ACCEPT

echo "Applying rules for outbound ssh standard port"
$IPTABLES -A INPUT  -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 22 -m state --state NEW         -j LOGACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT

echo "Enabling https traffic out from this machine"
$IPTABLES -A INPUT  -p tcp --sport 443  -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT  -p tcp --sport 443  -m state --state NEW         -j LOGACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443  -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443  -m state --state NEW         -j LOGACCEPT

echo "Dropping all other input packets."

echo "Done."

echo "IPV6 setting policy"

/sbin/ip6tables -P INPUT DROP
/sbin/ip6tables -P OUTPUT DROP
/sbin/ip6tables -P FORWARD DROP

echo "IPV6 flushing tables"

/sbin/ip6tables -F

echo "IPV6 Done."

Vanliga kaffetermer

Caffé Americano

Kan liknas vid bryggkaffe men det stämmer inte helt. Det har en annan crema och rundare smak men utomlands är det väl det närmaste svensken kommer ”en kopp kaffe”.

Café au Lait

Görs på starkt svart kaffe och sedan tillsätts varm mjölk. Blandningsförhållandet är lika delar kaffe som mjölk. Mjölken värms i panna och skummas ej.

Caffé Latte

En kopp espresso blandas med varm mjölk utan skum. Den troligen populäraste kaffedrycken på café i dag. Blandningsförhållandet är 1 kopp espresso och ungefär dubbla mängden varm mjölk.

Caffé Cortado

En liten kopp espresso med varm mjölk. Blanda 1/2 espresso med lika mycket varm mjölk.

Caffé Mocha

Oftast en caffe latte med lite choklad. 1 del espresso blandas med 2 delar mjölk och sedan tillsätts 1/2 del drickchoklad.


Görs som en Latte egentligen men med mjölkskum på toppen. 1 del espresso, 1 del varm mjölk 1 del mjölkskum.


En chokladdryck med skummad mjölk på toppen i stället för grädde.


Betyder dubbel. En Doppio Espresso är en dubbel espresso helt enkelt.

Latte Macciato

Ångad mjölk med en espresso som hälls genom mjölkskummet. Lika delar mjölkskum och espresso.


En lungo är en lång espresso, ungefär dubbla mängden vatten.


En kopp vanligt bryggkaffe med ett skott espresso tillsatt.


En ristretto är en kort espresso med ungefär 2/3 vatten. Serveras i något mindre kopp och kännetecknas av en kraftig arom.

Felaktiga antaganden programmerare gör om namn

(Shamelessly appropriated from this article and expanded upon and swedified.)

I nästan alla sammanhang förekommer det att man skall fylla i sitt namn i olika system. Dessa system är skrivna och baserade på ett antal antaganden, många av dessa antaganden är ofta helt felaktiga men vi är så vana vid att det skall se ut på ett visst sätt att vi inte tänker på att utmana våra antaganden.

Som alla vet, antaganden leder ofta till grova fel i program, det är bättre att man kontrollerar hur det bör vara. Här har jag sammanställt en lista på vanligt antaganden runt just namn som programmerare bör vara observanta på och se till att försöka undvika åtminstone de värsta fällorna.

  1. En människa har endast ett korrekt namn
  2. En människa har ett fullständigt namn som de kallas
  3. En människa har, just nu, ett fullständigt namn
  4. En människa har ”n” antal namn (för valfritt värde på ”n”)
  5. En människa har ett riktigt namn och kanske ett eller flera smeknamn
  6. En människas namn ryms inom ett visst antal tecken
  7. En människas namn ändras inte
  8. En människas namn ryms på en rad
  9. En människas namn har mer än ett tecken, glyf eller symbol
  10. En människas namn kan ändras, men bara vid vissa tillfällen
  11. Ett förnamn/efternamn/mellannamn etc har inga mellanrum
  12. En människas namn kan uttryckas med ASCII-tecken
  13. En människas namn uttrycks bara inom en viss teckenuppsättning
  14. En människas namn kan alltid uttryckas inom ramen för Unicode
  15. En människas namn är känsligt för teckenskift (stora/små bokstäver)
  16. En människas namn är inte känsligt för teckenskift
  17. En människas namn har ibland prefix eller suffix men man kan strunta i dem
  18. En människa har bara ett prefix till sitt namn (ex. herr, doktor, esq. osv)
  19. En människas namn innehåller inte siffror
  20. En människas namn skrivs inte med BARA VERSALER
  21. En människas namn är inte skrivet enbart med gemener
  22. En människas namn har en särskild ordning, om två system ordnar namnen efter samma algoritm kommer namnen i båda systemen vara identiska
  23. En människas förnamn och efternamn är aldrig likadana
  24. En människa har ett efternamn, familjenamn eller släktnamn eller dylikt som känns igen av dennes släktingar
  25. En människas namn är globalt unikt
  26. En människas namn är nästan globalt unikt
  27. En människas namn är i alla fall tillräckligt unikt att det inte finns miljoner andra med samma namn
  28. Mitt system kommer aldrig behöva hantera kinesiska namn
  29. …eller japanska, koreanska, singalesiska, engelska, svenska, botswana eller klingonska eller på urdu, fenicianska eller …
  30. Åtminstone personer inom samma etniska grupp har en samsyn på hur namn uttrycks
  31. En människa får sitt namn vid födseln
  32. En människa får sitt namn strax efter födseln
  33. En människa får sitt namn inom 1, 5, 10 … år efter födseln
  34. En människa skriver in sitt namn likadant i två olika system
  35. En människas namn innehåller inga skiljetecken annat än apostrofer
  36. En människas namn är det som skattemyndigheten har registrerat
  37. En människas namn är det som står i folkbokföringen
  38. En människa har ett förnamn
  39. En människa har ett efternamn
  40. En människa har ett namn


Jo men det är härligt när kollektivtrafiken löper som den skall. När den inte gör det är det för jävligt snarare och i dag var en sådan dag. Det har tagit mig närmare 3 timmar från Kallhäll till Hammarby sjöstad och det gick till på följande sätt:

  1. Pendeltågen inställda och sedan försenade på grund av signalfel, här förlorade jag 40 minuter ungefär. Eftersom det inte finns mycket alternativ är det bara att vänta.
  2. Kom till Stockholm centralstation men det var tydligen växelfel eller liknande på gröna linjen, återvände till pendeltåget för att ta nästkommande till södra station i stället och därifrån ta buss 74 till Sickla kaj. Tappade ca 30 minuter.
  3. Kom till Södra station och kom ut på busstorget, ca 12 minuter till nästa 74. Då inträffar en bussbrand som gör att man drar in hållplatsen. Går ner till Södra station igen, kommer en ny pendel, hoppar på den till Årstaberg där man normalt kan ta tvärbanan. Tappade ca 30 minuter
  4. Tvärbanan är inställd så det är ersättningsbuss som gäller. Första bussen som skyltas kommer inte öht. När den väl kommer tar den rundlig tid på sig tills den når Sickla kaj till slut. Tappad tid ca 20 minuter.

I normalfallet tar resan ca 50 minuter.

Jag tar nog bilen ett tag.

Perfection in a little box

Look at this thing that hold 6 soda or beer cans with a specially designed ice pack that keeps them cool in the box the whole day. Is it not just perfection in a little box? Found in Swedish Biltema the other day by a friend.

six cans box

Netflix under Ubuntu 14.04

Det går utmärkt att köra Netflix under Ubuntu Linux 14.04 exempelvis. Har ingen anledning att tvivla på att det inte skulle fungera på andra varianter av Linux heller.

Netflix har ingen officiell applikation för Linux och det går inte köra i den vanliga webläsaren oavsett vad du kör eftersom det kräver en plattform som inte finns för Linux nämligen Microsoft Silverlight. Men Linux är ju förstås vänligt att hacka och det finns folk som har tagit fram en Silverlightemulator mm och projektet heter  Pipelight vilket löser det mesta åt en. Det är troligen det enklaste sättet att få in något som kan spela Silverlight och projektet Pipelight verkar fungera bra även om det är i betastadiet fortfarande.

Installera pipelight genom följande kommandon:

sudo apt-add repository ppa:pipelight/stable
sudo apt-get update
sudo apt-get install pipelight-multi

Därefter så skall vi slå på och konfigurera Silverlight:

sudo pipelight-plugin --enable silverlight

Därefter installerar vi själva netflixapplikationen som egentligen körs i Wine (en windowsemulator under Linux):

sudo apt-get install netflix-desktop

Nu när det är installerat kan du öppna unity och skriva Netflix eller så och köra.  Första gången kommer Wine säga att det saknas ett antal komponenter men den kommer också installera dem åt dig om du svarar att du vill det och om allt går väl skall du snart ha en Netflix på din Ubuntu och kunna njuta av alla filmer och tv-serier.


Du behöver förstås fortfarande ett abonnemang hos Netflix, det löser vi inte med några kommandon inte :) Jag har precis provkört det på min Ubuntu 14.04 och det fungerar helt klockrent. Se till också att du har uppdaterade drivrutiner för ditt grafikkort så det kan nyttja 2D-acceleration så kommer det gå bra. Min maskin jag provkört på är inget fartvidunder, Nvidia 9700 och Dual Core-2 Duo men det rullar på helt ok.


Are you looking for something light weight but still has the most important features you get from a full-blown Emacsen in your system? Then you can try some clones of MicroEmacs or uEmacs which will usually work for most editing needs. No dependencies and works out of the box even in small projects and suitable for things like Raspberry Pi or other such stuff.

For Ubuntu you may want to go here to find a debian packaged ready to use package or the full source as needed:



Samba does not start on boot in my Linux

Remember you can always check the status of samba using the commands

# service smbd status
# service nmbd status

I found that they where running and started as they should but still did not accept connections. The bind interfaces in my samba.conf file is the interfaces rather than the ip address but it does not seem to solve the problem. However restarting samba did solve the problem and I nailed it down to the ”Samba IP sensitivity problem”.

Samba really does not like when you use DHCP for the server and even if you set it up so that it always gets the same IP from the DHCP server it does not matter, Samba does not like it.

The simple solution to this is to add the two following lines to the last part of /etc/rc.local which is the script that runs last upon boot.

service smbd restart
service nmbd restart

However, also changing your networking setup to fixed IP generally works well, this is in case you do not want to do that or can’t do that.

Another way would be to change it to the dhcp lease script so when the samba server gets a new lease, an automatic restart of the related daemons happen. However, that would also interrupt any service being served at the moment and break long file transfers or streams. I would therefore advice against it.

The best solution so far is to use a fixed IP. The above workaround is a kludge. You have been warned.