作者yzupcbug (请加入HOT_Game板)
看板FreeBSD
标题[请益] 用Packet Filter(PF) 做 IP mapping 遇到问题
时间Fri Apr 30 16:21:42 2010
架构大致如下:
PC1(server)--| pppoe1 | | |
PC2----------|em1 FreeBSD pppoe2 em0|----|FTTB VDSL|
PC3----------| | | |
IP如下:
PC1: 192.168.198.3/24
PC2: 192.168.198.4/24
PC3: 192.168.198.5/24
FreeBSD
em1: 192.168.198.254/24
em0不带IP
pppoe1: 固IP, next-hop 1.1.1.1, 介面为tun0
pppoe2: 动IP, next-hop 1.1.1.2, 介面为tun1
想要达到的目的:
由 FreeBSD 拨接 PPPoE 出去取得 public IP, 然後 固IP mapping 到 PC1,
使得外面连线到 固IP 时, 就等同於连线到 PC1;
而 动IP 则作为其它 PC 连外的 NAT(更正确应该说是 PAT) 使用
做法:
使用PF, 设定档pf.conf如下:
int_if="em1"
int_ip="192.168.198.254"
int_lan="192.168.198.0/24"
dyn1_if="tun1"
dyn1_gw="1.1.1.2"
static_if="tun0"
static_gw="1.1.1.1"
set block-policy return
scrub in all
#将固IP介面上, src为内网的封包做NAT转换为固IP
nat on $static_if from $int_lan to any -> $static_if
#将动IP介面上, src为内网的封包做NAT转换为动IP
nat on $dyn1_if from $int_lan to any -> $dyn1_if
#将连线到固IP的port 220 转到192.168.198.3, 测试看看.
rdr on $static_if from any to $static_if port 220 -> 192.168.198.3
pass all
#抓取预设出口端的封包, 若src为固IP的就将下一站设为固IP的下一站
pass out on $dyn1_if route-to ($static_if $static_gw) proto tcp from $static_if to any flags any
pass out on $dyn1_if route-to ($static_if $static_gw) proto {udp,icmp} from $static_if to any
#因仅指定的来源转去固IP, 不会有其他封包走错路到static_if
#pass out on $static_if route-to ($dyn1_if $dyn1_gw) proto tcp from $dyn1_if to any flags any
#pass out on $static_if route-to ($dyn1_if $dyn1_gw) proto {udp,icmp} from $dyn1_if to any
#设定PUM server的封包改走static if出去
pass in on $int_if route-to ($static_if $static_gw) proto tcp from 192.168.198.3 to any flags any
pass in on $int_if route-to ($static_if $static_gw) proto {udp,icmp} from 192.168.198.3 to any
结果:
PC1 连线去外面的话, 如预期地走 固IP 出去;
但若是外面连到 固IP port 220,则会有问题, 出现的状况如下:
1.FreeBSD 转送了该 SYN 封包给 PC1
2.PC1 回送 SYN/ACK 封包 给外面来源
3.FreeBSD 从em1收到该封包, 经过转换後, src 换成 固IP
4.该封包就这样依照 default gateway 是走 动IP 的介面而送出去了,
没有再被抓回来转送到 固IP 介面送出.
想请教不知道有没有人有这方面的经验可以指点问题在哪?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.200.156