Disable VPN default gateway on Mac OS X

Recently, I’ve been having some trouble getting my VPN connections to work the way I wanted them to on my Mac OS X Tiger machine. In most situations, when you connect to a virtual private network, it’s only logical you become a full member of that network, with access to all of its resources. In real life, this is not always the case, since, for example, allowing a user to use the network’s gateway causes unnessecary strain on the internet connection, but worse: it allows the user access to any resources the gateway has access to. While this might not always be desirable, our universe has actually disallowed it, thus leaving us no choice but to block it in the firewall.

Windows users have a checkbox “use default gateway on remote network” for this purpose. The VPN tunnel will then only be used for traffic to that subnet, not for all outgoing traffic. Us Mac users are not so fortunate, since such a feature does not exist in the internet-connect utility. However it is possible. It simply requires some knowledge of the point-to-point daemon (pppd).

Update: Actually, it turns out this checkbox does exist in Mac OS X and it is much easier to use than the method I describe below. See the revisit of this post for details. I have left the original method below, as some of you might find it useful.

This is how it works:

Before setting up a VPN tunnel, ppp first checks /etc/ppp/peers/ for a file matching the connection name, in my case “IA-VPN”. If it exists, its contents are read before ppp goes on to the next file: /etc/ppp/ip-up, which is executed directly after the tunnel is set-up. Before I give you a short howto on turning this into your advantage, let’s see exactly where it goes wrong by looking at a dump created by the command “route monitor”:

got message of size 124 on Thu Jan 12 16:13:13 2006
RTM_DELETE: Delete Route: len 124, pid: 522, seq 1, errno 0, flags:<GATEWAY,HOST,DONE,WASCLONED>
locks:  inits: 
sockaddrs: <DST,GATEWAY>
 eendhoven.ewi.utwente.nl 192.168.0.1

got message of size 140 on Thu Jan 12 16:13:13 2006
RTM_ADD: Add Route: len 140, pid: 522, seq 1, errno 0, flags:<UP,GATEWAY,HOST,DONE,STATIC>
locks:  inits: 
sockaddrs: <DST,GATEWAY,NETMASK>
 eendhoven.ewi.utwente.nl 192.168.0.1 broadcasthost

got message of size 112 on Thu Jan 12 16:13:13 2006
RTM_IFINFO: iface status change: len 112, if# 7, flags:<PTP,MULTICAST>

got message of size 112 on Thu Jan 12 16:13:13 2006
RTM_IFINFO: iface status change: len 112, if# 7, flags:<PTP,RUNNING,MULTICAST>

got message of size 112 on Thu Jan 12 16:13:13 2006
RTM_IFINFO: iface status change: len 112, if# 7, flags:<PTP,RUNNING,MULTICAST>

got message of size 80 on Thu Jan 12 16:13:18 2006
RTM_NEWADDR: address being added to iface: len 80, metric 0, flags:
sockaddrs: <NETMASK,IFP,IFA,BRD>
 255.0.0.0 ppp0 10.10.3.5 10.10.3.1

got message of size 124 on Thu Jan 12 16:13:33 2006
RTM_ADD: Add Route: len 124, pid: 0, seq 0, errno 0, flags:<UP,HOST>
locks:  inits: 
sockaddrs: <DST,GATEWAY>
 10.10.3.1 10.10.3.5

got message of size 144 on Thu Jan 12 16:13:33 2006
RTM_ADD: Add Route: len 144, pid: 522, seq 1, errno 0, flags:<UP,DONE,STATIC>
locks:  inits: 
sockaddrs: <DST,GATEWAY,NETMASK>
 10.0.0.0 ppp0 255.0.0.0

got message of size 112 on Thu Jan 12 16:13:33 2006
RTM_IFINFO: iface status change: len 112, if# 7, flags:<UP,PTP,RUNNING,MULTICAST>

got message of size 128 on Thu Jan 12 16:13:33 2006
RTM_DELETE: Delete Route: len 128, pid: 44, seq 22, errno 0, flags:<GATEWAY,DONE,STATIC,PRCLONING>
locks:  inits: 
sockaddrs: <DST,GATEWAY,NETMASK>
 default 192.168.0.1 default

got message of size 160 on Thu Jan 12 16:13:33 2006
RTM_ADD: Add Route: len 160, pid: 44, seq 23, errno 0, flags:<UP,GATEWAY,DONE,STATIC>
locks:  inits: 
sockaddrs: <DST,GATEWAY,NETMASK,IFP>
 default 10.10.3.1 default ppp0

