史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 應用軟體使用技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2003-10-01, 09:42 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 PktFilter-0.06-beta2防火牆 使用測試

工具分類:防 火 牆
執行平台:Windows
工具大小:324623 Bytes
文件MD5 :5201242edec1b00147917e6a8de2f5bd
工具來源:http://sourceforge.net/projects/pktfilter/

執行在Windows 2000/XP/2003上的包過濾防火牆,使用類似IP Filter語法的規則。




@PktFilter使用參考


tombkeeper@whitecell.org


/*
這份我的文件主要是關於PktFilter 所附帶的PktFilter.pdf,修正了一些原文的錯誤,增
加了一些我自己的使用經驗。

我喜歡這個防火牆主要是因為資源佔用比較少,UNIX風格,沒有圖形界面,沒有討厭的
的系統托盤圖示。

和IP Filter一樣,這個防火牆不是為對安全一無所知或者略有所知的人設計的,要打
算使用它請確定你瞭解TCP/IP 傳輸協定等基礎知識。如果對程序有問題,請寫信問程序作
者:Jean-Baptiste.Marchand@hsc.fr。如果對使用有問題,也請寫信問作者。我對這
份我的文件、規則產生指令碼、修改過的程序不提供任何支持。
*/



PktFilter是一個執行在Windows 2000/XP/2003上的包過濾防火牆。

PktFilter自己並沒有實現網路過濾驅動,事實上它是系統本身包過濾機制的一個配置
界面。Windows 2000以上的操作系統都有一個IpFilterDriver 服務,但是系統本身卻
沒有提供好用的配置界面。

因為是使用系統自身的機制,所以PktFilter工作得很穩定,佔用資源也較少,但也正
因為如此,PktFilter的功能實現也受限於系統。

PktFilter的規則語法其實是IP Filter4的一個子集。可以參考http://www.ipfilter.org/。


----------
安裝使用:
----------

為PktFilter新增一個目錄,將pktfltsrv.exe和pktctl.exe拷貝進來。

新增規則文件。大家可以根據下面介紹的語法自己編寫規則。如果把PktFilter安裝在
一台作為網關的電腦上,並編寫相應的規則,那麼PktFilter 可以很好地作為一個網
絡防火牆工作。

如果只是用來保護個人電腦,不需要設定太複雜的規則,那麼你可以使用我寫的指令碼
rulesbuild.cmd。只需設定文件開頭的一些變數,就可以迅速地產生一個規則。

安裝啟動服務:
C:\PktFilter> pktfltsrv -i "C:\PktFilter\PktFilter.conf" "C:\PktFilter\PktFilter.log"

C:\PktFilter> net start pktfilter


-------------
過濾規則介紹:
-------------

全局選項
option
small_frags, 拒絕太小的的分片包,預設small_frags是指小於16 bytes的
分片包。這個值可以通過建立註冊表
HKLM\SYSTEM\CurrentControlSet\Services\IpFilterDriver\FragmentThreshold
來設定。
strong_host, 這個我的文件裡面沒說,但是程序支持,MSDN的解釋是
「Causes a check of the destination address of incoming packets.」
check_frags,這個我的文件裡面沒說,但是程序支持,MSDN的解釋是
「Causes a check of the fragments from the cache.」
過濾動作
pass, 允許
block, 阻塞

方向
in, 進來的
out, 出去的

傳輸協定
proto, 包括:
tcp, TCP 傳輸協定
udp, UDP 傳輸協定
icmp, ICMP 傳輸協定
[number], 指定其他的IP傳輸協定號
[empty], 所有傳輸協定

源位址
from [addr], 指定一個IPv4位址
from [subnet/mask],指定一個網路

源連接埠(僅限TCP/UDP傳輸協定)
port [陳述式] [連接埠號]
陳述式包括:
=
>=
>
<=
<
>< 連接埠範圍

目標位址
to [addr], 指定一個IPv4位址
to [subnet/mask],指定一個網路

目標連接埠(僅限TCP/UDP傳輸協定)
port [陳述式] [連接埠號]
陳述式包括:
=
>=
>
<=
<
>< 連接埠範圍

ICMP類型和程式碼
icmp-type [type]
icmp-code [code]

