修改netfilter数据包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改netfilter数据包相关的知识,希望对你有一定的参考价值。

最近公司在做个项目需要修改netfilter数据包或者伪造发送,可是修改的数据包就是发送不成功!特此求助。
linux源码我看了好多遍了,可是就是发不出去,okfn返回值一直是-1,按道理说netfilter最后调用的还是这个函数,为什么我自己调用就是错误呢?

参考技术A 01.static unsigned int send(unsigned int hooknum, struct sk_buff * skb,

02. const struct net_device * in, const struct net_device * out,

03. int (*okfn)(struct sk_buff *))

04.

05. struct iphdr* iph;

06. struct udphdr* udph;

07. struct tcphdr* tcph;

08. unsigned char *data = NULL;

09. int datalen;

10. int ret = 0;

11.

12. __u16 dst_port,src_port;

13. __be32 myip;

14.

15. if(skb)

16.

17. iph = (struct iphdr *)skb_header_pointer(skb,0,0,NULL);

18. if(iph)

19.

20. if(strcmp(dstIP,"")!=0&&strcmp(dstIP,"0.0.0.0")!=0)

21.

22. myip = in_aton(dstIP);

23. if(iph->daddr == myip)

24.

25. if(iph->protocol == IPPROTO_UDP)

26.

27. udph = (struct udphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);

28. data = (char *)skb_header_pointer(nskb,TOT_HDR_LEN,0,NULL);

29. datalen = ntohs(iph->tot_len)-TOT_HDR_LEN;

30.

31. else if(iph->protocol == IPPROTO_TCP)

32.

33. tcph = (struct tcphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);

34. int offlen = IP_HDR_LEN + tcph->doff*4;

35. data = (char *)skb_header_pointer(skb,offlen,0,NULL);

36. datalen = ntohs (iph->tot_len)-offlen;

37.

38.

39. int j;

40. for(j=0; j<datalen; j++)

41.

42. data[j] += 1;

43.

44. printk("encrypted\n");

45. iph->check = 0;

46. ip_send_check(iph);

47.

48.

49.

50.

51. return NF_ACCEPT;

52.
01.static unsigned int send(unsigned int hooknum, struct sk_buff * skb,

02. const struct net_device * in, const struct net_device * out,

03. int (*okfn)(struct sk_buff *))

04.

05. struct iphdr* iph;

06. struct udphdr* udph;

07. struct tcphdr* tcph;

08. unsigned char *data = NULL;

09. int datalen;

10. int ret = 0;

11.

12. __u16 dst_port,src_port;

13. __be32 myip;

14.

15. if(skb)

16.

17. iph = (struct iphdr *)skb_header_pointer(skb,0,0,NULL);

18. if(iph)

19.

20. if(strcmp(dstIP,"")!=0&&strcmp(dstIP,"0.0.0.0")!=0)

21.

22. myip = in_aton(dstIP);

23. if(iph->daddr == myip)

24.

25. if(iph->protocol == IPPROTO_UDP)

26.

27. udph = (struct udphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);

28. data = (char *)skb_header_ www.hnnedu.com pointer(nskb,TOT_HDR_LEN,0,NULL);

29. datalen = ntohs(iph->tot_len)-TOT_HDR_LEN;

30.

31. else if(iph->protocol == IPPROTO_TCP)

32.

33. tcph = (struct tcphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);

34. int offlen = IP_HDR_LEN + tcph->doff*4;

35. data = (char *)skb_header_pointer(skb,offlen,0,NULL);

36. datalen = ntohs (iph->tot_len)-offlen;

37.

38.

39. int j;

40. for(j=0; j<datalen; j++)

41.

42. data[j] += 1;

43.

44. printk("encrypted\n");

45. iph->check = 0;

46. ip_send_check(iph);

47.

48.

49.

50.

51. return NF_ACCEPT;

52.

操作系统安全管理/防火墙

文章目录

防火墙

防火墙工具

Netfilter

1. 是Linux操作系统核心层内部的一个数据包处理模块,Linux平台下的包过滤防火墙;

2.作用:
	网络地址转换
	数据包内容修改
	数据包过滤的防火墙功能 ***(要介绍的部分)
相关定义:
1. 表 tables:规则的集合(功能相似 的 规则 的集合)
2. 链 chains:关卡(一个关卡,可能有多个规则)
3. 规则 policy:匹配条件,处理动作

