FreeBSD Jail с Loopback IP, IPFW и natd - исходящие соединения терпят неудачу из тюрьмы

У меня есть сервер FreeBSD 9.0. У него несколько тюрем, но у них у всех одна и та же проблема. Они не могут инициировать связи с внешним миром. Они общаются друг с другом и хозяин нормально.

Соответствующий 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"

От sysctl.conf

security.jail.allow_raw_sockets=1

От 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

От natd.conf

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

Это прекрасно работает для входящих соединений. Я проверил с нескольких компьютеров, я могу попасть на сайт просто отлично.

Когда я jexec 1 csh чтобы получить оболочку в тюрьме, я не могу создать исходящее соединение. Тюрьма resolv.conf указывает на хост-сервер, и он хорошо выполняет разрешение имен. С ICMP, все еще передаваемым без исключения, я могу пропинговать из тюрьмы.

Я могу сделать tcpdump -i wan0 host 1.2.3.4 на хост и смотреть трафик, как он проходит. Я вижу, как SYN гаснет, а SYN ACK возвращается. Затем, через несколько секунд, снова повторяется попытка Jail.

Как я могу разрешить исходящие соединения из моей тюрьмы?

Обновление:
Я верю, что понимаю проблему. Исходящий пакет запускается через правила брандмауэра, получает преобразованный NAT, разрешенный и записанный как внешний IP-адрес, устанавливающий исходящее соединение. Когда возвращаемый пакет возвращается, он проходит трансляцию, но теперь не соответствует правилу проверки состояния, поскольку пакет имеет внутренний IP-адрес. Все еще в поисках решения.

1 ответ

Решение

Решение проблемы должно было быть очевидно из проблемы, заключающейся в том, что преобразование адресов всегда происходило до проверки правил состояния. Перевод адреса должен быть разделен.

Исправленная версия правил, найденных выше:

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
Другие вопросы по тегам