TCP連接建立
established, 阻塞只有SYN標誌位而沒有ACK標誌位的TCP包,放在規則末尾表示
只允許連接建立後的TCP包通過。

-----
例子:
-----

# drop packets composed of small fragments
option small_frags on eth0
# default behavior = deny everything
block in on eth0 all
block out on eth0 all
# allow DNS resolution to our nameserver
pass out on eth0 proto udp from 192.168.1.1 port > 1023 to 192.168.1.254 port = 53
pass in on eth0 proto udp from 192.168.1.254 port = 53 to 192.168.1.1 port > 1023
# allow inbound ICMP traffic (ping)
pass in on eth0 proto icmp from any to 192.168.1.1 icmp-type echo
pass out on eth0 proto icmp from 192.168.1.1 type echo-rep to any
# allow RDP (Terminal Services) administration from our administration subnet
pass in on eth0 proto tcp from 10.42.42.0/24 port > 1024 to 192.168.1.1 port = 3389
pass out on eth0 proto tcp from 192.168.1.1 port = 3389 to 10.42.42.0/24 port > 1024 established


-------------
過濾規則參考:
-------------

過濾規則由全局選項(global-option)和普通規則(normal-rule)組成。

全局選項的語法:
"option" global_option iface

現在支持的global-option只有"small_frags"。

普通規則的語法:
action [in-out] iface [proto_spec] ip [proto-options]

action = "pass" | "block"
in-out = "in" | "out"
iface = "on" ifname digit
ifname = "eth*" | "ppp" | "sl" | "lo" | "tr" | "fd"
proto_spec = "proto" [proto]
proto = "tcp" | "udp" | "icmp" | "any" | ip_proto
ip_proto = decnumber
decnumber = digit [decnumber]
ip = "all" | "from" ip-addr [port-comp | port-range] "to" ip-addr
[port-comp | port-range]
ip-addr = "any" | ip-dotted-addr [ip-mask]
ip-dotted-addr = host-num "." host-num "." host-num "." host-num
host-num = digit [digit [digit]]
ip-mask = "/" ip-addr | decnumber
port-comp = "port" comparator decnumber
comparator = ">" | ">=" | "<" | "<=" | "="
port-range = "port" decnumber "><" decnumber
proto-options = "icmp-type" icmp-type ["code" icmp-code] | "established"
icmp-type = "echorep" | "unreach" | "squench" | "redir" | "echo" | "router_adv"|
"router_sol" | "timex" | "paramprob" | "timest" | "timestrep" |
"inforeq" | "inforep" | "maskreq" | "maskrep"
icmp-code = decnumber


-----------------
pktctl指令的用法:
-----------------

pktctl有兩種用法:指令行模式和交互模式。pktctl -i進入交互模式。


列出網路接頭:
C:\> pktctl -I
eth0: (3Com EtherLink PCI): 192.168.0.1

載入規則文件:
C:\> pktctl -f rules.txt
pktctl> source rules.txt

先清除所有已載入的規則再載入規則文件:
C:\> pktctl -F rules.txt
pktctl> reload rules.txt

手工臨時增加一條規則:
C:\> pktctl -a "pass in on eth0 from 10.0.0.42 to any"
pktctl> pass in on eth0 proto udp from 10.0.0.42 to any

列出指定接頭上的規則:
C:\> pktcl -l eth0
pktcl> list on eth0

列出指定接頭上的規則和規則號:
option:
C:\> pktcl -L eth0
pktcl> List on eth0
在刪除規則的時候需要指定規則號。

刪除規則:
C:\> pktctl -d 2 eth0

刪除指定接頭上的所有規則:
C:\> pktctl -Fa eth0
pktctl> flush on eth0

刪除所有接頭上的所有規則:
C:\> pktctl -Fa all
C:\> pktctl -Fa
pktctl> flush on all

顯示過濾情況的統計資料:
C:\> pktctl -s eth0
pktctl> stats on eth0

顯示過濾情況的詳細統計資料:
C:\> pktctl -S eth0
pktctl> Stats on eth0


----------------------
pktfltsrv的指令行選項:
----------------------
-i "path_to_rules_file" "path_to_log_file"
-u: uninstalls the service.



一些問題:

1、在Windows XP + SP1 上不能記錄日誌。
這是XP的問題,SP1 iphlpapi.dll的PfSetLogBuffer函數工作不正常。(這個問題是PktFilter郵件列表上的)

