Example: proxy ARP as an alternative to bridging

If one wants to have a remote node appear to be on a local LAN (i.e., having an IP address inside the local LAN’s subnet), one can set up a bridge at the local node, as described in the bridging example. However, setting up a bridge is rather complex, and if one only needs unicast IP traffic to work, and broadcast or non-IP traffic is not a requirement, one can use the proxy ARP features of the operating system instead.

Since we only use unicast IP traffic, proxy ARP works with both router and switch mode.

Overview

The network setup is as follows:

  • Office LAN, the LAN on interface eth0 uses the range 192.168.1.0/24. The office node uses the address 192.168.1.2.
  • Road warrior, using the address 192.168.1.123.

Configuration of tinc at the office

host# cat /etc/tinc/vpn/tinc.conf
Name = office
#Optional:
#Mode = switch

host# cat /etc/tinc/vpn/tinc-up
#!/bin/sh

ifconfig $INTERFACE 192.168.1.2 netmask 255.255.255.255
route add 192.168.1.123 dev $INTERFACE
echo 1 >/proc/sys/net/ipv4/conf/eth0/proxy_arp
echo 1 >/proc/sys/net/ipv4/conf/$INTERFACE/proxy_arp

host# ls /etc/tinc/vpn/hosts
office  roadwarrior  ...

host# cat /etc/tinc/vpn/hosts/office
Address = 123.234.123.42
Subnet = 192.168.1.0/24
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

host# cat /etc/tinc/vpn/hosts/roadwarrior
Subnet = 192.168.1.123
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

Configuration of tinc at the road warrior

host# cat /etc/tinc/vpn/tinc.conf
Name = roadwarrior
ConnectTo = office
#Optional:
#Mode = switch

host# cat /etc/tinc/vpn/tinc-up
#!/bin/sh

ifconfig $INTERFACE 192.168.1.123 netmask 255.255.255.0

The host config files are, of course, identical to those on the office node.

Automatically adding routes

In the above configuration, the tinc-up script of the office node has a route to the roadwarrior’s address hardcoded. To have tinc automatically add the necessary routes, remove the route add command from the tinc-up script, and instead add this subnet-up script:

host# cat /etc/tinc/vpn/subnet-up
#!/bin/sh
[ "$NAME" = "$NODE" ] && exit 0
ip route replace $SUBNET dev $INTERFACE