<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>internet</title>
  <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/tags/internet"/>
  <link rel="self" type="application/atom+xml" href="http://tumbleweed.org.za/taxonomy/term/54/atom/feed"/>
  <id>http://tumbleweed.org.za/taxonomy/term/54/atom/feed</id>
  <updated>2008-01-02T19:55:15+00:00</updated>
  <entry>
    <title>Split-Routing on Debian/Ubuntu</title>
    <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/2008/09/19/split-routing-debianubuntu" />
    <id>http://tumbleweed.org.za/2008/09/19/split-routing-debianubuntu</id>
    <published>2008-09-19T15:13:58+00:00</published>
    <updated>2008-10-19T08:52:31+00:00</updated>
    <author>
      <name>tumbleweed</name>
    </author>
    <category term="debian" />
    <category term="internet" />
    <category term="linux" />
    <category term="split-routing" />
    <category term="ubuntu" />
    <summary type="html"><![CDATA[<p>My post on <a href="/2007/09/02/local-only-dsl">split-routing on OpenWRT</a> has been incredibly popular, and led to many people implementing split-routing, whether or not they had OpenWRT. While it's fun to have an exercise as a reader, it led to me having to help lots of newbies through porting that setup to a Debian / Ubuntu environment. To save <em>myself</em> some time, here's how I do it on Debian:</p>

<p>Background, especially for non-South Africa readers: Bandwidth in South Africa is ridiculously expensive, especially International bandwidth. The point of this exercise is that we can buy "<a href="http://www.webafrica.co.za/adsl/is_local/">local-only</a>" DSL accounts which only connect to South African networks. E.g. I have an account that gives me 30GB of local traffic / month, for the same cost as 2.5GB of International traffic account. Normally you'd change your username and password on your router to switch account when you wanted to do something like an Debian apt-upgrade, but that's irritating. There's no reason why you can't have a Linux-based router concurrently connected to both accounts via the same ADSL line.</p>

<p>Firstly, we have a DSL modem. Doesn't matter what it is, it just has to support bridged mode. If it won't work without a DSL account, you can use the Telkom guest account. My recommendation for a modem is to buy a Telkom-branded Billion modem (because Telkom sells everything with really big chunky, well-surge-protected power supplies).</p>

<p>For the sake of this example, we have the modem (IP 10.0.0.2/24) plugged into eth0 on our server, which is running Debian or Ubuntu, doesn't really matter much - personal preference. The modem has DHCP turned off, and we have our PCs on the same ethernet segment as the modem. Obviously this is all trivial to change.</p>

<p>You need these packages installed:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;"># aptitude install iproute pppoe wget awk findutils</div></div>

<p>You need ppp interfaces for your providers. I created <span class="geshifilter"><code class="geshifilter-text">/etc/ppp/peers/intl-dsl</code></span>:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;">user intl-account@uber-isp.net<br />
unit 1<br />
pty &quot;/usr/sbin/pppoe -I eth0 -T 80 -m 1452&quot;<br />
noipdefault<br />
defaultroute<br />
hide-password<br />
lcp-echo-interval 20<br />
lcp-echo-failure 3<br />
noauth<br />
persist<br />
maxfail 0<br />
mtu 1492<br />
noaccomp<br />
default-asyncmap</div></div>

<p><span class="geshifilter"><code class="geshifilter-text">/etc/ppp/peer/local-dsl</code></span>:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;">user local-account@uber-isp.net<br />
unit 2<br />
pty &quot;/usr/sbin/pppoe -I eth0 -T 80 -m 1452&quot;<br />
noipdefault<br />
hide-password<br />
lcp-echo-interval 20<br />
lcp-echo-failure 3<br />
connect /bin/true<br />
noauth<br />
persist<br />
maxfail 0<br />
mtu 1492<br />
noaccomp<br />
default-asyncmap</div></div>

<p><span class="geshifilter"><code class="geshifilter-text">unit 1</code></span> makes a connection always bind to "ppp1". Everything else is pretty standard. Note that only the international connection forces a default route.</p>

<p>To <span class="geshifilter"><code class="geshifilter-text">/etc/ppp/pap-secrets</code></span> I added my username and password combinations:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;"># User &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Host Password<br />
intl-account@uber-isp.net &nbsp;* &nbsp; &nbsp;s3cr3t<br />
local-account@uber-isp.net * &nbsp; &nbsp;passw0rd</div></div>

<p>Now for some magic. I create <span class="geshifilter"><code class="geshifilter-text">/etc/ppp/ip-up.d/20routing</code></span> to set up routes when a connection comes up:</p>

<div class="geshifilter"><div class="bash geshifilter-bash" style="font-family:monospace;"><span class="co0">#!/bin/sh -e</span><br />
<br />
<span class="kw1">case</span> <span class="st0">&quot;<span class="es2">$PPP_IFACE</span>&quot;</span> <span class="kw1">in</span><br />
&nbsp;<span class="st0">&quot;ppp1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<span class="re2">IFACE</span>=<span class="st0">&quot;intl-dsl&quot;</span><br />
&nbsp; &nbsp;<span class="sy0">;;</span><br />
&nbsp;<span class="st0">&quot;ppp2&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<span class="re2">IFACE</span>=<span class="st0">&quot;local-dsl&quot;</span><br />
&nbsp; &nbsp;<span class="sy0">;;</span><br />
&nbsp;<span class="sy0">*</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<span class="kw3">exit</span> <span class="nu0">0</span><br />
<span class="kw1">esac</span><br />
<br />
<span class="co0"># Custom routes</span><br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re5">-f</span> <span class="st0">&quot;/etc/network/routes-<span class="es2">$IFACE</span>&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; <span class="kw2">cat</span> <span class="st0">&quot;/etc/network/routes-<span class="es2">$IFACE</span>&quot;</span> <span class="sy0">|</span> <span class="kw1">while</span> <span class="kw2">read</span> route; <span class="kw1">do</span><br />
&nbsp; &nbsp; ip route add <span class="st0">&quot;<span class="es2">$route</span>&quot;</span> dev <span class="st0">&quot;<span class="es2">$PPP_IFACE</span>&quot;</span><br />
&nbsp; <span class="kw1">done</span><br />
<span class="kw1">fi</span><br />
<br />
<span class="co0"># Clean out old rules</span><br />
ip rule list <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;lookup <span class="es2">$IFACE</span>&quot;</span> <span class="sy0">|</span> <span class="kw2">cut</span> -d: <span class="re5">-f2</span> <span class="sy0">|</span> <span class="kw2">xargs</span> <span class="re5">-L</span> <span class="nu0">1</span> <span class="re5">-I</span> xx <span class="kw2">sh</span> <span class="re5">-c</span> <span class="st0">&quot;ip rule del xx&quot;</span><br />
<br />
<span class="co0"># Source Routing</span><br />
ip route add <span class="st0">&quot;<span class="es2">$PPP_REMOTE</span>&quot;</span> dev <span class="st0">&quot;<span class="es2">$PPP_IFACE</span>&quot;</span> src <span class="st0">&quot;<span class="es2">$address</span>&quot;</span> table <span class="st0">&quot;<span class="es2">$IFACE</span>&quot;</span><br />
ip route add default via <span class="st0">&quot;<span class="es2">$PPP_REMOTE</span>&quot;</span> table <span class="st0">&quot;<span class="es2">$IFACE</span>&quot;</span><br />
ip rule add from <span class="st0">&quot;<span class="es2">$PPP_LOCAL</span>&quot;</span> table <span class="st0">&quot;<span class="es2">$IFACE</span>&quot;</span><br />
<br />
<span class="co0"># Make sure this interface is present in all the custom routing tables:</span><br />
<span class="re2">route</span>=<span class="sy0">`</span>ip route show dev <span class="st0">&quot;<span class="es2">$PPP_IFACE</span>&quot;</span> <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'/scope link &nbsp;src/ {print $1}'</span><span class="sy0">`</span><br />
<span class="kw2">awk</span> <span class="st_h">'/^[0-9]/ {if ($1 &gt; 0 &amp;&amp; $1 &lt; 250) print $2}'</span> <span class="sy0">/</span>etc<span class="sy0">/</span>iproute2<span class="sy0">/</span>rt_tables <span class="sy0">|</span> <span class="kw1">while</span> <span class="kw2">read</span> table; <span class="kw1">do</span><br />
&nbsp; ip route add <span class="st0">&quot;<span class="es2">$route</span>&quot;</span> dev <span class="st0">&quot;<span class="es2">$PPP_IFACE</span>&quot;</span> table <span class="st0">&quot;<span class="es2">$table</span>&quot;</span><br />
<span class="kw1">done</span></div></div>

<p>That script loads routes from <span class="geshifilter"><code class="geshifilter-text">/etc/network/routes-intl-dsl</code></span> and  <span class="geshifilter"><code class="geshifilter-text">/etc/network/routes-local-dsl</code></span>. It also sets up source routing so that incoming connections work as expected.</p>

<p>Now, we need those route files to exist and contain something useful. Create the script <span class="geshifilter"><code class="geshifilter-text">/etc/cron.daily/za-routes</code></span> (and make it executable):</p>

<div class="geshifilter"><div class="bash geshifilter-bash" style="font-family:monospace;"><span class="co0">#!/bin/sh -e</span><br />
<span class="re2">ROUTEFILE</span>=<span class="sy0">/</span>etc<span class="sy0">/</span>network<span class="sy0">/</span>routes-local-dsl<br />
<br />
<span class="kw2">wget</span> <span class="re5">-q</span> http:<span class="sy0">//</span>alm.za.net<span class="sy0">/</span>ip<span class="sy0">/</span>localroutes4.txt <span class="re5">-O</span> - <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'{print $4}'</span> <span class="sy0">&gt;</span> <span class="sy0">/</span>tmp<span class="sy0">/</span>zaroutes<br />
<span class="re2"><span class="kw2">size</span></span>=<span class="sy0">`</span><span class="kw2">stat</span> <span class="re5">-c</span> <span class="st_h">'%s'</span> <span class="sy0">/</span>tmp<span class="sy0">/</span>zaroutes<span class="sy0">`</span><br />
<br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re1">$size</span> <span class="re5">-gt</span> <span class="nu0">0</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; <span class="kw2">mv</span> <span class="sy0">/</span>tmp<span class="sy0">/</span>zaroutes <span class="st0">&quot;<span class="es2">$ROUTEFILE</span>&quot;</span><br />
<span class="kw1">fi</span></div></div>

<p>It downloads the routes file from alm.za.net and converts it to a suitable format. Run it now to seed that file.</p>

<p>Now some International-only routes. I use IS local DSL, so SAIX DNS queries should go through the SAIX connection even though the servers are local to ZA.</p>

<p>My <span class="geshifilter"><code class="geshifilter-text">/etc/network/routes-intl-dsl</code></span> contains SAIX DNS servers and proxies:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;">196.25.255.3<br />
196.25.1.9<br />
196.25.1.11<br />
196.43.1.14<br />
196.43.1.11<br />
196.43.34.190<br />
196.43.38.190<br />
196.43.42.190<br />
196.43.45.190<br />
196.43.46.190<br />
196.43.50.190<br />
196.43.53.190<br />
196.43.9.21</div></div>

<p>Now we can tell <span class="geshifilter"><code class="geshifilter-text">/etc/network/interfaces</code></span> about our connections so that they can get brought up automatically on bootup:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;"># This file describes the network interfaces available on your system<br />
# and how to activate them. For more information, see interfaces(5).<br />
<br />
# The loopback network interface<br />
auto lo<br />
iface lo inet loopback<br />
<br />
# The primary network interface<br />
allow-hotplug eth0<br />
iface eth0 inet static<br />
&nbsp; &nbsp; &nbsp; &nbsp; address 10.0.0.1<br />
&nbsp; &nbsp; &nbsp; &nbsp; netmask 255.255.255.0<br />
<br />
auto local-dsl<br />
iface local-dsl inet ppp<br />
&nbsp; &nbsp; &nbsp; &nbsp; provider local-dsl<br />
<br />
auto intl-dsl<br />
iface intl-dsl inet ppp<br />
&nbsp; &nbsp; &nbsp; &nbsp; provider intl-dsl</div></div>

<p>For DNS, I use dnsmasq, hardcoded to point to IS &amp; SAIX upstreams. My machine's <span class="geshifilter"><code class="geshifilter-text">/etc/resolv.conf</code></span> just points to this dnsmasq.</p>

<p>So something like <span class="geshifilter"><code class="geshifilter-text">/etc/resolv.conf</code></span>:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;">nameserver 127.0.0.1</div></div>

<p><span class="geshifilter"><code class="geshifilter-text">/etc/dnsmasq.conf</code></span>:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;">no-resolv<br />
# IS:<br />
server=168.210.2.2<br />
server=196.14.239.2<br />
# SAIX:<br />
server=196.43.34.190<br />
server=196.43.46.190<br />
server=196.25.1.11<br />
domain=foobar.lan<br />
dhcp-range=10.0.0.128,10.0.0.254,12h<br />
dhcp-authoritative<br />
no-negcache</div></div>

<p>Finally, you'll need masquerading set up in your firewall. Here is a trivial example firewall, put it in <span class="geshifilter"><code class="geshifilter-text">/etc/network/if-up.d/firewall</code></span> and make it executable. You should probably change it to suit your needs or use something else, but this should work:</p>

<div class="geshifilter"><div class="bash geshifilter-bash" style="font-family:monospace;"><span class="co0">#!/bin/sh</span><br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re1">$IFACE</span> <span class="sy0">!</span>= <span class="st0">&quot;eth0&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; <span class="kw3">exit</span>;<br />
<span class="kw1">fi</span><br />
<br />
iptables <span class="re5">-F</span> INPUT<br />
iptables <span class="re5">-F</span> FORWARD<br />
iptables <span class="re5">-t</span> nat <span class="re5">-F</span> POSTROUTING<br />
iptables <span class="re5">-A</span> INPUT <span class="re5">-i</span> eth0 <span class="re5">-s</span> 10.0.0.0<span class="sy0">/</span><span class="nu0">24</span> <span class="re5">-j</span> ACCEPT<br />
iptables <span class="re5">-A</span> INPUT <span class="re5">-i</span> ppp+ <span class="re5">-m</span> state <span class="re5">--state</span> ESTABLISHED,RELATED <span class="re5">-j</span> ACCEPT<br />
iptables <span class="re5">-A</span> INPUT <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-A</span> FORWARD <span class="re5">-i</span> ppp+ <span class="re5">-m</span> state <span class="re5">--state</span> ESTABLISHED,RELATED <span class="re5">-j</span> ACCEPT<br />
iptables <span class="re5">-A</span> FORWARD <span class="re5">-i</span> eth0 <span class="re5">-o</span> ppp+ <span class="re5">-j</span> ACCEPT<br />
iptables <span class="re5">-A</span> FORWARD <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-t</span> nat <span class="re5">-A</span> POSTROUTING <span class="re5">-s</span> 10.0.0.0<span class="sy0">/</span><span class="nu0">24</span> <span class="re5">-o</span> ppp+ <span class="re5">-j</span> MASQUERADE</div></div>
    ]]></summary>
    <content type="html"><![CDATA[<p>My post on <a href="/2007/09/02/local-only-dsl">split-routing on OpenWRT</a> has been incredibly popular, and led to many people implementing split-routing, whether or not they had OpenWRT. While it's fun to have an exercise as a reader, it led to me having to help lots of newbies through porting that setup to a Debian / Ubuntu environment. To save <em>myself</em> some time, here's how I do it on Debian:</p>

<p>Background, especially for non-South Africa readers: Bandwidth in South Africa is ridiculously expensive, especially International bandwidth. The point of this exercise is that we can buy "<a href="http://www.webafrica.co.za/adsl/is_local/">local-only</a>" DSL accounts which only connect to South African networks. E.g. I have an account that gives me 30GB of local traffic / month, for the same cost as 2.5GB of International traffic account. Normally you'd change your username and password on your router to switch account when you wanted to do something like an Debian apt-upgrade, but that's irritating. There's no reason why you can't have a Linux-based router concurrently connected to both accounts via the same ADSL line.</p>

<p>Firstly, we have a DSL modem. Doesn't matter what it is, it just has to support bridged mode. If it won't work without a DSL account, you can use the Telkom guest account. My recommendation for a modem is to buy a Telkom-branded Billion modem (because Telkom sells everything with really big chunky, well-surge-protected power supplies).</p>

<p>For the sake of this example, we have the modem (IP 10.0.0.2/24) plugged into eth0 on our server, which is running Debian or Ubuntu, doesn't really matter much - personal preference. The modem has DHCP turned off, and we have our PCs on the same ethernet segment as the modem. Obviously this is all trivial to change.</p>

<p>You need these packages installed:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;"># aptitude install iproute pppoe wget awk findutils</div></div>

<p>You need ppp interfaces for your providers. I created <code>/etc/ppp/peers/intl-dsl</code>:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;">user intl-account@uber-isp.net<br />
unit 1<br />
pty &quot;/usr/sbin/pppoe -I eth0 -T 80 -m 1452&quot;<br />
noipdefault<br />
defaultroute<br />
hide-password<br />
lcp-echo-interval 20<br />
lcp-echo-failure 3<br />
noauth<br />
persist<br />
maxfail 0<br />
mtu 1492<br />
noaccomp<br />
default-asyncmap</div></div>

<p><code>/etc/ppp/peer/local-dsl</code>:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;">user local-account@uber-isp.net<br />
unit 2<br />
pty &quot;/usr/sbin/pppoe -I eth0 -T 80 -m 1452&quot;<br />
noipdefault<br />
hide-password<br />
lcp-echo-interval 20<br />
lcp-echo-failure 3<br />
connect /bin/true<br />
noauth<br />
persist<br />
maxfail 0<br />
mtu 1492<br />
noaccomp<br />
default-asyncmap</div></div>

<p><code>unit 1</code> makes a connection always bind to "ppp1". Everything else is pretty standard. Note that only the international connection forces a default route.</p>

<p>To <code>/etc/ppp/pap-secrets</code> I added my username and password combinations:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;"># User &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Host Password<br />
intl-account@uber-isp.net &nbsp;* &nbsp; &nbsp;s3cr3t<br />
local-account@uber-isp.net * &nbsp; &nbsp;passw0rd</div></div>

<p>Now for some magic. I create <code>/etc/ppp/ip-up.d/20routing</code> to set up routes when a connection comes up:</p>

<div class="geshifilter"><div class="bash geshifilter-bash" style="font-family:monospace;"><span class="co0">#!/bin/sh -e</span><br />
<br />
<span class="kw1">case</span> <span class="st0">&quot;<span class="es2">$PPP_IFACE</span>&quot;</span> <span class="kw1">in</span><br />
&nbsp;<span class="st0">&quot;ppp1&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<span class="re2">IFACE</span>=<span class="st0">&quot;intl-dsl&quot;</span><br />
&nbsp; &nbsp;<span class="sy0">;;</span><br />
&nbsp;<span class="st0">&quot;ppp2&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<span class="re2">IFACE</span>=<span class="st0">&quot;local-dsl&quot;</span><br />
&nbsp; &nbsp;<span class="sy0">;;</span><br />
&nbsp;<span class="sy0">*</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<span class="kw3">exit</span> <span class="nu0">0</span><br />
<span class="kw1">esac</span><br />
<br />
<span class="co0"># Custom routes</span><br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re5">-f</span> <span class="st0">&quot;/etc/network/routes-<span class="es2">$IFACE</span>&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; <span class="kw2">cat</span> <span class="st0">&quot;/etc/network/routes-<span class="es2">$IFACE</span>&quot;</span> <span class="sy0">|</span> <span class="kw1">while</span> <span class="kw2">read</span> route; <span class="kw1">do</span><br />
&nbsp; &nbsp; ip route add <span class="st0">&quot;<span class="es2">$route</span>&quot;</span> dev <span class="st0">&quot;<span class="es2">$PPP_IFACE</span>&quot;</span><br />
&nbsp; <span class="kw1">done</span><br />
<span class="kw1">fi</span><br />
<br />
<span class="co0"># Clean out old rules</span><br />
ip rule list <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;lookup <span class="es2">$IFACE</span>&quot;</span> <span class="sy0">|</span> <span class="kw2">cut</span> -d: <span class="re5">-f2</span> <span class="sy0">|</span> <span class="kw2">xargs</span> <span class="re5">-L</span> <span class="nu0">1</span> <span class="re5">-I</span> xx <span class="kw2">sh</span> <span class="re5">-c</span> <span class="st0">&quot;ip rule del xx&quot;</span><br />
<br />
<span class="co0"># Source Routing</span><br />
ip route add <span class="st0">&quot;<span class="es2">$PPP_REMOTE</span>&quot;</span> dev <span class="st0">&quot;<span class="es2">$PPP_IFACE</span>&quot;</span> src <span class="st0">&quot;<span class="es2">$address</span>&quot;</span> table <span class="st0">&quot;<span class="es2">$IFACE</span>&quot;</span><br />
ip route add default via <span class="st0">&quot;<span class="es2">$PPP_REMOTE</span>&quot;</span> table <span class="st0">&quot;<span class="es2">$IFACE</span>&quot;</span><br />
ip rule add from <span class="st0">&quot;<span class="es2">$PPP_LOCAL</span>&quot;</span> table <span class="st0">&quot;<span class="es2">$IFACE</span>&quot;</span><br />
<br />
<span class="co0"># Make sure this interface is present in all the custom routing tables:</span><br />
<span class="re2">route</span>=<span class="sy0">`</span>ip route show dev <span class="st0">&quot;<span class="es2">$PPP_IFACE</span>&quot;</span> <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'/scope link &nbsp;src/ {print $1}'</span><span class="sy0">`</span><br />
<span class="kw2">awk</span> <span class="st_h">'/^[0-9]/ {if ($1 &gt; 0 &amp;&amp; $1 &lt; 250) print $2}'</span> <span class="sy0">/</span>etc<span class="sy0">/</span>iproute2<span class="sy0">/</span>rt_tables <span class="sy0">|</span> <span class="kw1">while</span> <span class="kw2">read</span> table; <span class="kw1">do</span><br />
&nbsp; ip route add <span class="st0">&quot;<span class="es2">$route</span>&quot;</span> dev <span class="st0">&quot;<span class="es2">$PPP_IFACE</span>&quot;</span> table <span class="st0">&quot;<span class="es2">$table</span>&quot;</span><br />
<span class="kw1">done</span></div></div>

<p>That script loads routes from <code>/etc/network/routes-intl-dsl</code> and  <code>/etc/network/routes-local-dsl</code>. It also sets up source routing so that incoming connections work as expected.</p>

<p>Now, we need those route files to exist and contain something useful. Create the script <code>/etc/cron.daily/za-routes</code> (and make it executable):</p>

<div class="geshifilter"><div class="bash geshifilter-bash" style="font-family:monospace;"><span class="co0">#!/bin/sh -e</span><br />
<span class="re2">ROUTEFILE</span>=<span class="sy0">/</span>etc<span class="sy0">/</span>network<span class="sy0">/</span>routes-local-dsl<br />
<br />
<span class="kw2">wget</span> <span class="re5">-q</span> http:<span class="sy0">//</span>alm.za.net<span class="sy0">/</span>ip<span class="sy0">/</span>localroutes4.txt <span class="re5">-O</span> - <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'{print $4}'</span> <span class="sy0">&gt;</span> <span class="sy0">/</span>tmp<span class="sy0">/</span>zaroutes<br />
<span class="re2"><span class="kw2">size</span></span>=<span class="sy0">`</span><span class="kw2">stat</span> <span class="re5">-c</span> <span class="st_h">'%s'</span> <span class="sy0">/</span>tmp<span class="sy0">/</span>zaroutes<span class="sy0">`</span><br />
<br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re1">$size</span> <span class="re5">-gt</span> <span class="nu0">0</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; <span class="kw2">mv</span> <span class="sy0">/</span>tmp<span class="sy0">/</span>zaroutes <span class="st0">&quot;<span class="es2">$ROUTEFILE</span>&quot;</span><br />
<span class="kw1">fi</span></div></div>

<p>It downloads the routes file from alm.za.net and converts it to a suitable format. Run it now to seed that file.</p>

<p>Now some International-only routes. I use IS local DSL, so SAIX DNS queries should go through the SAIX connection even though the servers are local to ZA.</p>

<p>My <code>/etc/network/routes-intl-dsl</code> contains SAIX DNS servers and proxies:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;">196.25.255.3<br />
196.25.1.9<br />
196.25.1.11<br />
196.43.1.14<br />
196.43.1.11<br />
196.43.34.190<br />
196.43.38.190<br />
196.43.42.190<br />
196.43.45.190<br />
196.43.46.190<br />
196.43.50.190<br />
196.43.53.190<br />
196.43.9.21</div></div>

<p>Now we can tell <code>/etc/network/interfaces</code> about our connections so that they can get brought up automatically on bootup:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;"># This file describes the network interfaces available on your system<br />
# and how to activate them. For more information, see interfaces(5).<br />
<br />
# The loopback network interface<br />
auto lo<br />
iface lo inet loopback<br />
<br />
# The primary network interface<br />
allow-hotplug eth0<br />
iface eth0 inet static<br />
&nbsp; &nbsp; &nbsp; &nbsp; address 10.0.0.1<br />
&nbsp; &nbsp; &nbsp; &nbsp; netmask 255.255.255.0<br />
<br />
auto local-dsl<br />
iface local-dsl inet ppp<br />
&nbsp; &nbsp; &nbsp; &nbsp; provider local-dsl<br />
<br />
auto intl-dsl<br />
iface intl-dsl inet ppp<br />
&nbsp; &nbsp; &nbsp; &nbsp; provider intl-dsl</div></div>

<p>For DNS, I use dnsmasq, hardcoded to point to IS &amp; SAIX upstreams. My machine's <code>/etc/resolv.conf</code> just points to this dnsmasq.</p>

<p>So something like <code>/etc/resolv.conf</code>:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;">nameserver 127.0.0.1</div></div>

<p><code>/etc/dnsmasq.conf</code>:</p>

<div class="geshifilter"><div class="text geshifilter-text" style="font-family:monospace;">no-resolv<br />
# IS:<br />
server=168.210.2.2<br />
server=196.14.239.2<br />
# SAIX:<br />
server=196.43.34.190<br />
server=196.43.46.190<br />
server=196.25.1.11<br />
domain=foobar.lan<br />
dhcp-range=10.0.0.128,10.0.0.254,12h<br />
dhcp-authoritative<br />
no-negcache</div></div>

<p>Finally, you'll need masquerading set up in your firewall. Here is a trivial example firewall, put it in <code>/etc/network/if-up.d/firewall</code> and make it executable. You should probably change it to suit your needs or use something else, but this should work:</p>

<div class="geshifilter"><div class="bash geshifilter-bash" style="font-family:monospace;"><span class="co0">#!/bin/sh</span><br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re1">$IFACE</span> <span class="sy0">!</span>= <span class="st0">&quot;eth0&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; <span class="kw3">exit</span>;<br />
<span class="kw1">fi</span><br />
<br />
iptables <span class="re5">-F</span> INPUT<br />
iptables <span class="re5">-F</span> FORWARD<br />
iptables <span class="re5">-t</span> nat <span class="re5">-F</span> POSTROUTING<br />
iptables <span class="re5">-A</span> INPUT <span class="re5">-i</span> eth0 <span class="re5">-s</span> 10.0.0.0<span class="sy0">/</span><span class="nu0">24</span> <span class="re5">-j</span> ACCEPT<br />
iptables <span class="re5">-A</span> INPUT <span class="re5">-i</span> ppp+ <span class="re5">-m</span> state <span class="re5">--state</span> ESTABLISHED,RELATED <span class="re5">-j</span> ACCEPT<br />
iptables <span class="re5">-A</span> INPUT <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-A</span> FORWARD <span class="re5">-i</span> ppp+ <span class="re5">-m</span> state <span class="re5">--state</span> ESTABLISHED,RELATED <span class="re5">-j</span> ACCEPT<br />
iptables <span class="re5">-A</span> FORWARD <span class="re5">-i</span> eth0 <span class="re5">-o</span> ppp+ <span class="re5">-j</span> ACCEPT<br />
iptables <span class="re5">-A</span> FORWARD <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-t</span> nat <span class="re5">-A</span> POSTROUTING <span class="re5">-s</span> 10.0.0.0<span class="sy0">/</span><span class="nu0">24</span> <span class="re5">-o</span> ppp+ <span class="re5">-j</span> MASQUERADE</div></div>
    ]]></content>
  </entry>
  <entry>
    <title>I&#039;m a Google Reader convert</title>
    <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/2008/03/12/im-google-reader-convert" />
    <id>http://tumbleweed.org.za/2008/03/12/im-google-reader-convert</id>
    <published>2008-03-12T20:51:03+00:00</published>
    <updated>2008-03-12T20:51:03+00:00</updated>
    <author>
      <name>tumbleweed</name>
    </author>
    <category term="google" />
    <category term="google-reader" />
    <category term="internet" />
    <category term="rss" />
    <category term="technical" />
    <summary type="html"><![CDATA[<p>My blog hasn&#8217;t had much to say recently, but now that I&#8217;m feeling pressured by University assignments, I think it&#8217;s time to get back into one-post-per-day&nbsp;mode&nbsp;:-)</p>

<p>I remember once trying <a href="http://www.google.com/reader">Google Reader</a>, just after it launched, and very quickly deciding that I couldn&#8217;t stand it, and I&#8217;d stick to <a href="http://liferea.sourceforge.net/">Liferea</a>.</p>

<p>Recently, however, Liferea has been giving me trouble. It&#8217;s been incredibly unstable, and I&#8217;d often forgot to run a transparent proxy on my laptop when in restrictive environments, so it&#8217;d miss lots of posts and generally be un-happy. The instability I fixed by exporting an <span class="caps"><span class="caps">OPML</span></span> list, wiping the configuration, and re-loading, but that was a ball-ache to do. While I was bitching about this, <a href="http://vhata.net/" title="Jonathan Hitchcock">Vhata</a> pushed me to try Google&nbsp;Reader&nbsp;again.</p>

<p>I was pleasantly surprised. It works well, and I didn&#8217;t find it oppressive. That doesn&#8217;t mean it&#8217;s perfect, I&#8217;d like to see the following&nbsp;things&nbsp;improved:</p>

<ul>
<li>Duplicate post detection (i.e. planetified <span class="amp">&amp;</span> origional posts, liferea&nbsp;does&nbsp;this)</li>
<li>Performance</li>
<li>Favicons (or something similar, to make it more clear where a post&nbsp;comes&nbsp;from)</li>
<li>On that note, maybe configurable colour borders for&nbsp;important&nbsp;feeds?</li>
<li>Automatic refreshing&nbsp;(i.e.&nbsp;&#8220;r&#8221;)</li>
<li>More&nbsp;viewable&nbsp;area</li>
<li>A key press for opening a post in a <em>backgrounded</em> new tab &#8220;v&#8221; changes your focus to the new tab, which is against the principles of&nbsp;tabbed&nbsp;browsing.</li>
</ul>

<p>Some cool things it does that&nbsp;lifera&nbsp;doesn&#8217;t:</p>

<ul>
<li>Clicking on a folder shows you the all the posts from the feeds in&nbsp;that&nbsp;folder</li>
<li><span class="dquo"><span class="dquo">&#8220;</span></span>river of posts&#8221; view, which lets me get through my reading a <em>lot</em>&nbsp;faster</li>
<li>preloading images for posts that I haven&#8217;t got to yet (this contributes a fair whack to the reading speed, given the slow interwebs in&nbsp;<span class="caps"><span class="caps">ZA</span></span>)</li>
<li>Shared&nbsp;items</li>
<li>Access from multiple machines (<span class="caps"><span class="caps">OX</span></span>, X-forwarding worked, but this&nbsp;is&nbsp;neater)</li>
<li>Doesn&#8217;t crash&nbsp;(sorry&nbsp;lifrea&#8230;)</li>
</ul>

<p>I&#8217;m converted. Google Reader <em>really</em>&nbsp;is&nbsp;good.</p>

<p>/me gets on with&nbsp;reading&nbsp;feeds&#8230;</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>My blog hasn&#8217;t had much to say recently, but now that I&#8217;m feeling pressured by University assignments, I think it&#8217;s time to get back into one-post-per-day mode&nbsp;:-)</p>

<p>I remember once trying <a href="http://www.google.com/reader">Google Reader</a>, just after it launched, and very quickly deciding that I couldn&#8217;t stand it, and I&#8217;d stick to <a href="http://liferea.sourceforge.net/">Liferea</a>.</p>

<p>Recently, however, Liferea has been giving me trouble. It&#8217;s been incredibly unstable, and I&#8217;d often forgot to run a transparent proxy on my laptop when in restrictive environments, so it&#8217;d miss lots of posts and generally be un-happy. The instability I fixed by exporting an <span class="caps">OPML</span> list, wiping the configuration, and re-loading, but that was a ball-ache to do. While I was bitching about this, <a href="http://vhata.net/" title="Jonathan Hitchcock">Vhata</a> pushed me to try Google Reader&nbsp;again.</p>

<p>I was pleasantly surprised. It works well, and I didn&#8217;t find it oppressive. That doesn&#8217;t mean it&#8217;s perfect, I&#8217;d like to see the following things&nbsp;improved:</p>

<ul>
<li>Duplicate post detection (i.e. planetified <span class="amp">&amp;</span> origional posts, liferea does&nbsp;this)</li>
<li>Performance</li>
<li>Favicons (or something similar, to make it more clear where a post comes&nbsp;from)</li>
<li>On that note, maybe configurable colour borders for important&nbsp;feeds?</li>
<li>Automatic refreshing (i.e.&nbsp;&#8220;r&#8221;)</li>
<li>More viewable&nbsp;area</li>
<li>A key press for opening a post in a <em>backgrounded</em> new tab &#8220;v&#8221; changes your focus to the new tab, which is against the principles of tabbed&nbsp;browsing.</li>
</ul>

<p>Some cool things it does that lifera&nbsp;doesn&#8217;t:</p>

<ul>
<li>Clicking on a folder shows you the all the posts from the feeds in that&nbsp;folder</li>
<li><span class="dquo">&#8220;</span>river of posts&#8221; view, which lets me get through my reading a <em>lot</em>&nbsp;faster</li>
<li>preloading images for posts that I haven&#8217;t got to yet (this contributes a fair whack to the reading speed, given the slow interwebs in&nbsp;<span class="caps">ZA</span>)</li>
<li>Shared&nbsp;items</li>
<li>Access from multiple machines (<span class="caps">OX</span>, X-forwarding worked, but this is&nbsp;neater)</li>
<li>Doesn&#8217;t crash (sorry&nbsp;lifrea&#8230;)</li>
</ul>

<p>I&#8217;m converted. Google Reader <em>really</em> is&nbsp;good.</p>

<p>/me gets on with reading&nbsp;feeds&#8230;</p>
    ]]></content>
  </entry>
  <entry>
    <title>That was *camp</title>
    <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/2007/12/09/that-was-camp" />
    <id>http://tumbleweed.org.za/2007/12/09/that-was-camp</id>
    <published>2007-12-09T21:31:52+00:00</published>
    <updated>2008-01-02T19:55:16+00:00</updated>
    <author>
      <name>tumbleweed</name>
    </author>
    <category term="dnsmasq" />
    <category term="geekdninner" />
    <category term="gprs" />
    <category term="internet" />
    <category term="netinstall" />
    <category term="starcamp" />
    <category term="ubuntu" />
    <summary type="html"><![CDATA[<p>I&#8217;m now sitting in Arniston, on a horribly slow <span class="caps"><span class="caps">GPRS</span></span> connection, after <a href="http://starcamp.org.za/">*camp</a>, which was this weekend, at <a href="http://www.aims.ac.za/" title="The African Institute of Mathematical Studies"><span class="caps"><span class="caps">AIMS</span></span></a>. It was a BarCamp-like &#8220;unconference&#8221;, organised by the <a href="http://www.geekdinner.org.za/">geekdinner</a> crowd. I put off having the weekend at Arniston for *camp, and for me, I think that was&nbsp;worth&nbsp;it.</p>

<p>The event was really good. I haven&#8217;t been very involved in the organising, and didn&#8217;t come prepared with a talk (just equipment). At the start, it felt like there were never going to be enough talks to keep us going, but as soon as it started, it began rolling, and continued for 2 days. The talks were varied, from technical, to psychological, to practical. I was really impressed. The quality of the talks was quite high - I was rarely bored (although I did have <span class="caps"><span class="caps">IRC</span></span>&nbsp;distractions).</p>

<p>As usual, I had <a href="http://www.jonathancarter.co.za/">Jonathan Carter</a>&#8217;s camera, and videoed everything. I&#8217;m going to go home to around 8 hours of video that needs editing, synchronizing, encoding, and uploading to archive.org. It&#8217;ll take a while, guys,&nbsp;be&nbsp;patient.</p>

<p>Today, I got involved with setting up the lab for practical demos. We had 9 PCs lent, and needed Ubuntu on them. Of course, the natural approach is netinstall - I&#8217;m familiar with netinstalling Ubuntu, and it is a great way to set up a pile of computers. However, we ran into problem&nbsp;after&nbsp;problem.</p>

<ol>
<li>We were using dnsmasq (on my laptop) for <span class="caps"><span class="caps">DHCP</span></span> and <span class="caps"><span class="caps">TFTP</span></span>, but it wasn&#8217;t the router. So I set the <span class="geshifilter"><code class="geshifilter-text">router</code></span> <span class="caps">DHCP</span> option. This seemed to break dnsmasq - PCs stopped accepting leases and <span class="caps">DHCPDECLINED</span> them. I&#8217;ve never seen that before. So I had to route through my laptop -&nbsp;no&nbsp;biggie.</li>
<li><span class="caps"><span class="caps">AIMS</span></span> is behind a 400kbps connection, and while thy have an apt-cacher, it seemed badly seeded, and it looked like it was going to take us hours to install, so I went to my car and collected a set of Ubuntu archive DVDs that I happened to have on hand, and loaded them via a cluster of laptops and&nbsp;rsync&nbsp;;-)</li>
<li>Of course those DVDs didn&#8217;t have udebs on them (the debian-installer bits and pieces), so I had to quickly write a script to download all the udebs, and their necessary&nbsp;support&nbsp;structure.</li>
<li>Now the machines netboot installed really fast, <em>but</em> at the very end of the install, it failed, due to some package&nbsp;signature&nbsp;problem.</li>
<li>I ran debmirror, to ensure that my mirror was up to date, and it was. I ran the md5 sum checks, and they passed. I have no idea what the&nbsp;problem&nbsp;was.</li>
<li>Eventually, the lab was installed with 3 install CDs, and then clubbed into shape with clusterssh. 5hrs or so after starting - what a waste of time, we should have started&nbsp;with&nbsp;CDs&#8230;</li>
</ol>

<p>So, lesson for next time, test your netboot setup in advance, don&#8217;t assume that a mirror will be in working shape. We should have set up the lab on day one, for use on&nbsp;day&nbsp;2.</p>

<p>The upshot of this is that I didn&#8217;t see any talks today (excepting a practical in the lab, on scribus, once it was up). I&#8217;ll have to watch the&nbsp;videos&nbsp;later.</p>

<p>Now, I&#8217;m going to enjoy a few days in Arniston, and then come home&nbsp;to&nbsp;graduate.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>I&#8217;m now sitting in Arniston, on a horribly slow <span class="caps">GPRS</span> connection, after <a href="http://starcamp.org.za/">*camp</a>, which was this weekend, at <a href="http://www.aims.ac.za/" title="The African Institute of Mathematical Studies"><span class="caps">AIMS</span></a>. It was a BarCamp-like &#8220;unconference&#8221;, organised by the <a href="http://www.geekdinner.org.za/">geekdinner</a> crowd. I put off having the weekend at Arniston for *camp, and for me, I think that was worth&nbsp;it.</p>

<p>The event was really good. I haven&#8217;t been very involved in the organising, and didn&#8217;t come prepared with a talk (just equipment). At the start, it felt like there were never going to be enough talks to keep us going, but as soon as it started, it began rolling, and continued for 2 days. The talks were varied, from technical, to psychological, to practical. I was really impressed. The quality of the talks was quite high - I was rarely bored (although I did have <span class="caps">IRC</span>&nbsp;distractions).</p>

<p>As usual, I had <a href="http://www.jonathancarter.co.za/">Jonathan Carter</a>&#8217;s camera, and videoed everything. I&#8217;m going to go home to around 8 hours of video that needs editing, synchronizing, encoding, and uploading to archive.org. It&#8217;ll take a while, guys, be&nbsp;patient.</p>

<p>Today, I got involved with setting up the lab for practical demos. We had 9 PCs lent, and needed Ubuntu on them. Of course, the natural approach is netinstall - I&#8217;m familiar with netinstalling Ubuntu, and it is a great way to set up a pile of computers. However, we ran into problem after&nbsp;problem.</p>

<ol>
<li>We were using dnsmasq (on my laptop) for <span class="caps">DHCP</span> and <span class="caps">TFTP</span>, but it wasn&#8217;t the router. So I set the <code>router</code> DHCP option. This seemed to break dnsmasq - PCs stopped accepting leases and DHCPDECLINED them. I&#8217;ve never seen that before. So I had to route through my laptop - no&nbsp;biggie.</li>
<li><span class="caps">AIMS</span> is behind a 400kbps connection, and while thy have an apt-cacher, it seemed badly seeded, and it looked like it was going to take us hours to install, so I went to my car and collected a set of Ubuntu archive DVDs that I happened to have on hand, and loaded them via a cluster of laptops and rsync&nbsp;;-)</li>
<li>Of course those DVDs didn&#8217;t have udebs on them (the debian-installer bits and pieces), so I had to quickly write a script to download all the udebs, and their necessary support&nbsp;structure.</li>
<li>Now the machines netboot installed really fast, <em>but</em> at the very end of the install, it failed, due to some package signature&nbsp;problem.</li>
<li>I ran debmirror, to ensure that my mirror was up to date, and it was. I ran the md5 sum checks, and they passed. I have no idea what the problem&nbsp;was.</li>
<li>Eventually, the lab was installed with 3 install CDs, and then clubbed into shape with clusterssh. 5hrs or so after starting - what a waste of time, we should have started with&nbsp;CDs&#8230;</li>
</ol>

<p>So, lesson for next time, test your netboot setup in advance, don&#8217;t assume that a mirror will be in working shape. We should have set up the lab on day one, for use on day&nbsp;2.</p>

<p>The upshot of this is that I didn&#8217;t see any talks today (excepting a practical in the lab, on scribus, once it was up). I&#8217;ll have to watch the videos&nbsp;later.</p>

<p>Now, I&#8217;m going to enjoy a few days in Arniston, and then come home to&nbsp;graduate.</p>
    ]]></content>
  </entry>
  <entry>
    <title>GeekDinner meets Linkedin</title>
    <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/2007/12/04/geekdinner-meets-linkedin" />
    <id>http://tumbleweed.org.za/2007/12/04/geekdinner-meets-linkedin</id>
    <published>2007-12-04T08:57:57+00:00</published>
    <updated>2008-01-02T19:55:15+00:00</updated>
    <author>
      <name>tumbleweed</name>
    </author>
    <category term="geekdinner" />
    <category term="internet" />
    <summary type="html"><![CDATA[<p>I&#8217;ve finally jumped on the Linkedin bandwagon. Amongst other things, I&#8217;ve added a <a href="http://www.linkedin.com/e/gis/44620/747D250DE7D7">GeekDinner Group</a>.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>I&#8217;ve finally jumped on the Linkedin bandwagon. Amongst other things, I&#8217;ve added a <a href="http://www.linkedin.com/e/gis/44620/747D250DE7D7">GeekDinner Group</a>.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Uncapped Local access</title>
    <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/2007/11/08/uncapped-local-access" />
    <id>http://tumbleweed.org.za/2007/11/08/uncapped-local-access</id>
    <published>2007-11-08T15:29:56+00:00</published>
    <updated>2008-01-02T19:55:15+00:00</updated>
    <author>
      <name>tumbleweed</name>
    </author>
    <category term="adsl" />
    <category term="dsl" />
    <category term="internet" />
    <category term="local-only" />
    <category term="saix" />
    <category term="south-africa" />
    <category term="telkom" />
    <summary type="html"><![CDATA[<p>We&#8217;ve read that <a href="http://mybroadband.co.za/news/ADSL/1854.html">Telkom is implementing uncapped local access</a>, as mandated by <span class="caps"><span class="caps">ICASA</span></span>. The regulation states &#8220;local bandwidth shall not be subject to the cap&#8221;, but nobody seriously thinks Telkom will follow this to the letter. There is a huge market in inter-office VPNs over <span class="caps"><span class="caps">ADSL</span></span>, and Telkom don&#8217;t want to lose out on that&nbsp;revenue&nbsp;stream.</p>

<p>Currently the savvy users out there use hacks like <a href="http://tumbleweed.org.za/2007/09/02/local-only-dsl/">mine</a> to least-cost-route local traffic over cheaper <a href="http://www.is.co.za/"><span class="caps"><span class="caps">IS</span></span></a> &#8220;Local-Only&#8221; accounts (like <a href="http://www.webafrica.co.za/adsl/is_local/">these</a>). Hell, even ISPs route their clients&#8217; local traffic over the <span class="caps"><span class="caps">IS</span></span>&nbsp;Local-Only&nbsp;accounts.</p>

<p>From what I&#8217;ve heard from <a href="http://www.frogfoot.com/">the friendly frogs</a>, Telkom are really just going to keep it simple, and implement the equivalent of <a href="http://www.webafrica.co.za/adsl/is/"><span class="caps"><span class="caps">IS</span></span> <span class="caps"><span class="caps">DSL</span></span></a> accounts, where after you get capped, you get another, local-only cap. This can be implemented with Radius only, and will (to some extent) prevent the service from being abused&nbsp;be&nbsp;everybody.</p>

<p>So yes, we all still need our separate <span class="caps"><span class="caps">IS</span></span> Local-Only accounts, and do our own&nbsp;<span class="caps"><span class="caps">LCR</span></span>.</p>

<p>Anybody who thinks Telkom is doing any good for South Africa, go and sit in a&nbsp;corner&nbsp;now!</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>We&#8217;ve read that <a href="http://mybroadband.co.za/news/ADSL/1854.html">Telkom is implementing uncapped local access</a>, as mandated by <span class="caps">ICASA</span>. The regulation states &#8220;local bandwidth shall not be subject to the cap&#8221;, but nobody seriously thinks Telkom will follow this to the letter. There is a huge market in inter-office VPNs over <span class="caps">ADSL</span>, and Telkom don&#8217;t want to lose out on that revenue&nbsp;stream.</p>

<p>Currently the savvy users out there use hacks like <a href="http://tumbleweed.org.za/2007/09/02/local-only-dsl/">mine</a> to least-cost-route local traffic over cheaper <a href="http://www.is.co.za/"><span class="caps">IS</span></a> &#8220;Local-Only&#8221; accounts (like <a href="http://www.webafrica.co.za/adsl/is_local/">these</a>). Hell, even ISPs route their clients&#8217; local traffic over the <span class="caps">IS</span> Local-Only&nbsp;accounts.</p>

<p>From what I&#8217;ve heard from <a href="http://www.frogfoot.com/">the friendly frogs</a>, Telkom are really just going to keep it simple, and implement the equivalent of <a href="http://www.webafrica.co.za/adsl/is/"><span class="caps">IS</span> <span class="caps">DSL</span></a> accounts, where after you get capped, you get another, local-only cap. This can be implemented with Radius only, and will (to some extent) prevent the service from being abused be&nbsp;everybody.</p>

<p>So yes, we all still need our separate <span class="caps">IS</span> Local-Only accounts, and do our own&nbsp;<span class="caps">LCR</span>.</p>

<p>Anybody who thinks Telkom is doing any good for South Africa, go and sit in a corner&nbsp;now!</p>
    ]]></content>
  </entry>
</feed>
