OpenVPN ne roule pas vers d'autres IP publiques sur le server OpenVPN

Ceci est similaire au problème abordé dans OpenVPN et le routing .

Mon server exécute à la fois un service VPN L2TP / PPTP basé sur le racoon et un service OpenVPN. Le service racoon atsortingbue des adresses dans la gamme 10.0.77.0/24 (sur l'interface en1) et le service OpenVPN atsortingbue les adresses clients dans la gamme 10.0.88.0/24 (sur l'interface utun0). Les clients se connectent aux deux services à partir de l'Internet publique via IP publique sur l'interface en0, et sont réinvesties sur l'Internet public sur une autre adresse IP publique sur la même interface (en 0: 0).

Voir mon jeu de règles pf ci-dessous. Je suis 99,9% positif que ce soit un problème avec mes règles pf.

Avec la règle "nat on en0 …" en vigueur, tous les clients VPN peuvent accéder à Internet correctement. Les clients de racoon peuvent également accéder à d'autres services sur les autres IP de mon server, mais les clients OpenVPN ne peuvent accéder qu'à ces services via l'adresse 10.0.88.1. Ces clients peuvent effectuer un ping et traceroute vers les autres IP, mais ne pas accéder à aucun service sur eux. Lorsqu'un ping est exécuté, tcpdump montre le ping qui se passe sur l'interface utun0, mais il ne montre pas le ping si je surveille l'interface en0 (qui reçoit l'adresse IP en cours de ping).

Si je désactive la règle "nat on en0", évidemment aucun client ne peut se connecter à Internet, mais tous les clients peuvent se connecter aux autres IP du server. Quelque chose à propos de la règle nat, et comment OpenVPN gère son tunnel, et comment pf est en train de filterr les choses, gâche l'access à l'interface locale … mais apparemment je ne suis pas assez intelligent avec pf pour comprendre.

Voici la configuration pf. Quelqu'un peut-il détecter le problème?

set block-policy drop set fingerprints "/etc/pf.os" scrub-anchor "/*" all fragment reassemble nat-anchor "/*" all rdr-anchor "/*" all anchor "/*" all dummynet-anchor "/*" all table <vpn-nets> persist { 10.0.77.0/24 10.0.88.0/24 } nat-anchor "/*" all rdr-anchor "/*" all pass quick on lo0 all flags S/SA keep state anchor "/*" all anchor "/*" all anchor "/*" all anchor "/*" all nat on en0 from ! (en0) to any -> (en0:0) table <__automatic_0> const { 127.0.0.1 10.0.88.1 10.0.77.1 } pass inet6 from ::1 to any flags S/SA keep state pass on lo0 inet6 from fe80::1 to any flags S/SA keep state pass on en1 inet6 from fe80::223:dfff:fede:f372 to any flags S/SA keep state pass inet from <__automatic_0> to any flags S/SA keep state pass from <vpn-nets> to any flags S/SA keep state pass on utun0 all flags S/SA keep state pass on en1 all flags S/SA keep state pass in on utun0 all keep state fragment pass out on en0 from any to <vpn-nets> flags S/SA keep state table <blockedHosts> persist file "/var/db/af/blockedHosts" block drop in quick from <blockedHosts> to any pass quick on lo0 all flags S/SA keep state pass in log all flags S/SA keep state pass out log all flags S/SA keep state 

Il s'avère que j'avais juste besoin d'une règle "rdr" juste après la déclaration nat, pour redirect tout ce qui provient d'un client OpenVPN destiné à l'IP publique du server vers la passerelle virtuelle OpenVPN:

 nat on en0 from ! (en0) to any -> (en0:0) rdr pass on utun0 inet proto { tcp udp } from 10.0.88.0/24 to en0 -> 10.0.88.1 nat on en0 from! nat on en0 from ! (en0) to any -> (en0:0) rdr pass on utun0 inet proto { tcp udp } from 10.0.88.0/24 to en0 -> 10.0.88.1 (en 0) à tout -> (en 0: 0) nat on en0 from ! (en0) to any -> (en0:0) rdr pass on utun0 inet proto { tcp udp } from 10.0.88.0/24 to en0 -> 10.0.88.1 

Apparemment, le racoon fait cela seul (?), Mais OpenVPN ne le fait pas. Je ne peux toujours pas comprendre pourquoi les pings fonctionnent sans la règle mais pas tcp / udp – mais c'est pourquoi je ne redirige que tcp / udp avec la règle. Ce pf one-liner était beaucoup plus facile que le vissage avec DNS divisé.