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.