[精讚] [會員登入]
989

[Freebsd] 利用pf達成port forwarding 及nat

為了達成port forwarding 及NAT 的功能,不斷思考加上試了三天終於試出來。

此文完整連結 http://n.sfs.tw/10604

複製連結 [Freebsd] 利用pf達成port forwarding 及nat@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-18 16:38:22 最後編修
2017-01-13 10:43:27 By 張○○
 

自動目錄

二台伺服器同時都要連網,這樣就會有兩個對外的ip,能確保dns在切換收斂的過程中,無論來自哪個ip都能正確的回應。

一台主要是當成router,另一台才是真正的web server

利用pf達成port forwarding 及nat

Freebsd 的pf是防火牆,也能設定成nat,這次使用pf來完成

為了達成port forwarding 及NAT 的功能,不斷思考加上試了三天終於試出來,由於這部分網路上幾乎沒有足夠的資訊,所以這篇應該對部分有此需求的人有幫助。

目的說明

1. Web server 需要兩個外部線路進入,但是只能設單一路由,預設路由是往外線路二。
2. 加入另一部伺服器Router,預設路由是往外線路一,專門只做路由的事。
3. 由外部線路一進到Router後,會轉送到 Web的bge0介面,並在Router bge1出口帶入10.200.0.244的ip
4. Web bge0回應來自Router bge1的流量後,會沿原路由往外線路一回到Internet。
5. 因此,第3點要達成port forwarding的功能,在Router的bge0/1介面都要作NAT的功能。

OS

[Web Server] FreeBSD 7.1-RC1 #0: Mon Jul 30 04:18:28 CST 2012
[Router Server]  FreeBSD 9.2-PRERELEASE #0 r255473: Wed Sep 11 23:30:26 CST 2013

網路設定 rc.conf

[Web Server]
ifconfig_bge1="inet 10.200.0.254  netmask 255.255.0.0"
ifconfig_bge0="inet 123.45.67.8 netmask 255.255.255.0"
defaultrouter="123.45.67.254"

[Router Server]
ifconfig_bge1="inet 10.200.0.244  netmask 255.255.0.0"
ifconfig_bge0="inet 211.75.190.1 netmask 255.255.255.0"
defaultrouter="211.75.190.254"

#NAT
gateway_enable="YES"
#PF
pf_enable="YES"
pflog_enable="YES"

Router之 pf設定 pf.conf

ext_if="bge0"                          #HINET

int_if="bge1"                          #LAN 10

lan_net="10.200.0.0/16"               # LAN Subnet

rdr_service="{53 80}"                 # 轉送的服務

# 外部線路出口時內部ip轉成外部ip 211.75.190.1 出口

nat on $ext_if from $lan_net -> ($ext_if)

# 外部線路出口時,若非來自內部ip則不帶外部ip 211.75.190.1 出口

no nat on $ext_if from !$lan_net to any

# 到內部介面時,轉成 10.200.0.244     

nat on $int_if from any -> 10.200.0.244

# 外部介面來的封包全往 10.200.0.254送

rdr on $ext_if proto {tcp,udp} from any to ($ext_if) port $rdr_service -> 10.200.0.254

啟動pf
# pfctl -f /etc/pf.conf

查看
# pfctl -sn
nat on bge0 inet from 10.200.0.0/16 to any -> (bge0) round-robin
no nat on bge0 inet from ! 10.200.0.0/16 to any
nat on bge1 inet all -> 10.200.0.244
rdr on bge0 inet proto tcp from any to (bge0) port = domain -> 10.200.0.254
rdr on bge0 inet proto tcp from any to (bge0) port = http -> 10.200.0.254
rdr on bge0 inet proto udp from any to (bge0) port = domain -> 10.200.0.254
rdr on bge0 inet proto udp from any to (bge0) port = http -> 10.200.0.254

檢測結果

tcpdump是一個不錯的檢測工具,他能列出即時的流量來源

# tcpdump -i bge0 tcp port 80