got message of size 160 on Thu Jan 12 16:13:33 2006
RTM_DELETE: Delete Route: len 160, pid: 44, seq 24, errno 3, flags:<UP,CLONING,STATIC>
locks:  inits: 
sockaddrs: <DST,GATEWAY,NETMASK,IFP>
 base-address.mcast.net localhost 240.0.0.0 lo0

got message of size 68 on Thu Jan 12 16:13:33 2006
RTM_DELMADDR: multicast group membership removed from iface: len 68, 
sockaddrs: <GATEWAY,IFP,IFA>
 1.0.5e.0.0.fb en0:0.11.24.36.d4.5e 224.0.0.251

got message of size 68 on Thu Jan 12 16:13:33 2006
RTM_NEWMADDR: new multicast group membership on iface: len 68, 
sockaddrs: <GATEWAY,IFP,IFA>
 1.0.5e.0.0.fb en0:0.11.24.36.d4.5e 224.0.0.251

As you can clearly see in the bold part, the default route is deleted from our routing table, and replaced by the address of the remote network’s gateway which, unfortunately, is blocked in the remote firewall.

Fortunately, ppp has an option called “nodefaultroute” for disabling this step in the process. This is how my peer file looks:

/etc/ppp/peers/IA-VPN:

# Disable setting the default route to this tunnel
nodefaultroute

# The ipparam option is passed to ip-up and ip-down scripts as the sixth parameter
ipparam IA-VPN

The nodefaultroute option does exactly the same as the checkbox on Windows. We, however, are not running Windows, and can do a lot more. To show how, we pass the name of this connection on to the ip-up and ip-down scripts. There, we can use this parameter to add custom actions and logging to different connections, like I do below:

/etc/ppp/ip-up:

#!/bin/sh
`/etc/ppp/upscripts/$6 >> /var/log/ppp-$6.log 2>&1`
/etc/ppp/ip-up:

#!/bin/sh
`/etc/ppp/downscripts/$6 >> /var/log/ppp-$6.log 2>&1`

Now ppp will go and look for a file called IA-VPN in the upscripts and downscripts directories upon connecting and disconnecting from the virtual private natwork “IA-VPN”. Don’t forget all of these files should be owned and executable by root.

Now we can define custom routes and other actions by editing the up- and downscripts. I didn’t really need to mess with route anymore, but I liked fancy logging, so this is what I did:

/etc/ppp/upscripts/IA-VPN:

#!/bin/sh
# Say something interesting to demonstrate the logfile
echo `date` "$0: UP";
echo `/sbin/ifconfig | grep -A 1 ppp`;

# Add VPN-specific actions for bringing the connection up here
/etc/ppp/downscripts/IA-VPN:

#!/bin/sh
# Log the time of disconnection
echo `date` " $0: DOWN";
echo;

# Add VPN-specific actions for bringing the connection down here

All set! As you can see when monitoring the route table, the gateway no longer gets messed up on connecting to the VPN:

got message of size 124 on Thu Jan 12 16:07:50 2006
RTM_DELETE: Delete Route: len 124, pid: 499, seq 1, errno 0, flags:<GATEWAY,HOST,DONE,WASCLONED>
locks:  inits: 
sockaddrs: <DST,GATEWAY>
 eendhoven.ewi.utwente.nl 192.168.0.1

got message of size 140 on Thu Jan 12 16:07:50 2006
RTM_ADD: Add Route: len 140, pid: 499, seq 1, errno 0, flags:<UP,GATEWAY,HOST,DONE,STATIC>
locks:  inits: 
sockaddrs: <DST,GATEWAY,NETMASK>
 eendhoven.ewi.utwente.nl 192.168.0.1 broadcasthost

got message of size 112 on Thu Jan 12 16:07:50 2006
RTM_IFINFO: iface status change: len 112, if# 7, flags:<PTP,MULTICAST>

got message of size 112 on Thu Jan 12 16:07:50 2006
RTM_IFINFO: iface status change: len 112, if# 7, flags:<PTP,RUNNING,MULTICAST>

got message of size 112 on Thu Jan 12 16:07:50 2006
RTM_IFINFO: iface status change: len 112, if# 7, flags:<PTP,RUNNING,MULTICAST>

got message of size 80 on Thu Jan 12 16:07:55 2006
RTM_NEWADDR: address being added to iface: len 80, metric 0, flags:
sockaddrs: <NETMASK,IFP,IFA,BRD>
 255.0.0.0 ppp0 10.10.3.8 10.10.3.1

