Multi-Protocol PPP

Users can run IP, IPv6 and IPX on a ppp session over rs232 or emulations of that

Null modem Guest

I have this ppp peers configuration file at the guest's end of the connection. It is configured to autodetect just about everything that pppd can run.


Null Modem Host

A file like this could be the ppp peers file at the other end.

ipx-network 0x00000002
ipx-router-name rs232
ipx-node 1:2
ipx-routing 2
ipx-routing 4
ipv6 ::1,::2


A File like this is used at the other end, substituting the IPv4 addresses as needed.


With IPv6, only the link-local addresses are specified. Radvd is run on the host's end of the connection in the same way as it is for ethernet, and the pppd at the guest end then automatically puts the IPv6 network prefix from radvd together with the interface address from the ipv6 option in the peers file above to form the full ipv6 address.

Example: After the connection is up, firstly give the local end a real address like this: ifconfig ppp0 add 2001:db8::1/64

Then when radvd is run or sighup'd with the following file, the guest ppp end automatically gets the IPv6 2001:db8::2/64

interface ppp0
        IgnoreIfMissing on;
        AdvSendAdvert on;
        prefix 2001:db8::/64
                AdvOnLink on;
                AdvAutonomous on;

It's useful to do the ifconfig ppp0 add 2001:db8::1/64 and killall -HUP radvd in a suitable file in /etc/ppp/ipv6-up.d/, to the appropriate ppp connection.

It may also be needed to add a route to your ppp host from elsewhere in the network if it does not already get data destined for your chosen IPv6 prefix. Something like ip -f inet6 route add 2001:db8::/64 dev eth0 may do it.

If you have a BIND nameserver, please consider adding the following to /etc/bind/zones.rfc1918, unless you populate those domains.

zone "" { type master; file "/etc/bind/db.empty"; };
zone "" { type master; file "/etc/bind/db.empty"; };
zone "" { type master; file "/etc/bind/db.empty"; };

As I was unable to prevent BIND from relaying requests from unauthorised users, this domain dns is now provided by djbdns with IPv6 and forwarding patches, as it is public domain, I also disabled record random reordering, by commenting out all function code in dns_sortip.c, and changed the 2 lines beginning i = dns_random in tdlookup.c to say i = addrnum

Doing that to djbdns is equivalent to the BIND option rrset-order { order fixed; };

If you use djbdns too, a similar thing can be added to your root/data file in your tinydns instances, and in root/servers write the files and containing the IP address of your tinydns server.


You might not be running this protocol but some games like to use it. It also is to be merged into IPv6, therefore IPv6 fields can represent IPv4 and IPX addresses as well as native IPv6.

Linux is best configured with IPX and IPX full network on all the participating IPX machines. Install debian packages ipx.

ipxripd is also needed but version 0.7 will not run unless built with a slight change to the source code on linux 2.6 like so.

--- ipxripd-0.7/ipxkern.c	2005-08-30 18:30:40.000000000 +0100
+++ ipxripd-0.7/ipxkern.c	2005-08-30 18:31:19.000000000 +0100
@@ -57,7 +57,7 @@
 	FILE *ipx_route;
 	char buf[512];
-	ipx_route = fopen("/proc/net/ipx_route", "r");
+	ipx_route = fopen("/proc/net/ipx/route", "r");
 	if (ipx_route == NULL)
@@ -115,7 +115,7 @@
 	FILE *ipx_ifc;
 	char buf[512];
-	ipx_ifc = fopen("/proc/net/ipx_interface", "r");
+	ipx_ifc = fopen("/proc/net/ipx/interface", "r");
 	if (ipx_ifc == NULL)

It could be applied and installed like as follows:

apt-get source ipxripd
patch -p0 < patchfile
cd ipxripd-0.7/
dpkg-buildpackage -r fakeroot
cd ..
dpkg -i *.deb

IPX configuration

Firstly you'd eanable it on the network of the ppp host. The master of that network (i.e. dhcp/radvd server) would get the following in /etc/network/interfaces

iface eth0 ipx static
        netnum 1
        frame EtherII

The other machines would have the following appended to /etc/network/interfaces, although they could also be statically configured if you don't mind having to change them if you want to change network number too.

iface eth0 ipx dynamic
        frame EtherII

The static means that the machine will use the specified IPX network number. It does need to be different for each IPX subnet in a connected internetworking of subnets.

The dynamic means that the machine does not use IPX at all until it sees an IPX packet, and then communicates on the IPX network number seen in that packet. Some documentation refers to this as network number 0, meaning I don't have a configured network number.

Now you hopefully have an IPX enabled ethernet subnet with entries in /proc/net/ipx showing the information. ipxripd needs to be running too so that ppp will get it's routes copied into the tables.

pppd can now participate, and ipxd would broadcast routes to the ethernet when it is started. If your ppp guest is a Windows 98 machine, it may need to be told the Network Address in Advanced, which is set the same as ipx-network in the host's ppp peers file.