Re: OpenVPN, proxy ARP for an entire subnet (Linux endpoints)

Linux Advanced Routing and Traffic Control

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Monday 11 December 2006 19:16, I wrote:
> "A Tale of TTL Troubles"
>
> I was hired to implement VPN for a subnet. The owner has a /27 at his
> home site, and he wanted to have the machines there answering BOTH on
> those IP addresses and some addresses at a remote colocation
> provider.
snip
> Sorry, I'm not allowed to post details, so IP addresses are munged.
> :(

I have more information, and as it concerns my own IP addresses now,
this doesn't require munging.

> HOME_SITE_NET=x.x.x.0/27 [ 0-31 ]
> HOME_DEF_GATEWAY=x.x.x.1 (I have no access to this router.)
> HOME_VPN_ENDPOINT=x.x.x.4, a/k/a y.y.y.38
>
> REMOTE_SITE_NET=y.y.y.0/24
>     (out of this I was told to bind .38 on the VPN peer and route .39
>     through .60 via the VPN. Sigh ... CIDR masks would have been
>     nice.)
> REMOTE_DEF_GATEWAY=y.y.y.1 (I have no access to this router either.)
> REMOTE_VPN_ENDPOINT=y.y.y.37, a/k/a 192.168.255.37 
>     (The latter is only used for the tunnel traffic.)
(I omitted OS and kernel for this: it's CentOS 4.2 / 2.6.9-22.ELsmp.)

MyHomeNet=192.168.6.0/24 # Yes, RFC 1918, but that is not significant
MyHomeGateway=192.168.6.1 # Slamd64 10.2, 2.6.18.3 from kernel.org
MyHomeVPNpeer=192.168.6.4, a/k/a 72.9.234.116 # Slackware 10.0, 2.4.31
# (with VMware patch, but I doubt that matters.)

MyRemoteNet=72.9.234.112/29 # .112-.114 are in use, .118 reserved
MyRemoteGateway=72.9.234.65 # no access to this machine
MyRemoteVPNpeer=72.9.234.112/26, a/k/a 192.168.6.12
     (The latter is only used for the tunnel traffic.)
# Slackware 10.1, 2.6.10-skas3-v7 (the User-mode Linux patch)

That is correct: we have a /29 out of the /26. So the network and
broadcast addresses are not a factor.

> Routing on HOME_VPN_ENDPOINT :
>
> [root@localhost ~]# ip route list
> y.y.y.39 dev eth0  scope link
> 192.168.255.37 dev tun0  proto kernel  scope link  src y.y.y.38
> y.y.y.40/29 dev eth0  scope link
> y.y.y.48/28 dev eth0  scope link
> x.x.x.0/27 dev eth0  proto kernel  scope link  src x.x.x.4
> 169.254.0.0/16 dev eth0  scope link
> default via x.x.x.1 dev eth0
> [root@localhost ~]# ip route list table colo
> default via 192.168.255.37 dev tun0  src y.y.y.38
> [root@localhost ~]# ip rule list
> 0:      from all lookup local
> 32763:  from y.y.y.48/28 lookup colo
> 32764:  from y.y.y.40/29 lookup colo
> 32765:  from y.y.y.39 lookup colo
> 32766:  from all lookup main
> 32767:  from all lookup default
>
> The 3 "dev eth0 scope link" routes are what was needed to cover .39
> through .60. It goes over, to .63, oh well.

Routing on MyHomeVPNpeer:

root@whn:~# ip route list
192.168.6.12 dev tun0  proto kernel  scope link  src 72.9.234.116
72.9.234.119 dev eth0  scope link
72.9.234.117 dev eth0  scope link
72.9.234.115 dev eth0  scope link
192.168.6.0/24 dev eth0  proto kernel  scope link  src 192.168.6.4
127.0.0.0/8 dev lo  scope link
default via 192.168.6.1 dev eth0  metric 1
root@whn:~# ip rule list
0:      from all lookup local
32762:  from 72.9.234.119 lookup thanks
32763:  from 72.9.234.115 lookup thanks
32764:  from 72.9.234.117 lookup thanks
32765:  from 72.9.234.116 lookup thanks
32766:  from all lookup main
32767:  from all lookup default
root@whn:~# ip route list table thanks
default via 192.168.6.12 dev tun0

Of course /proc/sys/net/ipv4/ip_forward is "1". That's also true on the
ones featured in our last episode.

> One of the machines is x.x.x.6 and y.y.y.39, .49, .59, and .60 on the
> VPN. It's my guinea pig, hereinafter called "www". CentOS release 4.4
> (Final) 2.6.9-42.ELsmp on each of www and HOME_VPN_ENDPOINT; I think
> REMOTE_VPN_ENDPOINT is similar, but I don't think it's the problem.

MyHomeGateway, the Slamd64 machine, was the volunteer for our sadistic
experiments. Here I do not think the fact that it's the default gateway
for MyHomeVPNpeer is significant, because results prove that traffic
moves in both directions through the VPN.

> [root@www ~]# ip route list
> y.y.y.0/27 dev eth0  proto kernel  scope link  src y.y.y.6
> 169.254.0.0/16 dev eth0  scope link
> default via y.y.y.1 dev eth0
> [root@www ~]# ip rule list
> 0:      from all lookup local
> 32765:  from x.x.x.32/27 lookup vpn
> 32766:  from all lookup main
> 32767:  from all lookup default
> [root@www ~]# ip route list table vpn
> default via y.y.y.4 dev eth0

If you don't mind I'm again going to munge my real home IP address.
That's not a factor anyway.

Routes and addresses on MyHomeGateway:

root@miniluv:~# ip addr list
1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop
    link/ether ce:23:26:b7:ef:0c brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:30:48:56:ed:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.1/24 brd 192.168.6.255 scope global eth0
    inet 72.9.234.117/32 scope global eth0
    inet 72.9.234.115/32 scope global eth0
    inet 72.9.234.119/32 scope global eth0
       valid_lft forever preferred_lft forever
4: eth1: <BROADCAST,MULTICAST,NOTRAILERS,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:80:c8:1b:72:4c brd ff:ff:ff:ff:ff:ff
    inet my.ip.add.ress/nm brd isp.brd.cast.ip scope global eth1
       valid_lft forever preferred_lft forever
root@miniluv:~# ip route list
192.168.6.0/24 dev eth0  proto kernel  scope link  src 192.168.6.1
isp.su.bn.et/nm dev eth1  proto kernel  scope link  src my.ip.add.ress
127.0.0.0/8 dev lo  scope link
default via isp.rou.ter.ip dev eth1
root@miniluv:~# ip rule list
0:      from all lookup local
32763:  from 72.9.234.119 lookup vpn
32764:  from 72.9.234.115 lookup vpn
32765:  from 72.9.234.117 lookup vpn
32766:  from all lookup main
32767:  from all lookup default
root@miniluv:~# ip route list table vpn
default via 192.168.6.4 dev eth0

> I tested the routing by using my own IP in an iptables -j LOG rule,
> followed by an nmap -sP of the range.

This time I did it from a third site, but to get a better picture I
added logging in raw/PREROUTING too. This time the logging was at the
RemoteVPNpeer rather than the local one, but anyway, it shows
everything moving as expected. (LocalVPNpeer, being a 2.4.31 host,
doesn't have iptable_raw.)

> [root@localhost ~]# iptables-save
> # Generated by iptables-save v1.2.11 on Mon Dec 11 09:10:27 2006
> *filter
>
> :INPUT ACCEPT [0:0]
> :FORWARD ACCEPT [0:0]
> :OUTPUT ACCEPT [0:0]
> :LogVpn - [0:0]
>
> -A FORWARD -d y.y.y.32/255.255.255.224 -j LogVpn
> -A FORWARD -s y.y.y.32/255.255.255.224 -j LogVpn
> -A LogVpn -s my.IP.add.ress -j LOG --log-prefix "5Vpn IN: "
> -A LogVpn -d my.IP.add.ress -j LOG --log-prefix "5Vpn OUT: "
> COMMIT
> # Completed on Mon Dec 11 09:10:27 2006

Here I'll only show the significant parts of iptables-save on
RemoteVPNpeer:

# Generated by iptables-save v1.2.11 on Wed Dec 13 04:17:29 2006
*raw
:PREROUTING ACCEPT [149316:38901352]
:OUTPUT ACCEPT [155833:112104141]
-A PREROUTING -s 72.9.234.112/29 -d 3rd.par.ty.IP -j LOG --log-prefix "3-raw OUT: "
-A PREROUTING -s 3rd.par.ty.IP -d 72.9.234.112/29 -j LOG --log-prefix "3-raw IN: "
COMMIT
[ ... ]
# Generated by iptables-save v1.2.11 on Wed Dec 13 04:17:29 2006
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
[ ... ]
-A INPUT -j Reject
-A FORWARD -s 3rd.par.ty.IP -j LogVpn
-A FORWARD -d 3rd.par.ty.IP -j LogVpn
[ ... ]
-A LogVpn -s 3rd.par.ty.IP -d 72.9.234.112/29 -j LOG --log-prefix "3-filter IN: "
-A LogVpn -s 72.9.234.112/29 -d 3rd.par.ty.IP -j LOG --log-prefix "3-filter OUT: "
-A LogVpn -j ACCEPT
[ ... ]

So, every packet is logged twice, once in raw and once in filter. And
to ensure that all requests are replied, everything from 3rd.par.ty.IP
is accepted before any other filter/FORWARD rules.

> Results of the scan: all but y.y.y.39 were up. Logs: um, rather than
> ask you to pick through all that, I'll summarise:

Results of the scan from 3rd.par.ty.IP of 72.9.234.115-119 showed all
but .118 is up. And the logs were pristine: "raw IN:" and "filter IN:"
for each ICMP echo and HTTP request in perfect numeric sequence. After
those were similarly-arranged "raw OUT:" and "filter OUT:" logs for
ICMP and HTTP replies. The IN: packets all came in eth0, the OUT: ones
all went out tun0, and the filter ones showed both interfaces properly.



What is the difference here? Mainly OS and kernel, I think. Did I miss
anything?



So, any input here at all? Could this be an obscure bug in the Centos
(RHEL) kernels? How to proceed?
-- 
    Offlist mail to this address is discarded unless
    "/dev/rob0" or "not-spam" is in Subject: header
_______________________________________________
LARTC mailing list
LARTC@xxxxxxxxxxxxxxx
http://mailman.ds9a.nl/cgi-bin/mailman/listinfo/lartc

[Index of Archives]     [LARTC Home Page]     [Netfilter]     [Netfilter Development]     [Network Development]     [Bugtraq]     [GCC Help]     [Yosemite News]     [Linux Kernel]     [Fedora Users]
  Powered by Linux