實驗要求如下:
1.配置自己的網路,讓虛擬機器和主機能相互ping通,我使用的網路是,主機vmnet8的ip為192.168.48.1,也就是windows的網路位址。因為我使用的是nat網路,vmware自動把本地連線對映成vmnet8,相當於路由器,然後虛擬機器裡的ip被自動分配為192.168.48.129,網路是通的。
2.設定iptables過濾規則為:所有從主機發出的icmp包全部到自己編寫的應用程式。
3.編寫應用程式,功能如下
允許從主機出發,目的位址為192.168.48.129的包
丟棄其他任何的icmp包
出錯時要進行錯誤處理,能夠清理占用資源,退出程式
實驗步驟如下:
安裝軟體iptables,iptables-dev開發包,安裝libnet1,libnetl-dev,其中iptables為linux下的早期防火牆,而libnet則是linux下構造資料報的工具,文件比較齊全,使用比較方便,linux下的的捕獲資料報用libpcap,本實驗中沒有用到,建議真正想在linux下網路程式設計的人要使用libnet和libpcap。
安裝好工具後,就開時程式設計序了。
設定過濾環境
載入過濾需要的核心模組
–# modprobe iptable_filter
–# modprobe ip_queue
設定過濾規則 –
iptables -a output -p icmp -j queue
編寫應用程式
:程式框架
ipq_create_handle()
->ipq_set_mode()
->
包過濾處理迴圈
while(1)
->ipq_destroy()
實驗**如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define bufsize 2048
static void die(struct ipq_handle *h)
int main(int argc, char **argv)
char *dst = libnet_addr2name4(iph->ip_dst.s_addr, libnet_dont_resolve);
if(!strcmp(dst, ip_dst_s))
else
if (status < 0)
die(h);
break;
}default:
fprintf(stderr, "unknown message type!\n");
break;
}} while (1);
ipq_destroy_handle(h);
return 0;}
至於實驗結果就不帖了,讀者想知道就自己編譯一下測試測試
編譯方法是:
gcc test.c -lipq -lnet
實驗體會:
很多軟體都定義了一些相同的資料結構,但是名字不同,感覺這是一大缺陷,比如
ip header,
實驗手冊中給的是
linux/ip.h
中的struct iphdr
,libnet
中libnet-headers.h
有struct libnet_ipv4_hdr
和struct libnet_ipv6_hdr
,分析snort
原始碼時,
snort
也定義了乙個自己的
typedef struct _iphdr iphdr;,
對同一資料結構進行了多次的不同的定義,明顯感覺有的復用性沒有達到,我選擇了
libnet_ipv4_hdr
,因為手頭有
libnet
的手冊,查詢比較方便。就應該開發一套通用的放到
c語言規範裡,這樣可以避免大量的重複勞動,而且程式設計師也不需要有太大的負擔
0
給主人留下些什麼吧!~~
防火牆入門
網路各層中,給防火牆提供判別依據有,1 連線層 desctination,source的mac位址。2 網路層 header length,differentiated service,total length,flags,time to live,protocol,source,destinati...
小白入門防火牆iptables
iptables防火牆 檢視4表5鏈 man iptables 4表 1 filter 篩選作用,最常用 2 nat 3 mangle 硬體常使用 4 raw 5鏈 包含在4表裡面,1 input 2 output 3 prerouteing 4 postrouting 5 forward 檢視表 ...
透明防火牆才是純粹的防火牆
早在上大學時就有乙個疑問,為什麼防火牆看起來像是一台路由器,為了引入乙個防火牆,你起碼要多申請2個ip位址,還要配置複雜的路由保證通路,為了上述保證,你不得不重新規劃你的網路,最最麻煩的就是為你的那個防火牆分配的那個ip位址,該位址可能會成為攻擊者進入內部網的入口。到底是誰在保護誰啊?真正意義的純粹...