web-dev-qa-db-ja.com

ループバックIP、IPFW、およびnatdを使用したFreeBSDJail-アウトバウンド接続がjailから失敗する

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

これは、着信接続に最適です。私は複数のコンピューターからテストしましたが、Webサイトに問題なくアクセスできます。

刑務所にシェルを入れるためにjexec 1 cshすると、発信接続を作成できません。刑務所のresolv.confはホストサーバーを指しており、名前解決をうまく実行します。 ICMPが例外なく渡されているので、刑務所からpingを実行できます。

ホストでtcpdump -i wan0 Host 1.2.3.4を実行し、通過するトラフィックを監視できます。 SYNが消え、SYNACKが戻ってきます。それから数秒後、刑務所が再試行するのと同じように再び。

刑務所からの発信接続を許可するにはどうすればよいですか?

更新
私は問題を理解していると思います。発信パケットはファイアウォールルールを介して開始され、NAT変換され、許可され、発信接続を確立する外部IPとして記録されます。戻りパケットが返されると、変換されますが、現在は変換されません。パケットには内部IPがあるため、チェック状態ルールに一致します。まだ解決策を探しています。

6
Chris S

状態ルールがチェックされる前にアドレス変換が常に発生していたという問題から、解決策は明らかでした。アドレス変換は分割する必要があります。

上記のルールの修正バージョンは次のとおりです。

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
2
Chris S