用Packet Filter(PF) 做 IP mapping 遇到問題 - BBS

Rebecca avatar
By Rebecca
at 2010-04-30T16:21

Table of Contents

架構大致如下:
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 介面送出.

想請教不知道有沒有人有這方面的經驗可以指點問題在哪?

--
Tags: BBS

All Comments

關於Sendmail AUTH Login 的問題

Iris avatar
By Iris
at 2010-04-28T21:21
小弟的FreeBSD 是7.2 sendmail是 8.14.3 Cyrus SASL 2.1.23 下了sendmail -d0.1 -bv root | grep SASL指令 出現NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS PIPELINING SASL ...

cp或mv時 顯示狀態

Mary avatar
By Mary
at 2010-04-27T16:02
※ 引述《slinbody (不敗地球人)》之銘言: : 我想問bsd下 : 有沒有可以取代cp或mv而且可以顯示工作進度的軟體 : 常常再搬移大檔案時 一按enter就要等很久 : 像window貼上時 都會有個目前進度(雖然剩餘時間不太準) : 唯一想到的 就是用ftp在local上般 : 不知道有 ...

cp或mv時 顯示狀態

Delia avatar
By Delia
at 2010-04-27T15:16
我想問bsd下 有沒有可以取代cp或mv而且可以顯示工作進度的軟體 常常再搬移大檔案時 一按enter就要等很久 像window貼上時 都會有個目前進度(雖然剩餘時間不太準) 唯一想到的 就是用ftp在local上般 不知道有沒有人有什麼好主意?? - ...

大家的 FreeBSD 都拿來做甚麼事情比較多 ?

Caroline avatar
By Caroline
at 2010-04-27T07:58
※ 引述《Peterick (內有名片自介 ♂)》之銘言: : 小弟在這個版面潛水很久了 ... : 雖然人氣沒有很旺 , 但是板上臥虎藏龍的高手著時不少 : 最近有個客戶 , 他們單位裡面只有一台 Server 2008 : 拿來當 WEB 同時也是內部防毒的主機 : 最近他們單位有汰換一些電腦 : 我有挑 ...

wineconsole的中文問題

Noah avatar
By Noah
at 2010-04-24T19:39
google大神的解法似乎只有解決開不了的部份: ex. $ setenv LANG en_EN.UTF-8; wineconsole cmd 這確實解決了我打不開程式的問題 但是新的問題是我的exe用console打開後全是亂碼@@ 我記得以前為了可以跑中文的軟體,在Font裡面放了一個MingLiu ...