iptables命令_理解 Linux 下的 Netfilter/iptables
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相关推荐
- linux中使用u盘和光驱的命令_在Linux下如何挂载软盘、光盘、U盘等分区
在Linux下使用软盘.光盘等分区 -------------------------------------------------------------------------------- h ...
- linux tcp 丢包命令_在Linux下实现测试TCP和UDP的丢包检测!
在Linux下实现测试TCP和UDP的丢包检测! 疯狂の猿猴 • 2020 年 12 月 11 日 前言 本人平时基本上都是win,一下子转战到linux,有点不习惯! 因此做个记录,便于以后自己查阅 ...
- mysql巡检常用命令_总结Linux下系统巡检常用命令
Linux系统需要定期巡检,以检查服务器软硬件使用情况,相当于对人的体检,确保可以及时发现问题.解决问题,降低损失,常用的巡检命令如下: # uname -a # 查看内核/操作系统/CPU信息 # ...
- (十)洞悉linux下的Netfilteramp;iptables:网络地址转换原理之SNAT
源地址转换:SNAT SNAT 主要应用于下列场景: 这种情况下,我们只有一个公网地址A,而又有三台主机需要同时上网,这时就需要SNAT了.它的主要作用是将那些由私网发来的数据包skb的源地址改成防火 ...
- linux iptables 编译,Linux下编译安装iptables
Linux下如何编译安装iptables实例: 先卸载系统已经安装的iptables,卸载前需备份三个文档:iptables启动脚本,iptables-config配置文档,以及已经建立好的iptab ...
- 理解Linux下的SELinux(MAC)
理解Linux下的SELinux 长久以来,每当遇到授权问题或者新安装的主机,我的第一反应是通过setenforce 0命令禁用SELinux,来减少产生的权限问题,但是这并不是一个良好的习惯.这篇文 ...
- 如何linux网页修改回80端口,linux下如何修改iptables开启80端口
linux下如何修改iptables开启80端口 最近在做本地服务器的环境,发现网站localhost能正常访问,用ip访问就访问不了,经常使用CentOS的朋友,可能会遇到和我一样的问题.开启了防火 ...
- (十二)洞悉linux下的Netfilteramp;iptables:iptables命令行工具源码解析【下】
iptables用户空间和内核空间的交互 iptables目前已经支持IPv4和IPv6两个版本了,因此它在实现上也需要同时兼容这两个版本.iptables-1.4.0在这方面做了很好的设计,主要是由 ...
- linux出站入站端口维护,linux下如何用iptables开放指定端口_网站服务器运行维护,linux,iptables,端口...
win10系统老是弹出垃圾广告怎么办_网站服务器运行维护 win10系统老是弹出垃圾广告的解决方法是:1.打开控制面板,进入Internet选项:2.在打开的Internet属性窗口中,切换到[隐私] ...
最新文章
- 云+社区小程序知识周,等你来挑战!
- LVM逻辑卷管理测试——创建逻辑卷
- 透过现象看本质-使用vs.net第二天
- mysql注入式攻击_SQL的注入式攻击方式和避免方法
- FreeRTOS 任务间同步和通信方法
- [Oracle] Data Pump 详细使用教程(5)- 命令交互模式
- Linux Shell 实现网页爬虫
- 几种自动化功能测试的工具的认识
- 程序员必备神器(FastStoneCapture)
- N720实现4G的TCP连接,数据上云的方法
- 固态硬盘是什么接口_经常买错各种SATA和NVMe固态硬盘,有没有办法快速分辨呢?看接口...
- MATLAB图形计算器去广告,Mathlab Pro安卓去谷歌版下载-Mathlab计算器安卓去广告版下载v4.11.114 手机版-西西软件下载...
- spring源码解析--环境搭建
- 鸭子的应聘,我是学c++的
- Navicat使用pgSQL报错不能建表
- [转载]关于雾霾的深层原因解释
- android studio apk安装在模拟器可以通http获取数据;但安装在手机,就不能通过http获得数据
- 谷歌的请求索引功能恢复了
- oeasy教您玩转vim - 76 - # 组合键映射map
- 12.【最详细】如何用命令行cmd运行java程序