got message of size 124 on Thu Jan 12 16:07:59 2006
RTM_ADD: Add Route: len 124, pid: 0, seq 0, errno 0, flags:<UP,HOST>
locks:  inits: 
sockaddrs: <DST,GATEWAY>
 10.10.3.1 10.10.3.8

got message of size 144 on Thu Jan 12 16:07:59 2006
RTM_ADD: Add Route: len 144, pid: 499, seq 1, errno 0, flags:<UP,DONE,STATIC>
locks:  inits: 
sockaddrs: <DST,GATEWAY,NETMASK>
 10.0.0.0 ppp0 255.0.0.0

got message of size 112 on Thu Jan 12 16:07:59 2006
RTM_IFINFO: iface status change: len 112, if# 7, flags:<UP,PTP,RUNNING,MULTICAST>

got message of size 68 on Thu Jan 12 16:07:59 2006
RTM_DELMADDR: multicast group membership removed from iface: len 68, 
sockaddrs: <GATEWAY,IFP,IFA>
 1.0.5e.0.0.fb en0:0.11.24.36.d4.5e 224.0.0.251

got message of size 68 on Thu Jan 12 16:07:59 2006
RTM_NEWMADDR: new multicast group membership on iface: len 68, 
sockaddrs: <GATEWAY,IFP,IFA>
 1.0.5e.0.0.fb en0:0.11.24.36.d4.5e 224.0.0.251

And we have nice logging of VPN activity in /var/log/ppp-IA-VPN.log:

/var/log/ppp-IA-VPN.log:

Thu Jan 12 17:04:32 CET 2006 /etc/ppp/upscripts/IA-VPN: UP
ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1396 inet 10.10.3.8 --> 10.10.3.1 netmask 0xff000000
Thu Jan 12 17:05:22 CET 2006 /etc/ppp/downscripts/IA-VPN: DOWN

All of this was done on Mac OS X Tiger 10.4.4.

Eetstokjes

Ik ben niet zo’n fan van fastfood. Goed, het is goedkoop, maar om daarvoor nu kleffe hamburgers, slappe friet en waterige cola als maaltijd te nemen is het mij over het algemeen niet waard. Nu zit hier al een tijdje zo’n “Wok2Go” tent, waar je een beetje McDonald’s style wok spul kunt eten: je bestelt wat van een verlicht bord boven een overwegend TL-verlichte toonbank en dat wordt dan direct voor je gewokt en binnen een minuut staat er een heerlijk geurig kartonnen doosje voor je neus te dampen. Dat alles voor een eurootje of vijf.

Vandaag ben ik daar dan eindelijk eens wat gaan eten met Mark en Remko. Daar stond ik dan: zojuist waren mijn vijf euro (of eigenlijk die van Mark, want ik was vergeten te pinnen) over de toonbank gegaan in ruil voor een portie pittig rundvlees met bami en nu stond ik voor de onvermijdelijke keuze: mes en vork of eetstokjes? Ik had nog nooit met eetstokjes gegeten, dus de goedkope snackbarvorkjes waren de meest veilige keuze. Vanuit het andere bakjes keken mij twee houten stokjes aan, lonkend, avontuurlijk. “Ach, waarom ook niet, behalve de koks is het toch leeg, dus niemand ziet hoe ik zit te prutsen.” dacht ik, en ik pakte één paar eetstokjes. Remko deed mee en Mark speelde het op safe met een plastic vorkje.

Natuurlijk had Mark zijn doosje vervolgens al zo’n beetje leeg voor Remko en ik goed en wel onze eetstokjes meester waren, maar langzaam maar zeker bleef er toch steeds meer eten daadwerkelijk aan de stokjes hangen en lukte het zowaar om ook nog wat van dat eten naar de juiste plek in de mond te krijgen. Tegen de tijd dat Remko zijn hele doosje al leeg heeft en Mark al aan zijn extra loempia begonnen is, ben ik net een keer op tweederde van mijn portie. “Ben ik nu zo hardleers?”, vraag ik mij af. Ik besluit moedig door te prutsen, ik heb tenslotte nog steeds best honger.

Als ik eindelijk klaar ben, komt de aap uit de mouw. Remko had al eens een paar keer eerder met die dingen gegeten. Ik voel me ineens een stuk minder klungelig. Met kramp in mijn hand, maar een voldaan en vol gevoel in mijn maag verlaat ik de TL-verlichte Wok2Go, op naar huis.