2、增加某些格式不正確的規則時可導致服務崩潰。

3、因為只有SDK的WinBase.h才定義了INVALID_SET_FILE_POINTER。所以編譯pktfltsrv的時候需要在
VS的tools--options裡面把SDK的include目錄放到最前面。我現在的機器沒有安裝SDK,
是把以前的安裝目錄copy過來用的,所以需要手工設。我不記得直接安裝SDK後是否會直接用SDK的文件覆蓋VC的文件,
如果那樣的話,可能就不需要多此一舉了。

4、在Windows 2000 Pro版本上未必能夠執行,我沒試驗,只是MSND談到那些函數的時候總是說:
「Included in Windows 2000 Server and Windows .NET Server.」

5、pktctl.exe -l指令列規則的時候橋接器和傳輸協定兩個字段之間沒有空格,我給加了一個。filter_stats.c/70行。
可能作者沒留神少了一句,所以ICMP類型和狀態碼不能記錄下來,加上了。logging.c/187行。
不能記錄ttl,tcp視窗值等信息,加上了。
有些記錄格式我看著不習慣,改了。

6、程序實現原理可以參考:
http://msdn.microsoft.com/library/de..._reference.asp

附:規則產生指令碼:


@echo off

echo # 規則由PktFilter 規則產生指令碼 RulesBuild.cmd v0.1 產生
echo # tombkeeper@whitecell.org
echo.

setlocal

rem 不打算填寫內容的變數就讓它空著,

rem 指定要要設定規則的網路接頭:
set interface=eth0

rem 指定要產生的規則文件:
set rules_file=PktFilter.conf

rem 指定本機IP,這裡只考慮了一個IP的情況:
set local_ip=192.168.0.1

rem 指定信任的IP,注意!來自這些IP的訪問將完全不受防火牆控制。多個IP之間用逗號分隔:
set trust_ip=192.168.0.2,192.168.0.3

rem 指定網關,某些網關會設定會定時ping主機:
set gateway=192.168.0.254

rem 指定qq伺服器,多個IP之間用逗號分隔:
set qq_server=219.133.40.15

rem 是否要使用主動模式ftp:
set ftp_active=true

rem 是否要訪問DNS:
set dns=true

rem 是否要訪問tftp:
set tftp=true

rem 是否要訪問snmp:
set snmp=true

rem 是否要使用msn直接文件傳輸:
set msn=true

rem 是否要使用QQ:
set qq=true

rem 是否使用金山毒霸在線昇級:
set kav=true

rem 是否使用netbios:
set netbios=true

rem 其它要開放的TCP連接埠,多個連接埠之間用逗號分隔:
set other_tcp=


echo #####################################################################################
echo # 全局規則
echo #####################################################################################
echo.

echo # 丟掉小的分片包
echo option small_frags on %interface%
echo.

echo # 預設阻塞所有進出資料
echo block in on %interface% all
echo block out on %interface% all
echo.

echo # 允許 %local_ip% 發起向任意位址的TCP連接
echo pass out on %interface% proto tcp from %local_ip% port 1 ^>^< 65535 to any port 1 ^>^< 65535
echo pass in on %interface% proto tcp from any port 1 ^>^< 65535 to %local_ip% port 1 ^>^< 65535 established
echo.

:trust_ip
if "%trust_ip%"=="" goto tcp
echo # 設定信任主機 %trust_ip% 可完全訪問 %local_ip%
for %%I in (%trust_ip%,) do echo pass in on %interface% from %%I to %local_ip% && echo pass out on %interface% from %local_ip% to %%I
rem %trust_ip%後面加一個逗號是考慮只有一個%trust_ip%時候的情況
echo.

:tcp
echo #####################################################################################
echo # TCP 規則
echo #####################################################################################
echo.

:ftp_active
if not "%ftp_active%"=="true" goto msn
echo # 開放TCP 20 ,FTP 主動模式
echo pass in on %interface% proto tcp from any port = 20 to %local_ip% port ^> 1023
echo.

:msn
if not "%msn%"=="true" goto other_tcp
echo # 開放TCP 6890 - 6900,允許MSN直接傳輸文件
echo pass in on %interface% proto tcp from any port ^> 1023 to %local_ip% port 6890 ^>^< 6900
echo.

