❶ 什麼是包過濾技術其特點是什麼
一、定義:
包過濾(Packet Filtering)技術:是基於協議特定的標准,路由器在其埠能夠區分包和限制包的技術。
基於協議特定的標准,路由器在其埠能夠區分包和限制包的能力叫包過濾(Packet Filtering)。其技術原理在於加入IP過濾功能的路由器逐一審查包頭信息,並根據匹配和規則決定包的前行或被舍棄,以達到拒絕發送可疑的包的目的。過濾路由器具備保護整個網路、高效快速並且透明等優點,同時也有定義復雜、消耗CPU資源、不能徹底防止地址欺騙、涵蓋應用協議不全、無法執行特殊的安全策略並且不提供日誌等局限性。包過濾技術的二、特點
1、優點 :對小型的、不太復雜的站點包過濾較容易實現。
(1)一個過濾路由器能協助保護整個網路。絕大多數Internet防火牆系統只用一個包過濾路由器;
(2)過濾路由器速度快、效率高。執行包過濾所用的時間很少或幾乎不需要什麼時間,由於過濾路由器只檢查報頭相應的欄位,一般不查看數據報的內容,而且某些核心部分是由專用硬體實現的,如果通信負載適中且定義的過濾很少的話,則對路由器性能沒有多大影響;
(3)包過濾路由器對終端用戶和應用程序是透明的。當數據包過濾路由器決定讓數據包通過時,它與普通路由器沒什麼區別,甚至用戶沒有認識到它的存在,因此不需要專門的用戶培訓或在每主機上設置特別的軟體。
2、缺點及局限性:
他們很少有或沒有日誌記錄能力,所以網路管理員很難確認系統是否正在被入侵或已經被入侵了。這種防火牆的最大缺陷是依賴一個單一的部件來保護系統。
(1)定義包過濾器可能是一項復雜的工作。因為網管員需要詳細地了解Internet各種服務、包頭格式和他們在希望每個域查找的特定的值。如果必須支持復雜的過濾要求的,則過濾規則集可能會變得很長很復雜,並且沒有什麼工具可以用來驗證過濾規則的正確性。
(2)路由器信息包的吞吐量隨過濾器數量的增加而減少。路由器被優化用來從每個包中提取目的IP地址、查找一個相對簡單的路由表,而後將信息包順向運行到適當轉發介面。如果過濾可執行,路由器還必須對每個包執行所有過濾規則。這可能消耗CPU的資源,並影響一個完全飽和的系統性能。
(3)不能徹底防止地址欺騙。大多數包過濾路由器都是基於源IP地址、目的IP地址而進行過濾的,而IP地址的偽造是很容易、很普遍的。
(4)一些應用協議不適合於數據包過濾。即使是完美的數據包過濾,也會發現一些協議不很適合於經由數據包過濾安全保護。如RPC、X- Window和FTP。而且服務代理和HTTP的鏈接,大大削弱了基於源地址和源埠的過濾功能。
(5)正常的數據包過濾路由器無法執行某些安全策略。例如,數據包說它們來自什麼主機,而不是什麼用戶,因此,我們不能強行限制特殊的用戶。同樣地,數據包說它到什麼埠,而不是到什麼應用程序,當我們通過埠號對高級協議強行限制時,不希望在埠上有別的指定協議之外的協議,而不懷好意的知情者能夠很容易地破壞這種控制。
(6)一些包過濾路由器不提供任何日誌能力,直到闖入發生後,危險的封包才可能檢測出來。它可以阻止非法用戶進入內部網路,但也不會告訴我們究竟都有誰來過,或者誰從內部進入了外部網路。
❷ C語言 socket封包和解包
你的基本思路是正確的,就是在發送數據之前把數據的長度添加在數據之前,便於收到後進行解析。
不過你這個在稍微有點異常的情況下就可以引起系統崩潰,因為一旦「長度」部分可能是亂碼,因而引起後面數據的訪問越界。
比較科學的做法就是為payload數據增加包頭(包括前導碼、數據描述)和包尾(包校驗碼),通過一系列的校驗,首先驗證包的數據是正常的,然後再從包中吧數據解析出來。
❸ 淺談iptables
iptables是linux系統下用來做防火牆的二進制文件(linux上位於/sbin/iptables,android中位於/system/bin/iptables),底層依賴於內核的netfilter模塊,用來完成封包過濾、封包重定向和網路地址轉換(NAT)等功能(在android上需要root使用)。
舉個例子來簡單看看iptables命令的基本用法。
意思是在nat轉發表的OUTPUT輸出鏈中增加這樣一條規則:倘若OUTPUT輸出鏈攔到了tcp請求,則將其重定向到本地的8123埠。
可以看到iptables中有 表 、 鏈 和 規則 的概念,那麼先通過iptables傳輸數據包的過程來簡單了解下表和鏈是什麼以及他們之間的關系。
可以看到 鏈 就是對數據包傳輸路徑的一種抽象,一個數據包根據其具體場景以固定的順序依次經過PREROUTING、INPUT等各個鏈,在經過各個鏈時,又有不同的表在監聽這個鏈,而nat、filter等 表 中有包含一系列的 規則 ,當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則。
值得注意的是,
至此我們了解了表、鏈和規則是什麼以及他們之間的關系,下面來具體看下 iptables命令的基本用法 。
更多關於各command、parameter的具體含義以及用法可以參考 https://wangchujiang.com/linux-command/c/iptables.html
iptables對網路數據包做過濾或攔截時其維度只能局限於網路數據包收發的ip地址、埠號、網卡、tcp/udp協議,因此可以推測iptables最終是在ip層對網路數據包做的攔截。
那iptables基於netfilter具體是怎麼做到在各個鏈上對數據包做攔截的呢?
/net/ipv4/ip_output.c
/net/ipv4/ip_input.c
/net/ipv4/ip_forward.c
可以看到內核在每一個數據轉發的關鍵節點都調用了NF_HOOK這個宏,來看下NF_HOOK這個宏幹了啥
關於NF_HOOK相關具體邏輯可參見 https://sites.google.com/site/ibms/network-security-development/netfilter%E8%AE%BE%E8%AE%A1%E4%B8%8E%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90
❹ 怎麼在windows下過濾TCP/IP數據包
IP地址和埠被稱作套接字,它代表一個TCP連接的一個連接端。為了獲得TCP服務,必須在發送機的一個埠上和接收機的一個埠上建立連接。TCP連接用兩個連接端來區別,也就是(連接端1,連接端2)。連接端互相發送數據包。
一個TCP數據包包括一個TCP頭,後面是選項和數據。一個TCP頭包含6個標志位。它們的意義分別為:
SYN: 標志位用來建立連接,讓連接雙方同步序列號。如果SYN=1而ACK=0,則表示該數據包為連接請求,如果SYN=1而ACK=1則表示接受連接。
FIN: 表示發送端已經沒有數據要求傳輸了,希望釋放連接。
RST: 用來復位一個連接。RST標志置位的數據包稱為復位包。一般情況下,如果TCP收到的一個分段明顯不是屬於該主機上的任何一個連接,則向遠端發送一個復位包。
URG: 為緊急數據標志。如果它為1,表示本數據包中包含緊急數據。此時緊急數據指針有效。
ACK: 為確認標志位。如果為1,表示包中的確認號時有效的。否則,包中的確認號無效。
PSH: 如果置位,接收端應盡快把數據傳送給應用層。
TCP連接的建立
TCP是一個面向連接的可靠傳輸協議。面向連接表示兩個應用端在利用TCP傳送數據前必須先建立TCP連接。 TCP的可靠性通過校驗和,定時器,數據序號和應答來提供。通過給每個發送的位元組分配一個序號,接收端接收到數據後發送應答,TCP協議保證了數據的可靠傳輸。數據序號用來保證數據的順序,剔除重復的數據。在一個TCP會話中,有兩個數據流(每個連接端從另外一端接收數據,同時向對方發送數據),因此在建立連接時,必須要為每一個數據流分配ISN(初始序號)。為了了解實現過程,我們假設客戶端C希望跟伺服器端S建立連接,然後分析連接建立的過程(通常稱作三階段握手):
1: C --SYN XXà S
2: C ?-SYN YY/ACK XX+1------- S
3: C ----ACK YY+1--à S
1:C發送一個TCP包(SYN 請求)給S,其中標記SYN(同步序號)要打開。SYN請求指明了客戶端希望連接的伺服器端埠號和客戶端的ISN(XX是一個例子)。
2:伺服器端發回應答,包含自己的SYN信息ISN(YY)和對C的SYN應答,應答時返回下一個希望得到的位元組序號(YY+1)。
3:C 對從S 來的SYN進行應答,數據發送開始。
一些實現細節
大部分TCP/IP實現遵循以下原則:
1:當一個SYN或者FIN數據包到達一個關閉的埠,TCP丟棄數據包同時發送一個RST數據包。
2:當一個RST數據包到達一個監聽埠,RST被丟棄。
3:當一個RST數據包到達一個關閉的埠,RST被丟棄。
4:當一個包含ACK的數據包到達一個監聽埠時,數據包被丟棄,同時發送一個RST數據包。
5:當一個SYN位關閉的數據包到達一個監聽埠時,數據包被丟棄。
6:當一個SYN數據包到達一個監聽埠時,正常的三階段握手繼續,回答一個SYN ACK數據包。
7:當一個FIN數據包到達一個監聽埠時,數據包被丟棄。"FIN行為"(關閉得埠返回RST,監聽埠丟棄包),在URG和PSH標志位置位時同樣要發生。所有的URG,PSH和FIN,或者沒有任何標記的TCP數據包都會引起"FIN行為"。
二:全TCP連接和SYN掃描器
全TCP連接
全TCP連接是長期以來TCP埠掃描的基礎。掃描主機嘗試(使用三次握手)與目的機指定埠建立建立正規的連接。連接由系統調用connect()開始。對於每一個監聽埠,connect()會獲得成功,否則返回-1,表示埠不可訪問。由於通常情況下,這不需要什麼特權,所以幾乎所有的用戶(包括多用戶環境下)都可以通過connect來實現這個技術。
這種掃描方法很容易檢測出來(在日誌文件中會有大量密集的連接和錯誤記錄)。Courtney,Gabriel和TCP Wrapper監測程序通常用來進行監測。另外,TCP Wrapper可以對連接請求進行控制,所以它可以用來阻止來自不明主機的全連接掃描。
TCP SYN掃描
在這種技術中,掃描主機向目標主機的選擇埠發送SYN數據段。如果應答是RST,那麼說明埠是關閉的,按照設定就探聽其它埠;如果應答中包含SYN和ACK,說明目標埠處於監聽狀態。由於所有的掃描主機都需要知道這個信息,傳送一個RST給目標機從而停止建立連接。由於在SYN掃描時,全連接尚未建立,所以這種技術通常被稱為半打開掃描。SYN掃描的優點在於即使日誌中對掃描有所記錄,但是嘗試進行連接的記錄也要比全掃描少得多。缺點是在大部分操作系統下,發送主機需要構造適用於這種掃描的IP包,通常情況下,構造SYN數據包需要超級用戶或者授權用戶訪問專門的系統調用。
三:秘密掃描與間接掃描
秘密掃描技術
由於這種技術不包含標準的TCP三次握手協議的任何部分,所以無法被記錄下來,從而不比SYN掃描隱蔽得多。另外,FIN數據包能夠通過只監測SYN包的包過濾器。
秘密掃描技術使用FIN數據包來探聽埠。當一個FIN數據包到達一個關閉的埠,數據包會被丟掉,並且回返回一個RST數據包。否則,當一個FIN數據包到達一個打開的埠,數據包只是簡單的丟掉(不返回RST)。
Xmas和Null掃描是秘密掃描的兩個變種。Xmas掃描打開FIN,URG和PUSH標記,而Null掃描關閉所有標記。這些組合的目的是為了通過所謂的FIN標記監測器的過濾。
秘密掃描通常適用於UNIX目標主機,除過少量的應當丟棄數據包卻發送reset信號的操作系統(包括CISCO,BSDI,HP/UX,MVS和IRIX)。在Windows95/NT環境下,該方法無效,因為不論目標埠是否打開,操作系統都發送RST。
跟SYN掃描類似,秘密掃描也需要自己構造IP 包。
間接掃描
間接掃描的思想是利用第三方的IP(欺騙主機)來隱藏真正掃描者的IP。由於掃描主機會對欺騙主機發送回應信息,所以必須監控欺騙主機的IP行為,從而獲得原始掃描的結果。間接掃描的工作過程如下:
假定參與掃描過程的主機為掃描機,隱藏機,目標機。掃描機和目標記的角色非常明顯。隱藏機是一個非常特殊的角色,在掃描機掃描目的機的時候,它不能發送任何數據包(除了與掃描有關的包)。
❺ 包過濾技術如何防禦黑客攻擊以及包過濾技術的優缺點(越詳細越好)
包過濾應該是針對某一個數據包來進行的過濾,這樣的話就可以防止某些有害的版數據包進入你的網路內部權,但是這樣的話它不能夠防止一些通過正常埠進行訪問的數據包 如DDOS裡面的CC攻擊就是通過一個正常的80埠來進行訪問從而產生了大量的數據流量使伺服器承受不住而宕機。
❻ 封包過濾器的介紹
封包過濾是最早被用來作為網路防火牆的技術,是在OSI七層架構中第三層以下的網路中運作。封包過濾器的功能主要是檢查過往的每一個IP資料封包,如果其表頭中所含的資料內容符合事先設定的可信賴安全標准就放行通過,反之則阻檔在門外。
❼ WPE高手進看看這個封包用什麼思路過濾掉
一般WPE 傳送出去的封包才有用,接收到的封包是沒有用的,你把接收到的封包過濾掉,會加快找到自己需要的封包。另外一點就是除非是被截取封包的內部人員或者對該被截取的編碼原則很了解的人才能看出封包數據所代表的意思。一般玩家只能猜和實驗。我有時間會不時在自己的網路空間發關於WPE文章,有興趣的可以去看看。
❽ wpe的過濾器是怎麼回事怎麼打開封包!
過濾器的右邊那個發送 點下 然後上面一排中有個是打開了
❾ 怎樣用C語言實現網路抓包
第一法則:站在巨人肩膀上 && 不要重復造輪子。
對於這種復雜的過程,第一選擇是使用現成的,節約時間,提升效率。
Wireshark(前稱Ethereal)是一個網路封包分析軟體。網路封包分析軟體的功能是擷取網路封包,並盡可能顯示出最為詳細的網路封包資料。Wireshark使用WinPCAP作為介面,直接與網卡進行數據報文交換。
網路封包分析軟體的功能可想像成 "電工技師使用電表來量測電流、電壓、電阻" 的工作 - 只是將場景移植到網路上,並將電線替換成網路線。在過去,網路封包分析軟體是非常昂貴,或是專門屬於營利用的軟體。Ethereal的出現改變了這一切。在GNUGPL通用許可證的保障范圍底下,使用者可以以免費的代價取得軟體與其源代碼,並擁有針對其源代碼修改及客制化的權利。Ethereal是目前全世界最廣泛的網路封包分析軟體之一。
第二法則:學習 && 提升。
如果是單純的學習知識,可以直接嘗試寫一些具有部分功能的程序,過程會有點艱難,但非常有意義。學習網路編程,需要了解 開放系統互連參考模型的的七層每一層的意義以及現實當中實現的四層的網路協議。然後就可以知道抓包的包位於模型當中的傳輸層協議,包括UDP和TCP的協議。進一步要學習每種協議的格式,表頭,數據包等等。一句話,冰凍三尺非一日之寒。
Windows下的抓包及簡單的編程。
Windows2000在TCP/IP協議組件上做了很多改進,功能也有增強。比如在協議棧上的調整,增大了默認窗口大小,以及高延遲鏈接新演算法。同時在安全性上,可應用IPSec加強安全性,比NT下有不少的改進。
Microsoft TCP/IP 組件包含「核心協議」、「服務」及兩者之間的「介面」。傳輸驅動程序介面 (TDI) 與網路設備介面規范 (NDIS) 是公用的。 此外,還有許多用戶模型應用程序的更高級介面。最常用的介面是 Windows Sockets、遠程過程調用 (RPC) 和 NetBIOS。
Windows Sockets 是一個編程介面,它是在加州大學伯克利分校開發的套接字介面的基礎上定義的。它包括了一組擴展件,以充分利用 Microsoft Windows 消息驅動的特點。規范的 1.1 版是在 1993 年 1 月發行的,2.2.0 版在 1996 年 5 月發行。Windows 2000 支持 Winsock 2.2 版。在Winsock2中,支持多個傳輸協議的原始套接字,重疊I/O模型、服務質量控制等。
這里介紹Windows Sockets的一些關於原始套接字(Raw Socket)的編程。同Winsock1相比,最明顯的就是支持了Raw Socket套接字類型,通過原始套接字,我們可以更加自如地控制Windows下的多種協議,而且能夠對網路底層的傳輸機制進行控制。
1、創建一個原始套接字,並設置IP頭選項。
SOCKET sock;
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
或者:
s = WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
這里,我們設置了SOCK_RAW標志,表示我們聲明的是一個原始套接字類型。創建原始套接字後,IP頭就會包含在接收的數據中,如果我們設定 IP_HDRINCL 選項,那麼,就需要自己來構造IP頭。注意,如果設置IP_HDRINCL 選項,那麼必須具有 administrator許可權,要不就必須修改注冊表:
HKEY_LOCAL_
修改鍵:DisableRawSecurity(類型為DWORD),把值修改為 1。如果沒有,就添加。
BOOL blnFlag=TRUE;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&blnFlag, sizeof(blnFlag);
對於原始套接字在接收數據報的時候,要注意這么幾點:
a、如果接收的數據報中協議類型和定義的原始套接字匹配,那麼,接收的所有數據就拷貝到套接字中。
b、如果綁定了本地地址,那麼只有接收數據IP頭中對應的遠端地址匹配,接收的數據就拷貝到套接字中。
c、如果定義的是外部地址,比如使用connect(),那麼,只有接收數據IP頭中對應的源地址匹配,接收的數據就拷貝到套接字中。
2、構造IP頭和TCP頭
這里,提供IP頭和TCP頭的結構:
// Standard TCP flags
#define URG 0x20
#define ACK 0x10
#define PSH 0x08
#define RST 0x04
#define SYN 0x02
#define FIN 0x01
typedef struct _iphdr //定義IP首部
{
unsigned char h_lenver; //4位首部長度+4位IP版本號
unsigned char tos; //8位服務類型TOS
unsigned short total_len; //16位總長度(位元組)
unsigned short ident; //16位標識
unsigned short frag_and_flags; //3位標志位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協議 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校驗和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
typedef struct psd_hdr //定義TCP偽首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //協議類型
unsigned short tcpl; //TCP長度
}PSD_HEADER;
typedef struct _tcphdr //定義TCP首部
{
USHORT th_sport; //16位源埠
USHORT th_dport; //16位目的埠
unsigned int th_seq; //32位序列號
unsigned int th_ack; //32位確認號
unsigned char th_lenres; //4位首部長度/6位保留字
unsigned char th_flag; //6位標志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗和
USHORT th_urp; //16位緊急數據偏移量
}TCP_HEADER;
TCP偽首部並不是真正存在的,只是用於計算檢驗和。校驗和函數:
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
當需要自己填充IP頭部和TCP頭部的時候,就同時需要自己計算他們的檢驗和。
3、發送原始套接字數據報
填充這些頭部稍微麻煩點,發送就相對簡單多了。只需要使用sendto()就OK。
sendto(sock, (char*)&tcpHeader, sizeof(tcpHeader), 0, (sockaddr*)&addr_in,sizeof(addr_in));
下面是一個示常式序,可以作為SYN掃描的一部分。
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#define SOURCE_PORT 7234
#define MAX_RECEIVEBYTE 255
typedef struct ip_hdr //定義IP首部
{
unsigned char h_verlen; //4位首部長度,4位IP版本號
unsigned char tos; //8位服務類型TOS
unsigned short total_len; //16位總長度(位元組)
unsigned short ident; //16位標識
unsigned short frag_and_flags; //3位標志位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協議 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校驗和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IPHEADER;
typedef struct tsd_hdr //定義TCP偽首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //協議類型
unsigned short tcpl; //TCP長度
}PSDHEADER;
typedef struct tcp_hdr //定義TCP首部
{
USHORT th_sport; //16位源埠
USHORT th_dport; //16位目的埠
unsigned int th_seq; //32位序列號
unsigned int th_ack; //32位確認號
unsigned char th_lenres; //4位首部長度/6位保留字
unsigned char th_flag; //6位標志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗和
USHORT th_urp; //16位緊急數據偏移量
}TCPHEADER;
//CheckSum:計算校驗和的子函數
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
void useage()
{
printf("******************************************
");
printf("TCPPing
");
printf(" Written by Refdom
");
printf(" Email: [email protected]
");
printf("Useage: TCPPing.exe Target_ip Target_port
");
printf("*******************************************
");
}
int main(int argc, char* argv[])
{
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN addr_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
PSDHEADER psdHeader;
char szSendBuf[60]={0};
BOOL flag;
int rect,nTimeOver;
useage();
if (argc!= 3)
{ return false; }
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
printf("WSAStartup Error!
");
return false;
}
if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
printf("Socket Setup Error!
");
return false;
}
flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error!
");
return false;
}
nTimeOver=1000;
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)
{
printf("setsockopt SO_SNDTIMEO error!
");
return false;
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(atoi(argv[2]));
addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);
//
//
//填充IP首部
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
// ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=inet_addr("本地地址");
ipHeader.destIP=inet_addr(argv[1]);
//填充TCP首部
tcpHeader.th_dport=htons(atoi(argv[2]));
tcpHeader.th_sport=htons(SOURCE_PORT); //源埠號
tcpHeader.th_seq=htonl(0x12345678);
tcpHeader.th_ack=0;
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=2; //修改這里來實現不同的標志位探測,2是SYN,1是FIN,16是ACK探測 等等
tcpHeader.th_win=htons(512);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0;
psdHeader.saddr=ipHeader.sourceIP;
psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));
//計算校驗和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),
0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if (rect==SOCKET_ERROR)
{
printf("send error!:%d
",WSAGetLastError());
return false;
}
else
printf("send ok!
");
closesocket(sock);
WSACleanup();
return 0;
}
4、接收數據
和發送原始套接字數據相比,接收就比較麻煩了。因為在WIN我們不能用recv()來接收raw socket上的數據,這是因為,所有的IP包都是先遞交給系統核心,然後再傳輸到用戶程序,當發送一個raws socket包的時候(比如syn),核心並不知道,也沒有這個數據被發送或者連接建立的記錄,因此,當遠端主機回應的時候,系統核心就把這些包都全部丟掉,從而到不了應用程序上。所以,就不能簡單地使用接收函數來接收這些數據報。
要達到接收數據的目的,就必須採用嗅探,接收所有通過的數據包,然後進行篩選,留下符合我們需要的。可以再定義一個原始套接字,用來完成接收數據的任務,需要設置SIO_RCVALL,表示接收所有的數據。
SOCKET sniffersock;
sniffsock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);
DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0 ;
WSAIoctl(sniffersock, SIO_RCVALL, &lpvBuffer, sizeof(lpvBuffer), NULL, 0, & lpcbBytesReturned, NULL, NULL);
創建一個用於接收數據的原始套接字,我們可以用接收函數來接收數據包了。然後在使用一個過濾函數達到篩選的目的,接收我們需要的數據包。
如果在XP以上的操作系統,微軟封殺了Raw Soccket,只能用wincpap之類的開發包了。
❿ iptables詳解
netfilter/iptables (簡稱為iptables)組成Linux平台下的包過濾防火牆,與大多數的Linux軟體一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網路地址轉換(NAT)等功能。
iptables和netfilter的關系:
這是第一個要說的地方,Iptables和netfilter的關系是一個很容易讓人搞不清的問題。很多的知道iptables卻不知道 netfilter。其實iptables只是Linux防火牆的管理工具而已,位於/sbin/iptables。真正實現防火牆功能的是 netfilter,它是Linux內核中實現包過濾的內部結構。
規則 (rules)其實就是網路管理員預定義的條件,規則一般的定義為「如果數據包頭符合這樣的條件,就這樣處理這個數據包」。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的 主要工作就是添加、修改和刪除這些規則。
① 當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
② 如果數據包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。
③ 如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。
過程圖如下:
Iptables採用「表」和「鏈」的分層結構。
表 (tables)提供特定的功能,iptables內置了4個表,即filter表、nat表、mangle表和raw表,分別用於實現包過濾,網路地址轉換、包重構(修改)和數據跟蹤處理。
(1)filter表——三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾數據包 內核模塊:iptables_filter.
(2)Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用於網路地址轉換(IP、埠) 內核模塊:iptable_nat
(3)Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數據包的服務類型、TTL、並且可以配置路由實現QOS內核模塊:iptable_mangle(別看這個表這么麻煩,咱們設置策略時幾乎都不會用到它)
(4)Raw表——兩個鏈:OUTPUT、PREROUTING
作用:決定數據包是否被狀態跟蹤機制處理 內核模塊:iptable_raw
Raw——mangle——nat——filter
鏈 (chains)是數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一 條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據 該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定 義的默認策略來處理數據包。
(1)INPUT——進來的數據包應用此規則鏈中的策略
(2)OUTPUT——外出的數據包應用此規則鏈中的策略
(3)FORWARD——轉發數據包時應用此規則鏈中的策略
(4)PREROUTING——對數據包作路由選擇前應用此鏈中的規則
(記住!所有的數據包進來的時侯都先由這個鏈處理)
(5)POSTROUTING——對數據包作路由選擇後應用此鏈中的規則(所有的數據包出來的時侯都先由這個鏈處理)
從外界到達防火牆的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),之後會進行路由選擇(判斷該數據包應該發往何處),如果數據包 的目標主機是防火牆本機(比如說Internet用戶訪問防火牆主機中的web伺服器的數據包),那麼內核將其傳給INPUT鏈進行處理(決定是否允許通 過等),通過以後再交給系統上層的應用程序(比如Apache伺服器)進行響應。
來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,之後會進行路由選擇,如果數據包的目標地址是其它外部地址(比如區域網用戶通過網 關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然後再交給POSTROUTING規則鏈(是否修改數據包的地 址等)進行處理。
防火牆本機向外部地址發送的數據包(比如在防火牆主機中測試公網DNS伺服器時),首先被OUTPUT規則鏈處理,之後進行路由選擇,然後傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
iptables-save把規則保存到文件中,再由目錄rc.d下的腳本(/etc/rc.d/init.d/iptables)自動裝載
使用命令iptables-save來保存規則。一般用
iptables-save > /etc/sysconfig/iptables
生成保存規則的文件 /etc/sysconfig/iptables,
也可以用
service iptables save
它能把規則自動保存在/etc/sysconfig/iptables中。
當計算機啟動時,rc.d下的腳本將用命令iptables-restore調用這個文件,從而就自動恢復了規則。
刪除INPUT鏈的第一條規則:
1.拒絕進入防火牆的所有ICMP協議數據包
2.允許防火牆轉發除ICMP協議以外的所有數據包
說明:使用「!」可以將條件取反。
3.拒絕轉發來自192.168.1.10主機的數據,允許轉發來自192.168.0.0/24網段的數據
說明:注意要把拒絕的放在前面不然就不起作用了啊。
4.丟棄從外網介面(eth1)進入防火牆本機的源地址為私網地址的數據包
5.封堵網段(192.168.1.0/24),兩小時後解封。
說明:這個策略咱們藉助crond計劃任務來完成,就再好不過了。
[1] Stopped at now 2 hours
6.只允許管理員從202.13.0.0/16網段使用SSH遠程登錄防火牆主機。
說明:這個用法比較適合對設備進行遠程管理時使用,比如位於分公司中的SQL伺服器需要被總公司的管理員管理時。
7.允許本機開放從TCP埠20-1024提供的應用服務。
8.允許轉發來自192.168.0.0/24區域網段的DNS解析請求數據包。
9.禁止其他主機ping防火牆主機,但是允許從防火牆上ping其他主機
10.禁止轉發來自MAC地址為00:0C:29:27:55:3F的和主機的數據包
說明:iptables中使用「-m 模塊關鍵字」的形式調用顯示匹配。咱們這里用「-m mac –mac-source」來表示數據包的源MAC地址。
11.允許防火牆本機對外開放TCP埠20、21、25、110以及被動模式FTP埠1250-1280
說明:這里用「-m multiport –dport」來指定目的埠及范圍
12.禁止轉發源IP地址為192.168.1.20-192.168.1.99的TCP數據包。
說明:此處用「-m –iprange –src-range」指定IP范圍。
13.禁止轉發與正常TCP連接無關的非—syn請求數據包。
說明:「-m state」表示數據包的連接狀態,「NEW」表示與任何連接無關的,新的嘛!
14.拒絕訪問防火牆的新數據包,但允許響應連接或與已有連接相關的數據包
說明:「ESTABLISHED」表示已經響應請求或者已經建立連接的數據包,「RELATED」表示與已建立的連接有相關性的,比如FTP數據連接等。
15.只開放本機的web服務(80)、FTP(20、21、20450-20480),放行外部主機發住伺服器其它埠的應答數據包,將其他入站數據包均予以丟棄處理。