[Web Server]
11:36:46.133768 IP 10.200.0.254.http > 10.200.0.244.64240: . 1461:2921(1460) ack 628 win 8212
11:36:46.136730 IP 10.200.0.244.52076 > 10.200.0.254.http: . ack 41449 win 16425
11:36:46.137754 IP 10.200.0.244.58499 > 10.200.0.254.http: . ack 1 win 16425
11:36:46.139073 IP 10.200.0.254.http > 10.200.0.244.52076: . 47289:48749(1460) ack 1897 win 8212
11:36:46.139101 IP 10.200.0.254.http > 10.200.0.244.52076: . 48749:50209(1460) ack 1897 win 8212
表示有從 244送到254的封包,且有正確回應

[Router Server]
bge0

14:45:52.616392 IP 163.17.40.149.60910 > 211-75-190-1.HINET-IP.hinet.net.http: Flags [.], ack 1, win 16425, length 0
14:46:03.857683 IP 163.17.40.149.60910 > 211-75-190-1.HINET-IP.hinet.net.http: Flags [F.], seq 1048, ack 40489, win 16425, length 0
14:46:03.857992 IP 211-75-190-1.HINET-IP.hinet.net.http > 163.17.40.149.60910: Flags [.], ack 1049, win 8212, length 0

bge1
14:47:23.833219 IP 211.75.190.1.50780 > 10.200.0.254.http: Flags [.], ack 33773, win 10537, length 0
14:47:23.906264 IP 10.200.0.254.http > 211.75.190.1.64077: Flags [.], seq 1:1461, ack 628, win 8212, length 1460
分別有正確的轉送

結語

對我而言真是一件不容易工作,不過達成了心情爽

參考資料

[1] PF-利用 PF 輕鬆達成 NAT http://www.weithenn.org/cgi-bin/wiki.pl?PF-%E5%88%A9%E7%94%A8_PF_%E8%BC%95%E9%AC%86%E9%81%94%E6%88%90_NAT

[2] 用FreeBSD9架設pf + NAT - Coding Life http://coding.memory-forest.com/%E7%94%A8freebsd9%E6%9E%B6%E8%A8%ADpf-nat.html


原文 2013-09-12 11:54:46

你可能感興趣的文章

Freebsd11+sudo 使用sudo模組讓帳號具有root權限 linux系列中很好用的sudo,在freebsd中也可以使用

[FREEBSD] AMD64 CPU 編譯核心 Freebsd8+ AMD64 CPU 編譯核心

[FREEBSD] 使用 logrotate 來管理及備份日誌檔 Unix 系統中的日誌檔存放在 /var/log/ 中,可供我們查錯及觀察使用。日誌檔最大的問題是會不斷的長大。

Freebsd上php+ session 的問題 php的session在freebsd上竟然預設是關掉的?簡直沒氣死我。

[FreeBSD] 查看檔案詳細資訊 利用stat查看檔案詳細資訊

設定友善的FREEBSD shell環境 FREEBSD 的原始SHELL很不友善,以下設定可以讓你的FREEBSD 很友善,和CENTOS差不多,這樣子FREEBSD 就有好用的介面。

[FREEBSD11] ssh登入時免輸入密碼 自動程式需要進到別台機器時,沒辦法使用交談式方式輸入密碼,發現一個簡單的方法設定

[Freebsd8] PHP<5.5 安裝APC Freebsd8 上(php<5.5版本)安裝 pecl-APC

[Freebsd] 定時測試 ADSL 是否斷線並重連 中華電信 ADSL 雖有固定 ip,可是他卻會不定時「斷線」, 使用以下的 方法可以定時測試是否斷線,以及重新撥接。

[FREEBSD10] 解決vi/vim的中文字亂碼問題 vi, vim在Freebsd10使用UTF8時,中文字會出現亂碼,解決方法

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[jQuery] textarea 的取值和給值 HTML 的 TEXTAREA 標籤若要用 jquery 取值,不能使用 .text() 或 .html() ,使用 .

[HP DL380G7] 生效啟動第3,4片網卡/開啟或關閉內建的網卡 HP DL380G7 預設第3,4片網卡裝完系統後找不到,難道是壞了?要怎麼辦?

如何在linux下執行java 原生的java應用程式可以使用簡單的方法在console下面寫出來,適合作簡單的應用

[Freebsd] 使用 ADSL 撥接上網 Freebsd上要使用 ADSL 撥接上網,該如何設定?

PHP for sphinx 函式庫安裝 PECL/sphinx PHP>= 5.2.2 已經能原生支援 sphinx,可是預設的沒有裝,我們得自己裝才能用