FreeBSD的Jail与Loopback IP、IPFW和natd - Jail中的出站连接失败

我有一个FreeBSD 9.0服务器。它有几个jail,但它们都有同样的问题。它们无法与外部建立连接。它们之间和主机之间的通信正常。 相关的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在Jail中获取一个shell时,我无法创建一个出站连接。Jail的resolv.conf指向主机服务器,并且它可以正常执行名称解析。尽管ICMP仍然被传递而没有异常,但我可以从Jail中ping通。

我可以在主机上执行tcpdump -i wan0 host 1.2.3.4并观察通过的流量。我看到SYN发出,然后返回一个SYN ACK。然后几秒钟后,Jail重新尝试,同样的情况再次发生。

如何允许我的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

  • 相关问题