/layer2

Toy framework for creating a VPN

Primary LanguageCBSD 2-Clause "Simplified" LicenseBSD-2-Clause

+-----------------+
| Layer2 - README |
+-----------------+

Layer2 is a tiny program which can sniff ethernet frames from network interface
devices and transport them to another instance of Layer2 where it is
redistributed, all based on a set of (routing+filtering) rules specified
through a configuration file.

Layer2 uses libpcap for packet capturing, and libnet for creating IP packets and 
injecting them into the network.

A machine that hosts layer2 is said to be the border gateway and listens to all
interfaces under its management for ethernet frames, filtering and capturing
only those which are of interest. Based on the rules, an ethernet frame which
is destined for a remote node, behind another border gateway, is captured and
packed inside an IP packet with an upper layer protocol number set to
L2_PROTO_NUM (defined in layer2.h). This packet is then sent to the remote
border gateway (which must host another instance of layer2) using normal
internet routing mechanisms. Once the remote instance of layer2 obtains the
frame containing this packet, it unpacks it and writes the frame to the
appropriate interface device, again based on the local specifications.

Using "layer2"
--------------

$ ./layer2 < config.conf

layer2 reads the STDIN for configuration specifications.

Configuration
-------------

The configuration plays a crucial role in the functioning of layer2. The 
strucuture of the configuration file is simple and straightforward.

- Anything after the '#' till the newline is a comment.
- A routing rule must be associated with frames captured at an interface
  device. The interface must be defined as follows,

	[iface-dev-name: protocols]

  where `iface-dev-name' could be eth0, eth1, rl0 etc. and `protocols' are one 
  or more of, ip, arp, rarp, dec. Example

	[eth0: ip arp]

  specifies that layer2 should only capture ethernet frames of type IP and ARP
  from device eth0.
- Following the interface definitions, the rules of routing for packets captured
  from it must be specified. The format for that is -

  Destination-IP	Net-Mask	Border-Gateway-IP	Interface

  * Destination-IP: This is the destination ip address of the captured packet. 
    This field is used for filtering the packets to be transported.
  * Net-Mask: The mask to be applied.
  * Border-Gateway-IP: The ip address of the remote border gateway to which the
    packet is to be packed and transported to, for redistribution. It can be
    a valid IP address or '*' which denotes NONE.
  * Interface: The interface device to which the packet is to be written. This
    is when the border gateway is set to '*'. The value could be a valid
    device name or '*' denoting NONE.

  NOTE: Atleast one of gateway-ip and interface must be specified.

  Based on this routing rule, layer2 compiles filter rules and routes packets
  seen at the interface. 

Example
=======

This is an example of config files for the following setup,

    192.168.1.0/24        150.1.1.1

    ---o(eth0):linux-box1:(eth1)o---.
                                     \  
                                      \
                                  (IP network)
                                      /
                                     /
    ---o(eth0):linux-box2:(eth1)o---'

    192.168.2.0/24        152.1.1.2

Both linux-boxes must run layer2 configured as follows -

config.conf at linux-box1
-------------------------

[eth0: ip arp]
192.168.2.0	255.255.255.0	152.1.1.2	*
[eth1: ip]
192.168.1.0	255.255.255.0	*		eth0

config.conf at linux-box2
-------------------------

[eth0: ip arp]
192.168.1.0	255.255.255.0	150.1.1.1	*
[eth1: ip]
192.168.2.0	255.255.255.0	*		eth0