歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核--基於Netfilter的內核級包過濾防火牆實現

測試內核版本:Linux Kernel 2.6.35----Linux Kernel 3.2.1

知識基礎:本防火牆的開發基於對Linux內核網絡棧有個良好的概念,本人對網絡棧的分析是基於早期版本(Linux 1.2.13),在明確了網絡棧架構的前提下,上升一步分析高級版本內核中的Netfilter防火牆實現原理,然後進行模塊或內核編程,開發一款基於包過濾的個人防火牆。

包過濾防火牆:包過濾防火牆是用一個軟件查看所流經的數據包的包頭(header),由此決定整個包的命運。它可能會決定丟棄(DROP)這個包,可能會接受(ACCEPT)這個包(讓這個包通過),也可能執行其它更復雜的動作。工作於網絡層,能對IP數據報進行首部檢查。例如:IP源地址,目的地址,源端口和目的端口等。

本防火牆的包過濾功能如下:  

* 拒絕來自某主機或某網段的所有連接。
  * 允許來自某主機或某網段的所有連接。
  * 拒絕來自某主機或某網段的指定端口的連接。
  * 允許來自某主機或某網段的指定端口的連接。
  * 拒絕發去某主機或某網段的所有連接。
  * 允許發去某主機或某網段的所有連接。
  * 拒絕發去某主機或某網段的指定端口的連接。
  * 允許發去某主機或某網段的指定端口的連接。

Netfilter框架是Linux內核分析和過濾特定協議數據包處理框架,為其他模塊動態參與網絡層數據包處理提供了方便的途徑。

本防火牆的簡單功能就是檢查數據包是否符合過濾的條件,如果不符合就捨棄(Drop),否則就接受(Accept),這裡定義八個鏈表頭結點

  1. struct ip_node  ip_allowed_in_node_head;/*允許的遠程主機或網絡IP地址頭節點*/  
  2. struct ip_node  ip_denied_in_node_head;/*拒絕的遠程主機或網絡IP地址頭節點*/  
  3. struct ip_node  ip_allowed_out_node_head;/*允許的本地主機或網絡IP地址頭節點*/  
  4. struct ip_node  ip_denied_out_node_head;/*拒絕的本地主機或網絡IP地址頭節點*/  
  5.   
  6. struct port_node port_allowed_in_node_head;/*允許的遠程主機或網絡傳輸層端口號頭節點*/  
  7. struct port_node port_denied_in_node_head;/*拒絕的遠程主機或網絡傳輸層端口號頭節點*/  
  8. struct port_node port_allowed_out_node_head;/*允許的本地主機或網絡傳輸層端口號頭節點*/  
  9. struct port_node port_denied_out_node_head;/*拒絕的本地主機或網絡傳輸層端口號頭節點*/  

用於保存配置文件中的地址或端口信息。

定義兩個鉤子函數hook_func_in和hook_func_out,分別將其掛載到INET協議族的入口NF_INET_LOCAL_IN和出口NF_INET_LOCAL_OUT:

  1. static struct nf_hook_ops my_netfilter[] =  
  2. {  
  3.     {  
  4.         .hook       =hook_func_in,  
  5.         .owner      =THIS_MODULE,  
  6.         .pf     =PF_INET,  
  7.         .hooknum    =NF_INET_LOCAL_IN,  
  8.         .priority   =100  
  9.     },  
  10.     {  
  11.         .hook       =hook_func_out,  
  12.         .owner      =THIS_MODULE,  
  13.         .pf     =PF_INET,  
  14.         .hooknum    =NF_INET_LOCAL_OUT,  
  15.         .priority   =100  
  16.     }  
  17. };  

