netfilter 是什么?

netfilter.org is home to the software of the packet filtering framework inside the Linux 2.4.x and later kernel series. 
Software commonly associated with netfilter.org is iptables. Software inside this framework enables packet filtering, network address [and port] translation (NA[P]T) and other packet mangling.
It is the re-designed and heavily improved successor of the previous Linux 2.2.x ipchains and Linux 2.0.x ipfwadm systems. netfilter is a set of hooks inside the Linux kernel that allows kernel modules to register callback functions with the network stack.
A registered callback function is then called back for every packet that traverses the respective hook within the network stack. iptables is a generic table structure for the definition of rulesets. Each rule within an IP table consists of a number of classifiers (
iptables matches) and one connected action (iptables target). netfilter, ip_tables, connection tracking (ip_conntrack, nf_conntrack) and the NAT subsystem together build the major parts of the framework.

https://www.netfilter.org/

HOOK HOWTO:

https://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO.html

  阅读之前: Packet Filtering HOWTO: https://www.netfilter.org/documentation/HOWTO//packet-filtering-HOWTO.html

    摘要:

    简单的原理,【重要】 https://www.netfilter.org/documentation/HOWTO//packet-filtering-HOWTO-6.html

Each rule specifies a set of conditions the packet must meet, and what to do if it meets them (a `target')

    iptables的使用【tutorial】: https://www.netfilter.org/documentation/HOWTO//packet-filtering-HOWTO-7.html

For these you will be able to specify the new tests on the command line after the `-p' option, which will load the extension. For explicit new tests, use the `-m' option to load the extension, 
after which the extended options will be available.
The TCP extensions are automatically loaded if `-p tcp' is specified.

  再读 NAT HOWTO: https://www.netfilter.org/documentation/HOWTO//NAT-HOWTO.html

  怎么理解SNAT和DNAT的定义?

 I call this SNAT, because you change the source address of the first packet.

  

I divide NAT into two different types: Source NAT (SNAT) and Destination NAT (DNAT).

Source NAT is when you alter the source address of the first packet: i.e. you are changing where the connection is coming from. Source NAT is always done post-routing, 
just before the packet goes out onto the wire. Masquerading is a specialized form of SNAT. Destination NAT is when you alter the destination address of the first packet: i.e. you are changing where the connection is going to.
Destination NAT is always done before routing, when the packet first comes off the wire. Port forwarding, load sharing, and transparent proxying are all forms of DNAT.

  SNAT DNAT的定义是基于连接概念的。在有了连接概念的前提下。SNAT是指修改连接第一个包的源IP地址。DNAT是之修改连接第一个包的目的IP地址。而换一个角度,连接的第一个包都是从client发向server的。SNAT动作在包离开client局域网进入网线之前的那一刻触发(POST routing)。 DNAT在包到达目标网络进入server局域网之后的第一时间触发(PER routing)。 也就是说routing过程是NAT逻辑无关的。routing看见的所有地址都是本地地址。

  见这一段,用来印证以上解释。https://www.netfilter.org/documentation/HOWTO//packet-filtering-HOWTO-9.html

  另外,透明代理和DNAT神马关系?  透明代理要做DNAT。

  三个NAT的应用场景:

1. Modern Connections To The Internet
2. Multiple Servers
3. Transparent Proxying

  Masquerading & Redirection

Masquerading
There is a specialized case of Source NAT called masquerading: it should only be used for dynamically-assigned IP addresses, such as standard dialups
(for static IP addresses, use SNAT above). Redirection
There is a specialized case of Destination NAT called redirection: it is a simple convenience which is exactly equivalent to doing DNAT to the address
of the incoming interface. ## Send incoming port- web traffic to our squid (transparent) proxy
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport \
-j REDIRECT --to-port

  终于可以进入正题了。

  重点来了: Netfilter Architecture:  https://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO-3.html

五个HOOK点

NF_IP_PRE_ROUTING
NF_IP_FORWARD
NF_IP_POST_ROUTING
NF_IP_LOCAL_IN
NF_IP_LOCAL_OUT

HOOK的返回值:

NF_ACCEPT: continue traversal as normal.
NF_DROP: drop the packet; don't continue traversal.
NF_STOLEN: I've taken over the packet; don't continue traversal.
NF_QUEUE: queue the packet (usually for userspace handling).
NF_REPEAT: call this hook again.

  tables 就是对挂在hook上面的函数的分类,分为 filter,nat,mangle等(更详细的table功能定义可以见 man tables 命令)

  见:https://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO-3.html#ss3.2

  见图:

   --->PRE------>[ROUTE]--->FWD---------->POST------>
Conntrack | Mangle ^ Mangle
Mangle | Filter | NAT (Src)
NAT (Dst) | | Conntrack
(QDisc) | [ROUTE]
v |
IN Filter OUT Conntrack
| Conntrack ^ Mangle
| Mangle | NAT (Dst)
v | Filter

  netfitler的kernel入口:https://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO-4.html

  结合代码:linux.git/net/netfilter/ipvs/ip_vs_core.c

  其他:

  

┬─[tong@T7:~/Src/thirdparty/linux.git]─[:: PM]
╰─>$ vim /etc/protocols
┬─[tong@T7:~/Src/thirdparty/linux.git]─[:: PM]
╰─>$ man protocols

  如何写一个 netfilter的module: https://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO-4.html#ss4.6

  内容有点旧了,和最新的kernal代码对应不起来。

  有助于理解forward:https://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO-6.html

完。

自然会想到 firewalld: https://firewalld.org/

[network] netfilter的更多相关文章

  1. [network] IPVS / Load balancer / Linux Virtual Server

    Load Balancer IPVS: http://kb.linuxvirtualserver.org/wiki/IPVS NAT: http://kb.linuxvirtualserver.org ...

  2. Neutron 理解 (6): Neutron 是怎么实现虚拟三层网络的 [How Neutron implements virtual L3 network]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  3. Linux Network Related Drive

    catalog . 通过套接字通信 . 网络实现的分层模型 . 网络命名空间 . 套接字缓冲区 . 网络访问层 . 网络层 . 传输层 . 应用层 . 内核内部的网络通信 1. 通过套接字通信 Lin ...

  4. Network Address Translation(转载)

    Network Address Translation  来源:http://alexanderlaw.blog.hexun.com/9791596_d.html       地址转换用来改变源/目的 ...

  5. (转)Netfilter分析

    看到一篇讲Netfilter框架的,如果有一点基础了的话对于捋清整个框架很好帮助,转下来细细阅读. 转自http://aichundi.blog.163.com/blog/static/7013846 ...

  6. Linux数据包路由原理、Iptables/netfilter入门学习

    相关学习资料 https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html http://zh.wik ...

  7. 深入Linux网络核心堆栈(对于netfilter的用法和讲解)

    http://blog.csdn.net/wswifth/article/details/5115475 注册一个hook函数是围绕nf_hook_ops数据结构的一个非常简单的操作,nf_hook_ ...

  8. iptables or netfilter

    netfilter 内部有三个表:filter .nat .mangle 每个表又有不同的操作链: 1.在filter这个防火墙功能的表中有三个chain:INPUT.FORWARD.OUTPUT. ...

  9. RH253读书笔记(5)-Lab 5 Network File Sharing Services

    Lab 5 Network File Sharing Services Goal: Share file or printer resources with FTP, NFS and Samba Se ...

随机推荐

  1. ECMAScript 6 入门之let和const的用法

    1.let的用法 1. //查看js的引入路径是否正确 console.log("1:",1) 2. var a=1; let b=2; console.log("a:& ...

  2. 【MQTT】Mosquitto的安装与使用流水记

    最近使用MQTT,安装Mosquitto试一下,并记录下来. 软件准备 从官网获取安装包: wget http://mosquitto.org/files/source/mosquitto-1.4.1 ...

  3. 【转】SAP BW 顾问靠手 — SAP中的例程

    什么是例程(Routine)? 例程就是我们可以自己定义的程序代码.通过程序代码来完成我们的需求,因为业务是千变万化,如果想让产品能跟随上业务的脚步,就必须要有非常灵活的功能来补充.大家都知道软件产品 ...

  4. Linux下搭建LAMP环境(YUM)

    安装Apache 1.安装Apache yum -y install httpd 2. Apache配置httpd.conf 通过命令 find / -name httpd.conf 找到Apache ...

  5. 【转】WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要内容: 菜单Menu的自定义样式: 右键菜单ContextMenu的自定义样式 ...

  6. laravel 5.4 中使用migrate

    1. 创建表结构 a. 命令: php artisan make:migration create_posts_table 2.生产文件 <?php use Illuminate\Support ...

  7. Ubuntu上运行Blender,在控制台上查看运行结果

    1.首先在控制台打开Blender. 具体操作:找到Blender的安装路径,我的是:/home/lcx/下载/blender-2.78c-linux-glibc219-x86_64 $cd /hom ...

  8. Weebly免费自助建站空间:可视化编辑网页搭建网站和绑定域名方法

    Weebly空间来自美国,已经稳定运行了有多年了,2007年被Time 评为50个最佳网站,属自助建站模式,功能强大.部落在09年时介绍了weebly.com自助建站服务,没有想到这多年来,Weebl ...

  9. 如何在django里面添加自定义命令

    第一步:创建对应的目录 第二步:继承父类,写自己的逻辑代码 第三步:执行 manage.py 查看自己的命令

  10. 【QT】error: 'SIGNAL' was not declared in this scope

    error: 'SIGNAL' was not declared in this scope  未在此范围内声明. connect(ui->Btnshowhello,SIGNAL(clicked ...