歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核--基於Netfilter的內核級包過濾防火牆實現

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

日期:2017/3/1 10:21:44   编辑:Linux內核

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