歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> BSD >> FreeBSD PF 防火牆及 NAT 初次架設

FreeBSD PF 防火牆及 NAT 初次架設

日期:2017/2/28 11:27:34   编辑:BSD


  這 台 FreeBSD 服務器第一個用途是作為防火牆,再來是做 IP 分享,然後架設各種服務器(如 HTTP)和一些服務(如 MLDonkey)。兩張網卡,其中 vr0 對外連接 ADSL 調制解調器,設有固定 IP;vr1 則是對內連接另一台電腦。這裡描述一個基本的設定。
net.inet.ip.forwarding=1
ftp-proxy stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy
# inetd 一定要記得啟動
inetd_enable="YES"
# pf 防火牆的東西
pf_enable="YES"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
# 要開下面這個才能玩 NAT
gateway_enable="YES"
QUOTE:# -------------------- 先定義基本宏
ext_if = "vr0" # 連往 ADSL 的界面
int_if = "vr1" # 連往內部網絡的接口
# 定義內部網絡區段,這些是絕不應該出現在連外接口 $ext_if 的
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"
# -------------------- 再定義要開放的服務
# 這邊是我們要開放給因特網的服務。我們有架 Apache,所以要開 HTTP
# 至於 113 則是 IDENT,一些服務如 IRC、台灣部份 BBS 會用到
tcp_services = "{ http, https, 113 }"
# MLDonkey 需要開的連接?
# 6881-6889 是 BT 用的,33333 是我設定的 ed2k 連接埠,UDP 就是 33333+4
# 至於 44444 則是我設定的 Kad 連接埠,這個在 TCP 和 UDP 都是一樣的
# 其它 MLDonkey 連接埠參考:
mldonkey_tcp_ports = "{ 6881, 6882, 6883, 6884, 6885, 6886, 6887, 6888, 6889, 33333, 44444 }"
mldonkey_udp_ports = "{ 33337, 44444 }"
# 下面這些是只打算開放給內部使用的服務
# 4001、4080 均是 MLDonkey 的控制接口
priv_tcp_services = "{ ssh, 4001, 4080, http }"
# 允許的 ICMP 類型(主要為 ping、tracert 等工具)
icmp_types = "echoreq"
# -------------------- 設定選?
# 好國民要用這個設定,狠心人就別用 return 改成 drop 吧
set block-policy return
# 只記錄 $ext_if 的東西
set loginterface $ext_if
# -------------------- Normalization 動作
# 基本動作,把所有封包弄整齊
scrub in all
# -------------------- 地址轉譯 (NAT) 部份
# 做 NAT
nat on $ext_if from $int_if:network to any -> ($ext_if)
# 這個重新導向是給 ftp-proxy 用的
rdr on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021
# -------------------- 封來過濾規則
# 開始過濾封包,一開始先全擋
block all
# loopback 上的東西基本上都要允許
pass quick on lo0 all
# 把對外接口上絕對不應該出現的 IP 擋掉,避免偽造 IP 來源
block drop in quick on $ext_if from $priv_nets to any
block drop out quick on $ext_if from any to $priv_nets
# 開啟要提供給外面的人用的服務
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services flags S/SA keep state
# 開啟 MLDonkey 要用的連接?
pass in on $ext_if inet proto tcp from any to ($ext_if) port $mldonkey_tcp_ports flags S/SA keep state
pass in on $ext_if inet proto udp from any to ($ext_if) port $mldonkey_udp_ports keep state
# 開啟供內部網絡用的服務
pass in on $int_if inet proto tcp from any to ($int_if) port $priv_tcp_services flags S/SA keep state
# 讓 ICMP 數據通過
pass in inet proto icmp all icmp-type $icmp_types keep state
# 很松的規則,假定內部網絡使用者都是好人。這個以後再鎖緊
pass in on $int_if from $int_if:network to any keep state
pass out on $int_if from any to $int_if:network keep state
# 讓對外接口的數據出得去
pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state

一切完成,先要用 sysctl 做單次設定(除非打算重新開機):
sysctl net.inet.ip.forwarding=1
然後啟動 pf,並讀入 pf 規則
Copyright © Linux教程網 All Rights Reserved