Roteador FreeBSD totalmente aberto no VirtualBox

Roteador FreeBSD totalmente aberto no VirtualBox

DR - Eu gostaria de configurar uma VM 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 só uso FreeBSD há cerca de um dia :)

De qualquer forma, para minhas experiências, tenho uma máquina virtualbox com 2 interfaces de rede - uma conectada à minha LAN doméstica e outra em uma rede somente interna. Esta máquina está configurada para ser um roteador sem bloqueio, simplesmente passando pacotes entre eth0 e eth1, independentemente da origem ou destino. Fácil de fazer com iptables -

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

Mas tenho tentado fazer isso funcionar com o PF e só estou tendo sucesso parcial.

Com

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

no meu /etc/rc.confe /etc/pf.confcontendo

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

Posso iniciar um disco ao vivo vm conectado apenas ao interno e definir o IP do em1 como o gateway padrão e ser capaz de executar ping em1, executar ping em0, mas não consigo executar ping na máquina host em que o vbox está sendo executado ou em qualquer outra máquina no meu LAN ou conecte 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 relativas ao tráfego udp para 192.168.1.2 de 10.9.9.5 (meu disco ativo) seriam para DNS para meu servidor de nomes de LAN doméstico, mas nenhuma resposta chega... Aqui está 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

Ideias?

Responder1

OK, encontrei 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 apenas o em0/em1 original. De qualquer forma, isso lhe 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

Responder2

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

Você não afirma isso claramente - mas eu acho que sua rede é assim:

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

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

Suponho que seu roteador SOHO da Internet seja 192.168.1.1 e esteja definido como gateway padrão para a rede. Esta seria uma configuração extremamente comum.

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

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

Na sua configuração de pf você faznãoavançartodospacotes nointerface. Você especificou umrede em1:network. Não temos a configuração completa, mas acho que você realmente tem uma configuração simples e funcional. O que te morde são as rotas que faltam.

Quando você envia um pacote da rede 10.9.9.0/24, ele alcançará a rede 192.168.1.0/24. Seu servidor tem uma entrada nessa rede, então você acessará seu DNS diretamente. Mas o servidor DNS na rede B não tem ideia de como acessar a rede C 10.9.9.0/24 não local. Todas as respostas seriam enviadas para o "roteador padrão", que acho que é o seu roteador SOHO. Este roteador também sabe apenas onde encontrar a rede 192.168.1.0/24 (não 10.9.9.0/24) e normalmente encaminharia tudo para o seu link externo de Internet. Nesse caso, você está usando endereços privados adequados - portanto, o pacote seria descartado, pois os endereços privados não são roteados na Internet.

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

  • A razão pela qual funciona para você 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). Isto inclui o tráfego que poderia/deveria ter permanecido local. Na verdade, você configurou uma ponte de rede.
  • A razão pela qual isso não funciona para você com sua primeira configuração de PF é que você especificou qual rede espera ver. Apenas uma máquina na rede B sabe onde encontrar a rede C. Este é 192.168.1.10, pois possui uma interface na rede C. Na verdade, você configurou um firewall básico. A filtragem está pronta, mas você ainda não filtra nada. Mas falta roteamento.
  • A razão pela qual funciona em sua segunda configuração de 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 parecerá vir de 192.168.1.10.NAT deve ser evitadosempre que possível e usado apenas como último recurso.

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

Responder3

Se você deseja ter um gateway "totalmente aberto", poderá fazer isso apenas com uma única regra:

pass all allow-opts

Não foi necessário mexer com "manter estado" explícito nem com sinalizadores.

informação relacionada