例子

链、表、规则

常见的4类表:
1. raw表:关闭nat表上启动的连接追踪机制 iptable_raw
2. mangle表:拆解报文,做出修改,并重新封装 iptable_mangle
3. nat表:Network Address Translation,网络地址转换 iptable_net
4. filter表:负责过滤功能,防护墙功能 iptable_filter

注意:
1 - 每个关卡能调用的 表 是不同的;
2 - 五个关卡基本是固定的:
	PREROUTING
	INPUT
	FORWARD
	POSTROUTING
	OUTPUT:4个表

规则

系统防火墙 - Firewalld

静态防火墙

只要修改规则,所有的规则都要重新载入,如:iptables service

动态防火墙

任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只要将变更的部分保存并更新到运行中 的 iptables 即可,如 :firewalld

区域

Firewalld将网卡对应到不同的区域(zone)

zone默认有9个

1. block
2. dmz
3. drop
4. external
5. home
6. internal
7. public
8. trusted
9. work

可以理解为:9个样板间

不同的zone对待数据包的默认行为不同,

在kylinos中,默认区域是public

firewalld默认每个服务是拒绝的,需要去设置才能放行;

区域(zone)默认策略规则
trusted可接受所有网络连接,允许所有数据包进出
home用于家庭网络,基本信任网络内的其他主机不会危害该主机。流量、ssh、mdns、ipp-client、amba-client 和 dhcpv6-client 服务相关,允许进入
internal用于内部网络,等同于home
work用于工作区,基本信任网络内的其他主机不会危害该主机。仅 流量、ssh、ipp-client和 dhcpv6-client 服务相关,允许进入
public在公共区域使用,不信任网络内的其他计算机,只能接受经过选取的连接。流量、ssh和 dhcpv6-client 服务相关,允许进入
external为路由器启用了 伪装功能 的外部网,不信任网络内的其他计算机。流量和ssh服务相关,可以进入
dmz非军事区,此区域内可公开访问,可以有限的进入内部网络。流量和ssh服务相关,可以进入
block限制,任何接收的网络连接都会被拒绝
drop丢弃,任何接收的网络数据包都会被丢弃,仅能有发送出去的网络连接

命令行操作 firewall

基础命令

命令功能
systemctl start firewalld开启防火墙
systemct enable firewalld开机自启防火墙
systemct stop firewalld关闭防火墙
systemct disable firewalld开机自动关闭防火墙
firewall-cmd state查看防火墙状态
firewall-cmd --get-active-zones查看防火墙管理的设备
firewall-cmd --get-default-zone查看防火墙默认开启的区域
firewall-cmd --get-zones查看防火墙的所有区域
firewall-cmd --zone=public --list-all列出public区域的服务 设置
firewall-cmd --get-services列出可使用的服务
firewall-cmd --set-default-zone=trusted修改默认区域为trusted
firewall-cmd --list-all-zones列出所有的域

查看防火墙状态

firewall-cmd state	#防护墙状态
systemctl status firewalld	#防火墙状态

关闭防火墙

systemctl stop firewalld.service	#关闭防火墙

启动防火墙

systemctl start firewalld.service

开机自启防火墙

systemctl enable firewalld.service

修改安全策略

命令功能
firewalld-cmd --add-service=https临时添加服务(默认区域)
firewalld-cmd --remove-service=https --permanent永久删除服务
firewalld-cmd --add-port=80/tcp临时添加端口
firewalld-cmd --remove-interface=eth0删除接口
firewalld-cmd --permanent --change-interface=eth1 --zone=trusted永久更改接口区域
firewalld-cmd --add-source=172.25.254.100 --zone=block临时拒绝主机172.25.254.100的所有网络连接
firewalld-cmd --remove-source=172.25.254.100 --zone=block --permanent永久移除限制
firewalld-cmd --complete-reload中断连接,重启防火墙策略
firewalld-cmd --reload不中断连接,重启防火墙策略
firewalld-cmd --direct --get-all-rules查看设置的规则

以上是关于修改netfilter数据包的主要内容,如果未能解决你的问题,请参考以下文章

防火墙IPtables管理工具介绍

netfilter-在内核态操作网络数据包

iptables防火墙基本配置

linux中iptables防火墙怎么设置

操作系统安全管理/防火墙

操作系统安全管理/防火墙