FreeBSD Jail com Loopback IP, IPFW e natd - Conexões de saída falham da cadeia

6

Eu tenho um servidor FreeBSD 9.0. Tem várias prisões, mas todas elas têm esse mesmo problema. Eles não podem iniciar conexões com o mundo exterior. Eles se comunicam entre si e com o anfitrião bem.

configurações relevantes de rc.conf :

firewall_enable="YES"                   # IPFW
firewall_type="/etc/ipfw.rules"         # Rule script for IPFW

natd_enable="YES"                       # NAT for Internet Routing
natd_interface="wan0"                   # NAT Card
natd_flags="-f /etc/natd.conf -dynamic" # NAT Conf

ifconfig_lo1_name="jail1"
ifconfig_jail1="inet 192.168.1.101/32"

jail_asdf_rootdir="/jails/asdf"
jail_asdf_hostname="asdf.example.net"
jail_asdf_ip="192.168.1.101"
jail_asdf_devfs_enable="YES"

De sysctl.conf

security.jail.allow_raw_sockets=1

De ipfw.rules

# XXX 00050 divert natd ip4 from any to any via wan0
add 00060 check-state

# Allow me out
add 00135 allow ip from me to any keep-state
add 00136 allow ip6 from me6 to any keep-state

# HTTP
add 11010 allow tcp from any to me http setup keep-state
add 11011 allow tcp from any to me6 http setup keep-state
add 11012 allow tcp from any to me https setup keep-state
add 11013 allow tcp from any to me6 https setup keep-state
.... lots more rules like the above ....

# General Network - ICMP
add 61001 allow icmp from any to any

# XXX last rule is deny everything

De natd.conf

redirect_port tcp 192.168.1.101:80 80
redirect_port tcp 192.168.1.101:443 443

Isso funciona muito bem para conexões de entrada. O teste que fiz de vários computadores, posso chegar ao site muito bem.

Quando eu jexec 1 csh para obter um shell no Jail, não consigo criar uma conexão de saída. O resolv.conf do Jail aponta para o servidor host e executa bem a resolução de nomes. Com o ICMP sendo passado sem exceção, eu posso pingar da prisão.

Eu posso fazer um tcpdump -i wan0 host 1.2.3.4 no host e observar o tráfego conforme ele passa. Eu vejo o SYN sair, e um SYN ACK volta. Então, alguns segundos depois, o mesmo novamente que a prisão tenta novamente.

Como posso permitir conexões de saída de minhas cadeias?

Atualizar :
Eu acredito que entendi o problema. O pacote de saída começa pelas regras de firewall, obtém NAT traduzido, permitido e gravado como o IP externo que faz uma conexão de saída. Quando o pacote de retorno volta, ele passa pela tradução, mas agora não corresponde à regra do estado de verificação, pois o pacote tem o IP interno. Ainda procurando por uma solução.

    
por Chris S 14.03.2013 / 02:54

1 resposta

2

A solução deveria ser óbvia pelo problema de que a tradução do endereço estava sempre ocorrendo antes que as regras de estado fossem verificadas. A tradução do endereço precisa ser dividida.

A versão corrigida das regras encontradas acima é:

add 00050 divert natd ip4 from any to any via wan0 in
add 00060 check-state

# Talking to myself
add 00200 allow ip from me to me keep-state

# HTTP
add 11010 skipto 63000 tcp from any to me http,https setup keep-state
add 11011 skipto 63000 tcp from any to me6 http,https setup keep-state

# General Network - ICMP
add 61001 allow icmp from any to any

# Last rule of "normal" traffic
add 62000 deny ip from any to any

# Only for my outbound and specifically allowed incoming
add 63000 divert natd ip from any to any via wan0 out
add 63001 allow ip from any to any

# XXX last rule is deny everything
    
por 15.03.2013 / 14:55