Netfilter/iptables 项目由 Rusty Russe 创建于1998年,并于 1999 年建立了 Netfilter Core team,并在此后负责维护此项目,同时也于2000年3月合并进了 linux 2.3.x 版本的 linux 内核。

Netfilter/iptables 有三部分组成,分别是Netfilter 框架/Iptables(内核空间)/Iptables 命令行工具(用户空间)。

Netfilter 是一个由Linux 内核提供的框架,可以进行多种网络相关的自定义操作。

例如:

  • 无状态的报过滤(IPv4 and IPv6)
  • 有状态的报过滤(IPv4 and IPv6)
  • 网络地址转换(NAT/NAPT)

Netfilter 在 Linux 内核中表现为一系列的hook, 并允许Linux 内核模块注册为回调函数,Linux内核模块通过回调函数操作网络报文。

架构

Netfilterk框架是如何工作的?

Netfilter 一共提供了5个hook,分别位于linux 网络栈中的各个处理节点,如下图:

--->[NF_IP_PRE_ROUTING]--->[ROUTE]--->[NF_IP_FORWARD]--->[NF_IP_POST_ROUTING]--->                              |                        ^                              |                        |                              |                     [ROUTE]                              v                        |                       [NF_IP_LOCAL_IN]        [NF_IP_LOCAL_OUT]                              |                        ^                              |                        |                              v                        |

Netfilter Hook的意义:

  • NF_IP_PRE_ROUTING: 位于路由之前,报文一致性检查之后(报文一致性检查包括: 报文版本、报文长度和checksum)。
  • NF_IP_LOCAL_IN: 位于报文经过路由之后,并且目的是本机的。
  • NF_IP_FORWARD:位于在报文路由之后,目的地非本机的。
  • NF_IP_LOCAL_OUT: 由本机发出去的报文,并且在路由之前。
  • NF_IP_POST_ROUTING: 所有即将离开本机的报文。

Linux 内核模块可以注册到任何的hook,注册的回调函数也必需指定优先级。当一个报文通过hook的时候,hook将会依据优先级调用回调函数。注册的回调函数,可以有五种返回,每种返回代表对报文不同的操作:

  • NF_ACCEPT: 继续正常处理此报文,即允许报文通过。
  • NF_DROP: 丢弃此报文,不再进行继续处理,即拒绝此报文。
  • NF_STOLEN: 取走这个报文,不再继续处理。
  • NF_QUEUE: 报文进行重新排队,可以将报文发到用户空间的程序,进行修改或者决定是拒绝或者允许。
  • NF_REPEAT: 报文重新调用hook。

什么是内核空间的iptables?

Iptables 是基于Netfilter框架实现的报文选择系统,其可以用于报文的过滤、网络地址转换和报文修改等功能。Iptables 本质上是包含了5个规则表,而规则表则包含了一些列的报文的匹配规则以及操作目标。以下对每个规则表进行了简单说明:

  • Filter Table: 是一个默认的规则表,用于报文的过滤。他注册了三个链: INPUT、FORWARD和OUTPUT。
  • NAT Table: 主要用于NAT转换,注册了四个链:PREROUTING、INPUT、OUTPUT和POSTROUTING。
  • Mangle Table: 主要用于报文的修改,一共注册了五个链: PREROUTING、OUTPUT、INPUT、FORWARD和POSTROUTING
  • Raw Table: 可以对报文不进行链路跟踪,其优先级在hook中注册很高,注册了两个链: PREROUTING和OUTPUT
  • Security Table: 用于强制网络接入控制,注册了三个链:INPUT、OUTPUT 和 FORWARD

操作目标指的是否允许报文通过,如果允许即为ACCEPT,拒绝则为DROP。

如何使用iptables命令行工具?

iptables命令行工具是工作在用户空间的操作工具,用于修改内核空间的规则表,下面给出了几个例子:

拒绝来自192.168.12.4的报文

# Drop all incoming packets from address 192.168.12.4iptables -I INPUT -s 192.168.12.4 -j DROP

拒绝ping任何主机

iptables -A OUTPUT -p icmp -j DROP

以下为来自man iptables的使用方法

# Append rule-specification in selected chainiptables [-t table] -[A] chain rule-specification [options]# Insert one or more rules in the selected chain as the given rule number.iptables [-t table] -I chain [rulenum] rule-specification [options]# Replace a rule in the selected chainiptables [-t table] -R chain rulenum rule-specification [options]# Delete one or more rules from the selected chain.iptables [-t table] -D chain rulenum [options]# List all rules in the selected chain.iptables [-t table] -[L] [chain] [options]# Flush the selected chain.iptables [-t table] -[F] [chain] [options]# Set the policy for the chain to the given target.iptables [-t table] -P chain target [options]

动手编写一个netfilter hook回调函数

以下代码实现了一个简单的linux 内核模块,并且通过netfilter hook注册了一个回调函数,以此来实现禁用ICMP报文(无法从本机ping任何主机)。

/* * This code was compiled and tested on Ubuntu 18.04.2 * with kernel version 4.15.0 */#include #include #include #include #include #include MODULE_LICENSE("GPL");MODULE_AUTHOR("Rui");MODULE_DESCRIPTION("A simple example netfilter module.");MODULE_VERSION("0.0.1");static struct nf_hook_ops *nfho = NULL;static unsigned int hfunc(void *priv, struct sk_buff *skb, const struct nf_hook_state *state){  struct iphdr *iph;  if (!skb)    return NF_ACCEPT;  iph = ip_hdr(skb);  if (iph->protocol == IPPROTO_ICMP) {    return NF_DROP;  }  return NF_ACCEPT;}static int __init LKM_init(void){  nfho = (struct nf_hook_ops*)kcalloc(1, sizeof(struct nf_hook_ops), GFP_KERNEL);  /* Initialize netfilter hook */  nfho->hook      = (nf_hookfn*)hfunc;       /* hook function */  nfho->hooknum   = NF_INET_PRE_ROUTING;     /* received packets */  nfho->pf        = PF_INET;                 /* IPv4 */  nfho->priority  = NF_IP_PRI_FIRST;         /* max hook priority */  nf_register_net_hook(&init_net, nfho);}static void __exit LKM_exit(void){  nf_unregister_net_hook(&init_net, nfho);  kfree(nfho);}module_init(LKM_init);module_exit(LKM_exit);