Mocht door dit te lezen de avontuurlijke kriebels gekregen hebben, er zijn complete complete handleidingen te vinden over eten met stokjes en Japanse tafelmanieren. Succes!

Extreme Sports

“Waking up in the morning is my favourite extreme sport” stond er op de Loesje die ik vorige week nog bij Inter-Actief op het prikbord hing. Vroeg, zoals vrijwel elk bijvoeglijk naamwoord in onze taal, is een relatief begrip. Wetenschappers hebben zich erover gebogen, maar uiteindelijk zijn ze niet veel verder gekomen dan de notie dat hoe vroeg je opstaat een zekere verhouding is van een aantal factoren, waaronder het tijdstip waarop je naar bed gaat, het moment waarop je daadwerkelijk gaat slapen, de alcoholconsumptie die daaraan vooraf is gegaan, de tijd dat de wekker gaat en in welke mate dit geheel zich de voorgaande dagen heeft plaatsgevonden.
Daaraan wil ik toevoegen dat vroeg opstaan vervelend is, maar dat er niets erger is dan vroeg op staan om er vervolgens achter te komen dat je had kunnen blijven liggen. Je kent dat gevoel wel, dat je voor een uitgestorven collegezaal staat, of dat je halverwege de kou op de fiets ineens bedenkt dat het zondag is. Vanochtend had ik dus moment, en ik kan je vertellen dat daar helemaal niets sportiefs aan is. Ik voel me nu ongeveer net zo sportief als een downhill mountainbiker die een verkeersdrempel is afgedaald.

Michel’s Exhausted

Macworld Expo Keynote – Apple strikes again

Long expected, finally Apple puts their stuff where there mouth is, and introduces the long-expected Intel Macs. The new iMac’s fine, but screw that. Look at that new Macbook Pro!

It’s faster, thinner, has a new power connector and last but not least: integrated iSight and Front Row support.

Too bad I won’t be able to afford one for wel… at least a few years ;)

Laat Griekenland met rust!

Nou ja, wat ik nu toch weer lees. Die onbetrouwbare Afrikanen gaan er gewoon met een stuk Europa vandoor! Zes hele meters. Nog een paar eeuwen en dan zitten al die gave tekens voor nop op m’n toetsenbord hier.

Gebruiksaanwijzingen

Altijd al afgevraagd hoe je die kurk nu werkelijk uit een wijnfles krijgt? Of wat je nu precies met zo’n bierviltje aan moet? Nu is er de oplossing! Op degebruiksaanwijzingen.nl staat een enorme collectie zinloze gebruiksaanwijzingen van alledaagse voorwerpen. Geweldig toch?

Nu is het wachten op de gebruiksaanwijzing van de vrouw…

Get Perpendicular!

Hitachi is so proud of their revolutionary new way of storing data on magnetic harddrives perpendicularly, they want the whole world to understand what it’s all about. Watch this hilarious movie to see what I mean ;)

For more information about what this new technology might mean, see this engadget article.

Gravatar

Laatst werd ik op wederom een nieuwe coole ontwikkeling op het internet gewezen: Gravatar. Gravatar staat voor “Globally Recognized Avatar”, oftwel werledwijd herkende persoonlijke plaatjes voor iedereen!

Het concept is simpel: je maakt een account aan bij gravatar met je e-mail adres, uploadt een plaatje en vervolgens is dat plaatje op te vragen door iedereen die het gebruikte e-mail adres kent. Leuk voor weblogs en ander community spul dus!

Het gravatar van een willekeurige gebruiker is op te vragen op de volgende link: http://www.gravatar.com/avatar.php?gravatar_id=$id waarbij $id gelijk is aan de md5 hash van de e-mail adres van de gebruiker, om te voorkomen dat vervelende mensen met je e-mail adres aan de haal gaan.

Mijn gravatar is op dit moment nog niet goedgekeurd, maar zodra dat gebeurd is, zal ‘ie hier te zien zijn:

Oliebollen

Ja! Het mag weer: oliebollen bakken. Er zijn toch minimaal 2 gelegenheden die als excuus gebruikt kunnen worden om van die heerlijke deegballen te genieten. Eén van die gelegenheden is de kermis, de ander de jaarwisseling. Laten we nu net bij die laatste aanbeland zijn.