ther_tcp
if "%other_tcp%"=="" goto udp
echo # 其他要開放的TCP 連接埠:%other_tcp%
for %%I in (%other_tcp%,) do echo pass in on %interface% proto tcp from any port ^> 1023 to %local_ip% port = %%I
echo.

:udp
echo #####################################################################################
echo # UDP 規則
echo #####################################################################################
echo.

:dns
if not "%dns%"=="true" goto snmp
echo # 訪問DNS服務
echo pass out on %interface% proto udp from %local_ip% port ^> 1023 to any port = 53
echo pass in on %interface% proto udp from any port = 53 to %local_ip% port ^> 1023
echo.

:snmp
if not "%snmp%"=="true" goto tftp
echo # 訪問snmp服務
echo pass out on %interface% proto udp from %local_ip% port ^> 1023 to any port = 161
echo pass in on %interface% proto udp from any port = 161 to %local_ip% port ^> 1023
echo.

:tftp
if not "%tftp%"=="true" goto netbios
echo # 訪問tftp服務
echo pass out on %interface% proto udp from %local_ip% port ^> 1023 to any port = 69
echo pass in on %interface% proto udp from any port = 69 to %local_ip% port ^> 1023
echo.

:netbios
if not "%netbios%"=="true" goto kav
echo # 訪問netbios-ns(UDP 137) netbios-dgm(UDP 138)服務
echo pass out on %interface% proto udp from any port = 137 to any port = 137
echo pass in on %interface% proto udp from any port = 137 to any port = 137
echo pass out on %interface% proto udp from any port = 138 to any port = 138
echo pass in on %interface% proto udp from any port = 138 to any port = 138
echo.

:kav
if not "%kav%"=="true" goto qq
echo # 訪問金山毒霸昇級驗證連接埠
echo pass out on %interface% proto udp from %local_ip% port ^> 1023 to any port = 6868
echo pass in on %interface% proto udp from any port = 6868 to %local_ip% port ^> 1023
echo.

:qq
if not "%qq%"=="true" goto icmp
echo # 使用udp方式訪問QQ
for %%I in (%qq_server%,) do echo pass out on %interface% proto udp from %local_ip% port = 6000 to %%I port = 8000 && echo pass in on %interface% proto udp from %%I port = 8000 to %local_ip% port = 6000
rem %qq_server%後面加一個逗號是考慮只有一個%qq_server%時候的情況
echo.

:icmp
echo #####################################################################################
echo # ICMP 規則
echo #####################################################################################
echo.

ing
echo # %local_ip% 可以 ping 任意位址
echo pass out on %interface% proto icmp from %local_ip% to any icmp-type echo
echo pass in on %interface% proto icmp from any to %local_ip% icmp-type echorep
echo.

:gateway
if "%gateway"=="" goto write
echo # 網關可以ping %local_ip%
echo pass in on %interface% proto icmp from %gateway% to %local_ip% icmp-type echo
echo pass out on %interface% proto icmp from %local_ip% to %gateway% icmp-type echorep

:write
call %0 1> %rules_file% 2>nul
@echo off
rem 用這種方法寫文件就不用每行後面都重轉發IP而多次執行寫操作,速度快,便於維護。
rem 用call或者cmd /c都可以,寫入一次後會因為文件被另起的cmd工作佔用而出錯退出。
rem 如果不用call而直接在批次處理中使用,則指令是在同一個cmd工作中執行,會出現死循環。
rem 事實上這種寫法更適用於在交互指令碼中指定要寫的文件,
rem 譬如前面設定變數的程序就可以用set /p 來分別從控制台上取得。

endlocal

@echo on

後記:
按照httpd.conf、squid.conf、、、等的沿用習慣
其實就等於一個RRAS的Filterd.conf,我喜歡

有一些小小的問題,正如它網站上有人反映的那樣
1.顯示的問題
pktctl -S eth1
好像列rules的格式有些問題,這個不算什麼

3.在XP/2003里日誌不工作

2.日誌時常會不工作
我在2K Server下使用
log好像時常會停掉,開始讓我緊張不止,以為服務down掉了
其實服務正常,但log不知為什麼不工作了
這個問題有點點頭痛
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 06:45 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1