Router do FreeBSD totalmente aberto no VirtualBox

0

TL; DR - Eu gostaria de configurar uma VM do FreeBSD com uma placa de rede na minha LAN doméstica (192.168.1.0/24) e outra em uma rede privada-interna-para-virtualbox (10.9.9.0/24 ) e passar todo e qualquer tráfego entre os dois.

Usuário Linux de longa data (Debian em servidores), mas usando o FreeBSD há apenas um dia:)

De qualquer forma, para minhas coisas experimentais, eu tenho uma máquina virtual com 2 interfaces de rede - uma conectada à minha LAN doméstica, uma em uma rede interna. Esta máquina é configurada para ser um roteador de bloqueio de nada, simplesmente passando pacotes entre eth0 e eth1, independentemente da origem ou destino. Fácil o suficiente para fazer com iptables -

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Mas eu tenho tentado fazer isso funcionar com pf e estou tendo apenas sucesso parcial.

com

gateway_enable="YES"
pf_enable="YES"
pf_rules="/etc/pf.conf"

no meu /etc/rc.conf e /etc/pf.conf contendo

pass from em1:network to any keep state
pass from em0:network to any keep state
pass in inet proto tcp to any keep state
pass in inet proto udp to any keep state
pass out inet proto tcp to any keep state
pass out inet proto udp to any keep state

Eu posso iniciar um disco ao vivo vm conectado somente ao interno e definir o IP do em1 como o gateway padrão, e ser capaz de executar ping em1, ping em0, mas não consigo executar o ping na máquina host em execução ou em qualquer outro máquina na minha LAN ou conectar via http, ssh, etc.

[root@bsdtest ~]# pfctl -sa
FILTER RULES:
pass in inet proto tcp all flags S/SA keep state
pass in inet proto udp all keep state
pass out inet proto tcp all flags S/SA keep state
pass out inet proto udp all keep state
pass inet from 10.9.9.0/24 to any flags S/SA keep state
pass inet from 192.168.1.0/24 to any flags S/SA keep state

STATES:
all tcp 192.168.1.90:22 <- 192.168.1.10:48102       ESTABLISHED:ESTABLISHED
all udp 192.168.1.2:53 <- 10.9.9.5:59075       NO_TRAFFIC:SINGLE
all udp 10.9.9.5:59075 -> 192.168.1.2:53       SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:34207       NO_TRAFFIC:SINGLE
all udp 10.9.9.5:34207 -> 192.168.1.2:53       SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:43515       NO_TRAFFIC:SINGLE
all udp 10.9.9.5:43515 -> 192.168.1.2:53       SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:1636       NO_TRAFFIC:SINGLE
all udp 10.9.9.5:1636 -> 192.168.1.2:53       SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:60124       NO_TRAFFIC:SINGLE
all udp 10.9.9.5:60124 -> 192.168.1.2:53       SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:8866       NO_TRAFFIC:SINGLE
all udp 10.9.9.5:8866 -> 192.168.1.2:53       SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:25534       NO_TRAFFIC:SINGLE
all udp 10.9.9.5:25534 -> 192.168.1.2:53       SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:30141       NO_TRAFFIC:SINGLE
all udp 10.9.9.5:30141 -> 192.168.1.2:53       SINGLE:NO_TRAFFIC

INFO:
Status: Enabled for 0 days 00:08:28           Debug: Urgent

State Table                          Total             Rate
  current entries                       17               
  searches                            1990            3.9/s
  inserts                              253            0.5/s
  removals                             236            0.5/s
Counters
  match                                253            0.5/s
  bad-offset                             0            0.0/s
  fragment                               0            0.0/s
  short                                  0            0.0/s
  normalize                              0            0.0/s
  memory                                 0            0.0/s
  bad-timestamp                          0            0.0/s
  congestion                             0            0.0/s
  ip-option                              0            0.0/s
  proto-cksum                            0            0.0/s
  state-mismatch                         0            0.0/s
  state-insert                           0            0.0/s
  state-limit                            0            0.0/s
  src-limit                              0            0.0/s
  synproxy                               0            0.0/s
  map-failed                             0            0.0/s

TIMEOUTS:
tcp.first                   120s
tcp.opening                  30s
tcp.established           86400s
tcp.closing                 900s
tcp.finwait                  45s
tcp.closed                   90s
tcp.tsdiff                   30s
udp.first                    60s
udp.single                   30s
udp.multiple                 60s
icmp.first                   20s
icmp.error                   10s
other.first                  60s
other.single                 30s
other.multiple               60s
frag                         30s
interval                     10s
adaptive.start             6000 states
adaptive.end              12000 states
src.track                     0s

LIMITS:
states        hard limit    10000
src-nodes     hard limit    10000
frags         hard limit     5000
table-entries hard limit   200000

OS FINGERPRINTS:
758 fingerprints loaded
[root@bsdtest ~]# 

Alguma ideia? As linhas referentes ao tráfego do udp para o 192.168.1.2 do 10.9.9.5 (meu disco ativo) seriam para o DNS para o meu servidor de nomes de LAN, mas nenhuma resposta chegará ... Veja o que uma solicitação http mostra -