說明一下自己定義的一些宏和引用的頭文件:

  1. #ifndef MODULE   
  2. #define MODULE   
  3. #endif   
  4.   
  5. #ifndef __KERNEL__   
  6. #define __KERNEL__   
  7. #endif   
  8. //#define NET_DOWN   
  9. #define MY_FIREWALL_DEBUG   
  10.   
  11. #include <asm/system.h>   
  12. #include <linux/module.h>   
  13. #include <linux/types.h>   
  14. #include <linux/kernel.h>   
  15. #include <linux/string.h>   
  16.   
  17. #include <linux/net.h>   
  18. #include <linux/socket.h>   
  19. #include <linux/sockios.h>   
  20. #include <linux/in.h>   
  21. #include <linux/inet.h>   
  22.   
  23.   
  24. #include <net/ip.h>   
  25. #include <net/protocol.h>   
  26. #include <linux/skbuff.h>   
  27. #include <net/sock.h>   
  28. #include <net/icmp.h>   
  29. #include <net/raw.h>   
  30. #include <net/checksum.h>   
  31. #include <linux/netfilter_ipv4.h>   
  32. #include <linux/tcp.h>   
  33. #include <linux/udp.h>   
  34. #include <linux/igmp.h>   
  35.   
  36. #include <linux/fs.h>   
  37. #include <linux/mm.h>   
  38. #include <asm/uaccess.h>   
  39.   
  40. #define YES 1   
  41. #define NO 0   
  42.   
  43. #define IP_MAX_LEN 20   
  44. #define PORT_MAX_LEN 20   
  45.   
  46. #define ALLOWED_IP_IN 0   
  47. #define DENIED_IP_IN 1   
  48. #define ALLOWED_IP_OUT 2   
  49. #define DENIED_IP_OUT 3   
  50.   
  51. #define ALLOWED_PORT_IN 0   
  52. #define DENIED_PORT_IN 1   
  53. #define ALLOWED_PORT_OUT 2   
  54. #define DENIED_PORT_OUT 3   
  55.   
  56. #define ALLOWED_IN_IP_CONF_FILE_DIR "/etc/my_firewall/ip_allowed_in"   
  57. #define DENIED_IN_IP_CONF_FILE_DIR "/etc/my_firewall/ip_denied_in"   
  58. #define ALLOWED_IN_PORT_CONF_FILE_DIR "/etc/my_firewall/port_allowed_in"   
  59. #define DENIED_IN_PORT_CONF_FILE_DIR "/etc/my_firewall/port_denied_in"   
  60.   
  61. #define ALLOWED_OUT_IP_CONF_FILE_DIR "/etc/my_firewall/ip_allowed_out"   
  62. #define DENIED_OUT_IP_CONF_FILE_DIR "/etc/my_firewall/ip_denied_out"   
  63. #define ALLOWED_OUT_PORT_CONF_FILE_DIR "/etc/my_firewall/port_allowed_out"   
  64. #define DENIED_OUT_PORT_CONF_FILE_DIR "/etc/my_firewall/port_denied_out"   
  65.   
  66. //DEFINE FOR WORK_MODE   
  67.   
  68. /*不工作狀態,默認*/  
  69. #define MODE_FREE 0   
  70. /*允許來自某主機或某網段的所有連接*/  
  71. #define MODE_IP_ONLY_ALLOWED_IN 1   
  72.   
  73. /*拒絕來自某主機或某網段的所有連接*/  
  74. #define MODE_IP_ONLY_DENIED_IN 2   
  75.   
  76. /*允許來自某主機或某網段指定端口的連接*/  
  77. #define MODE_IP_PORT_ALLOWED_IN 3   
  78.   
  79. /*拒絕來自某主機或某網段的指定端口的連接*/  
  80. #define MODE_IP_PORT_DENIED_IN 4   
  81.   
  82. /*允許本地主機或本地網絡與其他主機或網絡的所有連接*/  
  83. #define MODE_IP_ONLY_ALLOWED_OUT 5   
  84.   
  85. /*拒絕本地主機或本地網絡與其他主機或網絡的所有連接*/  
  86. #define MODE_IP_ONLY_DENIED_OUT 6   
  87.   
  88. /*允許本地主機或網絡與其他主機或其他網絡的指定端口的連接*/  
  89. #define MODE_IP_PORT_ALLOWED_OUT 7   
  90.   
  91. /*拒絕本地主機或網絡與其他主機或其他網絡的指定端口的連接*/  
  92. #define MODE_IP_PORT_DENIED_OUT 8  
Copyright © Linux教程網 All Rights Reserved