vanheusden.com

MyIP

MyIP is an IP stack in userspace.

It will listen on a tap-, promiscuous, slip or ppp device for network frames containg e.g. ARP-requests, IP packets, ICMP(6), UDP and even NTP, VNC, SIP, MQTT and HTTP requests. Also LLDP, NDP, Socks, syslog, PPP, SLIP, NRPE, DNS (client), SCTP, MDNS and SNMP. When multiple interfaces are configured, it can also route between them.

I wrote MyIP to see how difficult it is to write an IP-stack. Maybe it is of use to anyone?

Source code: on GitHub

feel free to test it

Please don't DDOS it by sending large amounts of data or so, but making it crash via a specifically crafted IP-packet is welcome. If you succeed, it would be helpful if you send me the details.

There is an instance running on myip.vanheusden.com.

how I test it

Below are my notes on how my test-setup looks like. It is made up of 3 computers connected via LAN/serial-PPP links. This to give you an idea how to configure it and what can be done with it.

M: management
T0: uplink MyIP
T1: test network between MyIP and testhost
T2: test network between testhost1 and routed testhost2


laptop
 |
 |
LAN-----------------+ MyIP host
192.168.64.0/23 (M) +-LAN0: 192.168.64.200/23 (M)
52:54:00:86:d9:1f   |       dc:a6:32:6f:80:84
GW:192.168.64.1     +-LAN1: 192.168.65.11/23 (T0)
                            00:0e:c6:f0:41:37
                      LAN2: 192.168.7.1/24 (T3) -------------------------------+
                            00:e0:98:61:a3:69                                  |
                   +--MyIP: 192.168.5.1/24 (T1) [/dev/ttyUSB0]                 |
                   |  RS232                                                    |
                   |                                                           |
                   |                                                           |
                   |  testhost1                       testhost2 (arduino)      |
                   |  WLAN:  192.168.65.10/23 (M)     192.168.6.2 (T2)         |
                   |         dc:a6:32:06:ee:a3        00:aa:bb:cc:da:02        |
                   +--RS232: 192.168.5.2/24 (T1) [/dev/ttyUSB0]   |            |
                      LAN0:  192.168.6.1/24 (T2) -----------------+            |
                             dc:a6:32:06:ee:a2                                 |
                      LAN1:  192.168.7.2/24 (T3) ------------------------------+
                             00:e0:98:61:a3:5c

MyIP host:
 $ cd /root/MyIP
 $ ./build/myip ../myip-test.cfg
 
testhost1:
 $ pppd nodetach noauth debug nocrtscts defaultroute /dev/ttyUSB0 115200
   > nodetach / debug: do not fork & show debug info
   > noauth: myip does not do authentication on PPP
   > nocrtscts: my test serial cable only has GND/RX/TX connected

laptop:
 $ route add -net 192.168.5.0/24 gw 192.168.65.11
 $ route add -net 192.168.6.0/24 gw 192.168.65.11
 $ route add -net 192.168.7.0/24 gw 192.168.65.11


myip-test.cfg (on MyIP-host)
----------------------------
logging = {
	file="myip.log";
	level_file="debug";
	level_screen="debug";
}

environment = {
	chdir-path="/tmp"
	run-as=0
	run-in=0

	ifup="/root/MyIP/go.sh"
	#ifdown=

	stats-socket="/tmp/myipstats.sock";

	n-router-threads=1;
}

interfaces = (
{
        type="promiscuous"

        dev-name="eth1"

        ipv4 = {
                n-ipv4-threads = 4;

		forwarder = true;
                
                my-address="192.168.65.11";
                gateway-mac-address="52:54:00:86:d9:1f";

                use-icmp=true;
                use-tcp=true;
                use-sctp=true;
                use-udp=true;

                n-icmp-threads=4;
                n-sctp-threads=4;
                n-tcp-threads=8;
                n-udp-threads=8;
        }       
                        
        # mac-address="56:6f:24:22:00:b2";
        mac-address="00:0e:c6:f0:41:37";

        routes = ( {
                        ip-family = "ipv4";
                        network = "192.168.64.0";
                        netmask = "255.255.254.0";
			priority = 1;
                },
		{
			ip-family = "ipv4";
			network = "0.0.0.0";
			netmask = "0.0.0.0";
			gateway = "192.168.64.1";
			priority = 0;
		} )
},
{
        type="promiscuous"

        dev-name="eth2"

        ipv4 = {
                n-ipv4-threads = 4;

		forwarder = true;
                
                my-address="192.168.7.1";
                gateway-mac-address="00:e0:98:61:a3:5c"; # mac of other side

                use-icmp=true;
                use-tcp=true;
                use-sctp=true;
                use-udp=true;

                n-icmp-threads=4;
                n-sctp-threads=4;
                n-tcp-threads=8;
                n-udp-threads=8;
        }       
                        
        mac-address="00:e0:98:61:a3:69";

        routes = ( {
                        ip-family = "ipv4";
                        network = "192.168.7.0";
                        netmask = "255.255.255.0";
			priority = 1;
		} )
},
{
	type="ppp"

	serial-dev="/dev/ttyUSB0";

	n-ipv4-threads=4;

	ipv4 = {
		my-address="192.168.5.1";

		forwarder = true;

		use-icmp=true;
		use-tcp=true;
		use-sctp=true;
		use-udp=true;
		n-icmp-threads=1;
		n-sctp-threads=1;
		n-tcp-threads=1;
		n-udp-threads=1;
	}

	mac-address="00:00:00:00:00:01";

	opponent-address = "192.168.5.2";

	n-ipv6-threads=1;

	routes = ({
			ip-family = "ipv4";
			network = "192.168.5.0";
			netmask = "255.255.255.0";
			priority = 1;
		},
		{
			ip-family = "ipv4";
			network = "192.168.6.0";
			netmask = "255.255.255.0";
			gateway = "192.168.5.2";
			priority = 1;
		})
})




For contact info, see this page.