[root@bsdtest ~]# pfctl -sa | grep 80
all tcp 192.168.1.10:80 <- 10.9.9.5:59436       CLOSED:SYN_SENT
all tcp 10.9.9.5:59436 -> 192.168.1.10:80       SYN_SENT:CLOSED
all tcp 192.168.1.10:80 <- 10.9.9.5:59438       CLOSED:SYN_SENT
all tcp 10.9.9.5:59438 -> 192.168.1.10:80       SYN_SENT:CLOSED

Idéias?

    
por ivanivan 30.04.2017 / 16:49

2 respostas

0

OK, encontrou a solução.

Meu /etc/rc.conf está bem do jeito que está ...

O /etc/pf.conf precisa ser

# cat /etc/pf.conf

ext_if="em0"
int_if="em1"
boxnet = $int_if:network
homenet = $ext_if:network

nat on $ext_if from $boxnet to any -> ($ext_if)
pass quick from { lo0, $boxnet, $homenet } to any keep state

Provavelmente muitas variáveis, eu poderia usar o em0 / em1 original.  Enfim, isso te dá -

[root@bsdtest ~]# pfctl -vnf /etc/pf.conf
ext_if = "em0"
int_if = "em1"
icmp_types = "echoreq"
boxnet = "em1:network"
homenet = "em0:network"
nat on em0:network inet from 10.9.9.0/24 to any -> 192.168.1.0/24
nat on em1:network inet from 192.168.1.0/24 to any -> 10.9.9.0/24
pass quick inet from 127.0.0.0/8 to any flags S/SA keep state
pass quick inet from 192.168.1.0/24 to any flags S/SA keep state
    
por 01.05.2017 / 02:34
0

Algumas adivinhações abaixo tão emptor caveat. No entanto, é uma configuração muito típica que confunde muitas pessoas que iniciam combinando roteamento, filtragem de pacotes (firewall) e NAT (Network Address Translation).

Você não afirma claramente, mas imagino que sua rede seja assim:

Internet <-A-> SOHO Router <-B-> Server/workstation <-C-> VM

Seu servidor DNS está na rede B, que é 192.168.1.0/24

Acredito que o seu roteador SOHO na Internet é 192.168.1.1 e está definido como gateway padrão para a rede. Essa seria uma configuração extremamente comum.

Você afirma que o servidor DNS está em 192.168.1.2 e a interface em ponte dos servidores é 192.168.1.10. Por trás disso você tem a rede 10.9.9.0/24.

Sua configuração do iptables encaminhará todos pacotes na interface . Na prática, você envia todos os pacotes de uma rede para outra - até mesmo pacotes locais. Essa é a diferença importante.

Em sua configuração de pf você não encaminha todos pacotes na interface . Você especificou uma rede em1:network . Nós não temos a configuração completa, mas eu acho que você realmente tem uma configuração barebones agradável e funcional. O que te morde são as rotas que faltam.

Quando você envia um pacote a partir do 10.9.9.0/24, ele alcançará a rede 192.168.1.0/24. Seu servidor tem uma perna nessa rede para que você alcance seu DNS diretamente. Mas o servidor DNS na rede B não tem idéia de como alcançar a rede não local C 10.9.9.0/24. Todas as respostas seriam então enviadas para o "roteador padrão", que eu acho que é o seu roteador SOHO. Este roteador também só sabe onde encontrar a rede 192.168.1.0/24 (não 10.9.9.0/24) e normalmente rotearia tudo para o seu link de Internet externo. Nesse caso, você está usando endereços privados apropriados - para que o pacote seja descartado, pois os endereços privados não são roteados na Internet.

A solução "adequada" seria configurar uma rota no seu roteador SOHO, informando-a para rotear os pacotes de 10.9.9.0/24 a 192.168.1.10. Um roteador decente permitirá que você faça isso. Muitos roteadores SOHO baratos infelizmente não. Nesse caso, você poderia adicionar a rota em seu servidor DNS para testá-lo.

  • O motivo pelo qual funciona com o iptables é que o pacote de resposta é visto na interface eth0 e todos os pacotes são encaminhados. Todo o tráfego na rede B é enviado para a rede C (e reverso). Isso inclui tráfego que poderia / deveria ter permanecido local. Com efeito, você configurou uma ponte de rede.
  • O motivo pelo qual ele não funciona para você na sua primeira configuração de pf é que você especificou a rede que espera ver. Apenas uma máquina na rede B sabe onde encontrar a rede C. Isso é 192.168.1.10, pois tem uma interface na rede C. Com efeito, você configurou um firewall básico. A filtragem está pronta, mas você não filtra nada ainda. Mas o roteamento está faltando.
  • A razão que funciona na sua segunda configuração pf (sua própria resposta) é que você NAT a rede 10.9.9.0/24 no espaço de endereço de 192.168.1.0/24. Todo o tráfego da rede C 10.9.9.0/24 na rede B parece vir de 192.168.1.10. O NAT deve ser evitado sempre que possível e ser usado apenas como último recurso .

Se você não precisa / quer filtrar pacotes - então eu aconselho você a não usar um firewall. O que você está tentando fazer deve ser tratado pelo roteamento simples .

    
por 01.05.2017 / 13:21