Natuurlijk zijn er veel manieren om aan je oliebollen te komen. Je kunt naar de oliebollenkraam op de hoek lopen, of ze kant en klaar bij de supermarkt halen, maar daar is natuurlijk geen kunst aan. Veel leuker is het die dingen zelf te bakken en dat is dan ook precies wat ik ga doen. Niet met een kant-en-klaar pakje van de Koopmans of iets dergelijks (ze schijnen tegenwoordig zelfs oliebollen te hebben die al rijzen in de pan!), maar écht ouderwets lekkere oliebollen.

Een korte zoektocht op het internet leverde me wat het recept op van de Limburgse keten Kwaliteitsbakkerij Steevens, die in de jaren negentig driemaal tot beste verkozen is. Klinkt goed dacht ik zo ;)

Ingrediënten

  • 1 kilo bakkersbloem of patentbloem
  • 0,8 liter lauw water (ongeveer 30 °C)
  • 80 gram gist
  • 20 gram zout
  • 30 gram geraspte citroenschil
  • 2 eieren
  • 50 gram gesmolten roomboter

Voor de vulling

  • 450 gram rozijnen (op de temperatuur van het beslag)
  • 150 gram verse appelblokjes (maximaal ½ cm groot)
  • 10 gram kaneel

Bereiding

Los de gist op in het water. Bloem, zout, citroenrasp, ei en boter toevoegen. Draai een glad beslag totdat de bloem gemengd is. Daarna de vulling er doorheen werken en 40 minuten laten rijzen. Beslag korte tijd licht doorslaan. Beslag doseren met ijsknijper in olie van 180 graden Celsius. Baktijd ongeveer zes tot zeven minuten. Oliebollen uit laten wasemen en bestrooien met suiker of poedersuiker.
Toelichting: In het oorspronkelijke recept wordt gesproken van Bloem Super Patent. Evenals bakkersbloem (dat verkrijgbaar is bij de warme bakker en natuurvoedingswinkels) zeer rijk aan gluten (eiwitten) waarmee een luchtiger beslag kan worden verkregen dan met patentbloem.

Over dat meel vond ik trouwens nog een heel verhaal in een een artikel van De Molenaar.

Tot slot kwam ik nog wat nuttige tips tegen die ik jullie zeker niet wilde onthouden:

  • Gebruik ingrediënten in de juiste verhouding. Weeg, ga niet af op uw “gevoel”.
  • Los de gist eerst op in lauwwarme melk (of water) voor dit aan het beslag wordt toegevoegd.
  • Droog de vulling (krenten, rozijnen) na het wassen.
  • De vulling moet gelijkmatig over het beslag verdeeld zijn.
  • Roer tot een glad beslag is ontstaan (zonder klonten) en sla dit enkele minuten door. Beslag doorslaan, zult u zich misschien afvragen. Om de lucht uit het beslag te verwijderen wordt de beslaglepel langzaam door het beslag gehaald, waardoor “wegrijzen” van het beslag wordt voorkomen.
  • Laat het beslag op een lauwwarme en rustige plaats ongeveer een uur rijzen. Van huis uit kan ik me herinneren dat de emmer met een vochtige theedoek werd afgedekt om uitdrogen van het beslag te voorkomen.
  • Gebruik bij voorkeur een ijsknijper of anders twee eetlepels om het beslag in de olie te laten glijden. Doop ijsknijper of lepels vlak tevoren in de hete olie om vastplakken van het beslag te voorkomen.
  • Bak 6 minuten bij een olietemperatuur van 180 °C. Uit een test van de Consumentenbond bleek dat de meeste geteste elektrische friteuses de temperatuur niet juist weergeven. Vier van de vijftien friteuses haalden de 180 °C niet, zelfs niet op de hoogste stand. Gebruik daarom een frituurthermometer of test anders met een stukje brood, dat binnen 45 tot 60 seconden bruin en knapperig moet worden.
  • Laat de bollen goed uitlekken. Bijvoorbeeld in een vergiet met keukenpapier.
  • Filtreer de olie na het bakken.
  • Ververs de olie tijdig. Als gevolg van regelmatig verhitten en afkoelen en contact met water en lucht verandert de samenstelling en ontstaan afbraakproducten. De olie wordt donkerder (donkerbruin of zelfs zwart), gaat stinken, wordt stropiger, gaat walmen en de grote bellen bij verse olie gaan over in kleine belletjes. Herkent U een van deze fenomenen, ga dan over op verse olie. Anders wordt U gestraft met ranzig smakende bollen en een flink portie afbraakproducten, die uw gezondheid kunnen schaden. Vuistregel: vervang de olie na vijf tot zeven keer frituren.

Tot slot nog even de bron voor al dit lekkers.

Ik krijg er nu al honger van.