Estou configurando um gateway OpenVPN para permitir acesso de LAN à Internet através do túnel. O gateway está executando o OpenBSD 5.5-amd64 estável na plataforma PC Engines APU.
A LAN contém re1
, re2
e ral0
interfaces. Ele também contém quem hospeda a rede vether0
local . 192.168.2.0/24
Essas interfaces estão vinculadas bridge0
para fornecer um gateway, sub-rede e DHCP comuns via dhcpd
.
A VPN é estabelecida e tun0
aberta. O próprio gateway pode acessar a VPN perfeitamente.
O problema é que, por padrão, os hosts acessam a VPN com seus 192.168.2.0/24
endereços nativos. O NAT é necessário para traduzir a rede local para a rede VPN em 10.0.1.0/24
.
Eu tentei as seguintes pf.conf
configurações:
# pf.conf -- 10.0.1.10 is my tun0 gateway
set skip on lo
block return
pass in quick on { vether0 re1 re2 ral0 } from 192.168.2.0/24 to !10.0.0.0/8 nat-to 10.0.1.10
pass
Tive resultados semelhantes com estas regras:
# pf.conf
...
pass in from any nat-to 10.0.1.10
pass out from tun0 to any
Isso permite que o tráfego da LAN passe tun0
com um endereço de origem 10.0.1.10
, e o tráfego de retorno seja repassado ao respectivo host. O novo problema é que o tráfego de retorno ainda não parece estar sendo roteado corretamente.
Por exemplo, posso executar ping 8.8.8.8
de google.com
qualquer host LAN, porém a primeira resposta SEMPRE é colocada entre tun0
a interface de retorno. Ferramentas como dig
, nslookup
, traceroute
e ping
geralmente são lentas e demoram muito mais do que deveriam. Apesar de ainda haver algum tráfego, os navegadores e outros aplicativos ficam inutilizáveis.
tcpdump
demonstrando a perda:
# 192.168.2.103 is a LAN host
# 74.125.131.139 is google.com
# on ral0
20:59:35.668251 192.168.2.103 > 74.125.131.139: icmp: echo request <-- no reply
20:59:40.651184 192.168.2.103 > 74.125.131.139: icmp: echo request
20:59:40.736748 74.125.131.139 > 192.168.2.103: icmp: echo reply
20:59:41.656101 192.168.2.103 > 74.125.131.139: icmp: echo request
20:59:41.741251 74.125.131.139 > 192.168.2.103: icmp: echo reply
20:59:42.661071 192.168.2.103 > 74.125.131.139: icmp: echo request
20:59:42.802410 74.125.131.139 > 192.168.2.103: icmp: echo reply
# on tun0
20:59:35.668359 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:35.764052 74.125.131.139 > 10.0.1.10: icmp: echo reply <-- here's the missing reply, it didn't get to ral0
20:59:40.651221 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:40.736721 74.125.131.139 > 10.0.1.10: icmp: echo reply <-- but the of the replies rest did
20:59:41.656138 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:41.741226 74.125.131.139 > 10.0.1.10: icmp: echo reply
20:59:42.661107 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:42.802372 74.125.131.139 > 10.0.1.10: icmp: echo reply
Eu sei que isso é quase certamente um problema de NAT, pf.conf
mas depois de tantas tentativas de configuração, estou tendo problemas para encontrar a maneira correta de passar o tráfego.
Quando eu estava usando DD-WRT e iptables
, esta era minha configuração:
iptables -D FORWARD -i tun1 -j logaccept
iptables -D FORWARD -o tun1 -j logaccept
Não tenho certeza de como "portar" isso para pf
, no entanto. Qualquer sugestão seria muito apreciada!
Responder1
Isso acabou sendo um pf.conf
problema. Algum tempo extra gasto estudando oOpenBSD PF NATpágina me levou à seguinte regra que permitiu que o tráfego passasse corretamente pela tun0
interface:
# /etc/pf.conf
pass out on tun0 inet from 192.168.2.0/24 to any flags S/SA nat-to (tun0) round-robin
Basicamente, isso diz: passe o tráfego da rede local destinado a qualquer endereço em tun0
, IPv4 especificamente, observe apenas os syn
sinalizadores ack
e e execute NAT de saída usando tun0
. Os parênteses ao redor (tun0)
indicam pf
para atualizar automaticamente a regra quando a interface altera seu endereço. Isso pode ocorrer se a sua VPN suportar vários pares e você fizer failover e, portanto, recarregar manualmente o conjunto de regras se tornar desnecessário.
Algum tempo noFiltragem PF do OpenBSDpage me ajudou a refinar a regra:
# /etc/pf.conf
pass out on $vpn_if inet proto { $protos } from $lan_net to any flags S/SA modulate state nat-to ($vpn_if) round-robin
pass in on $vpn_if inet proto { $protos } from $vpn_gw to any flags S/SA modulate state
O modulate state
sinalizador permite pf
substituir um número de sequência inicial mais forte, o que pode ajudar a proteger alguns sistemas operacionais na rede.
O gateway está funcionando muito bem agora e estou em pf.conf
configurações mais complexas.