|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2003-10-01, 09:42 PM | #1 |
榮譽會員
|
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. 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不知為什麼不工作了 這個問題有點點頭痛 |
送花文章: 3,
|