Makefile

obj-m += netfilter-LKM.oall:    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

在Bash Shell环境下编译,并且加载linux内核模块。

makeinsmod netfilter-LKM.ko

通过 rmmod netfilter-LKM 移除linux内核模块。

参考

1 Netfilter

2 Linux Kernel Communication Netfilter Hooks

3 Netfilter Architecture

iptables命令_理解 Linux 下的 Netfilter/iptables相关推荐

  1. linux中使用u盘和光驱的命令_在Linux下如何挂载软盘、光盘、U盘等分区

    在Linux下使用软盘.光盘等分区 -------------------------------------------------------------------------------- h ...

  2. linux tcp 丢包命令_在Linux下实现测试TCP和UDP的丢包检测!

    在Linux下实现测试TCP和UDP的丢包检测! 疯狂の猿猴 • 2020 年 12 月 11 日 前言 本人平时基本上都是win,一下子转战到linux,有点不习惯! 因此做个记录,便于以后自己查阅 ...

  3. mysql巡检常用命令_总结Linux下系统巡检常用命令

    Linux系统需要定期巡检,以检查服务器软硬件使用情况,相当于对人的体检,确保可以及时发现问题.解决问题,降低损失,常用的巡检命令如下: # uname -a # 查看内核/操作系统/CPU信息 # ...

  4. (十)洞悉linux下的Netfilteramp;iptables:网络地址转换原理之SNAT

    源地址转换:SNAT SNAT 主要应用于下列场景: 这种情况下,我们只有一个公网地址A,而又有三台主机需要同时上网,这时就需要SNAT了.它的主要作用是将那些由私网发来的数据包skb的源地址改成防火 ...

  5. linux iptables 编译,Linux下编译安装iptables

    Linux下如何编译安装iptables实例: 先卸载系统已经安装的iptables,卸载前需备份三个文档:iptables启动脚本,iptables-config配置文档,以及已经建立好的iptab ...

  6. 理解Linux下的SELinux(MAC)

    理解Linux下的SELinux 长久以来,每当遇到授权问题或者新安装的主机,我的第一反应是通过setenforce 0命令禁用SELinux,来减少产生的权限问题,但是这并不是一个良好的习惯.这篇文 ...

  7. 如何linux网页修改回80端口,linux下如何修改iptables开启80端口

    linux下如何修改iptables开启80端口 最近在做本地服务器的环境,发现网站localhost能正常访问,用ip访问就访问不了,经常使用CentOS的朋友,可能会遇到和我一样的问题.开启了防火 ...

  8. (十二)洞悉linux下的Netfilteramp;iptables:iptables命令行工具源码解析【下】

    iptables用户空间和内核空间的交互 iptables目前已经支持IPv4和IPv6两个版本了,因此它在实现上也需要同时兼容这两个版本.iptables-1.4.0在这方面做了很好的设计,主要是由 ...

  9. linux出站入站端口维护,linux下如何用iptables开放指定端口_网站服务器运行维护,linux,iptables,端口...

    win10系统老是弹出垃圾广告怎么办_网站服务器运行维护 win10系统老是弹出垃圾广告的解决方法是:1.打开控制面板,进入Internet选项:2.在打开的Internet属性窗口中,切换到[隐私] ...

最新文章

  1. 云+社区小程序知识周,等你来挑战!
  2. LVM逻辑卷管理测试——创建逻辑卷
  3. 透过现象看本质-使用vs.net第二天
  4. mysql注入式攻击_SQL的注入式攻击方式和避免方法
  5. FreeRTOS 任务间同步和通信方法
  6. [Oracle] Data Pump 详细使用教程(5)- 命令交互模式
  7. Linux Shell 实现网页爬虫
  8. 几种自动化功能测试的工具的认识
  9. 程序员必备神器(FastStoneCapture)
  10. N720实现4G的TCP连接,数据上云的方法
  11. 固态硬盘是什么接口_经常买错各种SATA和NVMe固态硬盘,有没有办法快速分辨呢?看接口...
  12. MATLAB图形计算器去广告,Mathlab Pro安卓去谷歌版下载-Mathlab计算器安卓去广告版下载v4.11.114 手机版-西西软件下载...
  13. spring源码解析--环境搭建
  14. 鸭子的应聘,我是学c++的
  15. Navicat使用pgSQL报错不能建表
  16. [转载]关于雾霾的深层原因解释
  17. android studio apk安装在模拟器可以通http获取数据;但安装在手机,就不能通过http获得数据
  18. 谷歌的请求索引功能恢复了
  19. oeasy教您玩转vim - 76 - # 组合键映射map
  20. 12.【最详细】如何用命令行cmd运行java程序

热门文章

  1. 《Java入门经典(第7版)》—— 6.11 练习
  2. 使用turtlebot来实现多点导航跟踪的问题
  3. gvim支持utf8
  4. PPT中视频投影问题
  5. 最快的ASP无组件上传类(4M只需10秒)0.96版
  6. spring中的quartz调度问题
  7. SessionLocaleResolver
  8. python flask 配置处理
  9. linux centos6 安装 crontab
  10. golang 时间原点 时间日期格式化