修改netfilter数据包
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改netfilter数据包相关的知识,希望对你有一定的参考价值。
最近公司在做个项目需要修改netfilter数据包或者伪造发送,可是修改的数据包就是发送不成功!特此求助。
linux源码我看了好多遍了,可是就是发不出去,okfn返回值一直是-1,按道理说netfilter最后调用的还是这个函数,为什么我自己调用就是错误呢?
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数据包的主要内容,如果未能解决你的问题,请参考以下文章