
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.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
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.