From : http://www.cnblogs.com/shijiaqi1066/p/3812510.html
Linux数据包路由原理、Iptables/netfilter入门学习:https://blog.csdn.net/lihao1102150823/article/details/73331291
From:http://www.cnblogs.com/sammyliu/p/4658746.html
From:http://www.excelib.com/article/287/show/
From : http://www.linuxidc.com/Linux/2013-07/87045.htm
Linux之iptables原理详解:https://www.cnblogs.com/zllong/p/7236881.html
linux命令:iptables、modprobe装载模块、网络防火墙服务:http://blog.51cto.com/woyaoxuelinux/1906316
iptables常用实例备查:https://blog.csdn.net/hxpjava1/article/details/73656693
25个iptables常用示例:https://www.cnblogs.com/chencaiming/articles/10880833.html
防火墙(Firewall),也称防护墙,是由 Check Point 创立者 Gil Shwed 于1993年发明并引入国际互联网(US5606668(A)1993-12-15)。它是位于内部网络与外部网络之间的一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。
防火墙就是一种过滤塞(你这么理解不算错),你可以让你喜欢的东西通过这个塞子,不喜欢的都统统过滤掉。
在网络的世界里,防火墙要过滤的就是承载通信数据的 通信包(数据包)。
在网络中,所谓 "防火墙" 就是 隔离 两个网络的一种 隔离技术,依照特定的规则来控制进出它的网络流量的网络安全系统。
例如:将 内部网 和 公众访问网(如Internet)分开的方法,它能允许你 "同意" 的数据进入你的网络,同时将你 "不同意" 的数据拒之门外,最大限度地阻止网络中的黑客来访问你的网络。假设公司安装了防火墙,如果不通过防火墙,公司内部的人就无法访问 Internet,Internet上的人也无法和公司内部的人进行通信。
防火墙从诞生开始,已经历了四个发展阶段:
常见的防火墙属于具有安全操作系统的防火墙,例如:NETEYE、NETSCREEN、TALENTIT等。
一个典型的场景是在一个受信任的内网和不受信任的外网比如 Internet 之间建立一个屏障。防火墙可以是电脑上运行的软件,也可以是独立的硬件设备。
从结构上来分,防火墙有两种:
从原理上来分,防火墙则可以分成4种类型:( 安全性能高的防火墙系统都是组合运用多种类型防火墙,构筑多道防火墙“防御工事”。 )
第一代防火墙技术几乎与路由器同时出现,采用了包过滤(Packet filter)技术。它检查每一个通过的网络包,或者丢弃,或者放行,取决于所建立的一套规则。这称为包过滤防火墙。
本质上,包过滤防火墙是多址的,表明它有两个或两个以上网络适配器或接口。例如,作为防火墙的设备可能有两块网卡(NIC),一块连到内部网络,一块连到公共的Internet。防火墙的任务,就是作为“通信警察”,指引包和截住那些有危害的包。
包过滤型防火墙 工作在 OSI 网络参考模型的 网络层 和 传输层,检查每一个传入包,查看包中可用的基本信息 ,如:数据包头源地址,目的地址、端口号和协议类型等标志,然后将这些信息与设立的规则相比较后在确定是否允许通过。只有满足过滤条件的数据包才被转发到相应的目的地,其余数据包则从数据流中被丢弃。
多个复杂规则的组合也是可行的。如果允许Web连接,但只针对特定的服务器,目的端口和目的地址二者必须与规则相匹配,才可以让该包通过。
最后,可以确定当一个包到达时,如果对该包没有规则被定义,接下来将会发生什么事情了。通常,为了安全起见,与传入规则不匹配的包就被丢弃了。如果有理由让该包通过,就要建立规则来处理它。
建立包过滤防火墙规则的例子如下:
动态包过滤(Dynamic packet filter)技术的第四代防火墙,后来演变为所说的 状态监视(Stateful inspection)技术。状态/动态检测防火墙,试图跟踪通过防火墙的网络连接和包,这样防火墙就可以使用一组附加的标准,以确定是否允许和拒绝通信。它是在使用了基本包过滤防火墙的通信上应用一些技术来做到这点的。检测型防火墙技术与过滤型相类似,可谓是过滤型的加强版,又称为动态过滤型技术。
一个状态/动态检测防火墙可截断所有传入的通信,而允许所有传出的通信。因为防火墙跟踪内部出去的请求,所有按要求传入的数据被允许通过,直到连接被关闭为止。只有未被请求的传入通信被截断。
如果在防火墙内正运行一台服务器,配置就会变得稍微复杂一些,但状态包检查是很有力和适应性的技术。例如,可以将防火墙配置成只允许从特定端口进入的通信,只可传到特定服务器。如果正在运行Web服务器,防火墙只将80端口传入的通信发到指定的Web服务器。
状态/动态检测防火墙可提供的其他一些额外的服务有:
将某些类型的连接重定向到审核服务中去。例如,到专用Web服务器的连接,在Web服务器连接被允许之前,可能被发到SecutID服务器(用一次性口令来使用)。
拒绝携带某些数据的网络通信,如带有附加可执行程序的传入电子消息,或包含ActiveX程序的Web页面。
跟踪连接状态的方式取决于包通过防火墙的类型:
TCP包。当建立起一个TCP连接时,通过的第一个包被标有包的SYN标志。通常情况下,防火墙丢弃所有外部的连接企图,除非已经建立起某条特定规则来处理它们。对内部的连接试图连到外部主机,防火墙注明连接包,允许响应及随后再两个系统之间的包,直到连接结束为止。在这种方式下,传入的包只有在它是响应一个已建立的连接时,才会被允许通过。
UDP包。UDP包比TCP包简单,因为它们不包含任何连接或序列信息。它们只包含源地址、目的地址、校验和携带的数据。这种信息的缺乏使得防火墙确定包的合法性很困难,因为没有打开的连接可利用,以测试传入的包是否应被允许通过。可是,如果防火墙跟踪包的状态,就可以确定。对传入的包,若它所使用的地址和UDP包携带的协议与传出的连接请求匹配,该包就被允许通过。和TCP包一样,没有传入的UDP包会被允许通过,除非它是响应传出的请求或已经建立了指定的规则来处理它。对其他种类的包,情况和UDP包类似。防火墙仔细地跟踪传出的请求,记录下所使用的地址、协议和包的类型,然后对照保存过的信息核对传入的包,以确保这些包是被请求的。
应用代理型防火墙是工作在 OSI 的最高层,即 应用层。其特点是完全 "阻隔" 了网络通信流,通过对每种应用服务编制专门的代理程序,实现监视和控制应用层通信流的作用。应用程序代理防火墙实际上并不允许在它连接的网络之间直接通信。相反,它是接受来自内部网络特定用户应用程序的通信,然后建立于公共网络服务器单独的连接。网络内部的用户不直接与外部的服务器通信,所以服务器不能直接访问内部网的任何一部分。
另外,如果不为特定的应用程序安装代理程序代码,这种服务是不会被支持的,不能建立任何连接。这种建立方式拒绝任何没有明确配置的连接,从而提供了额外的安全性和控制性。
例如,一个用户的 Web 浏览器可能在 80 端口,但也经常可能是在 1080 端口,连接到了内部网络的HTTP代理防火墙。防火墙然后会接受这个连接请求,并把它转到所请求的Web服务器。
这种连接和转移对该用户来说是透明的,因为它完全是由代理防火墙自动处理的。
代理防火墙通常支持的一些常见的应用程序有:HTTP、HTTPS/SSL、SMTP、POP3、IMAP、NNTP、TELNET、FTP、IRC
应用程序代理防火墙可以配置成允许来自内部网络的任何连接,它也可以配置成要求用户认证后才建立连接。要求认证的方式由只为已知的用户建立连接的这种限制,为安全性提供了额外的保证。如果网络受到危害,这个特征使得从内部发动攻击的可能性大大减少。
讨论到防火墙的主题,就一定要提到有一种路由器,尽管从技术上讲它根本不是防火墙。网络地址转换(NAT)协议将内部网络的多个IP地址转换到一个公共地址发到Internet上。
NAT 经常用于小型办公室、家庭等网络,多个用户分享单一的 IP 地址,并为 Internet 连接提供一些安全机制。
当内部用户与一个公共主机通信时,NAT 追踪是哪一个用户作的请求,修改传出的包,这样包就像是来自单一的公共IP地址,然后再打开连接。一旦建立了连接,在内部计算机和Web站点之间来回流动的通信就都是透明的了。
当从公共网络传来一个未经请求的传入连接时,NAT 有一套规则来决定如何处理它。如果没有事先定义好的规则,NAT 只是简单的丢弃所有未经请求的传入连接,就像包过滤防火墙所做的那样。
可是,就像对包过滤防火墙一样,你可以将 NAT 配置为接受某些特定端口传来的传入连接,并将它们送到一个特定的主机地址。
现在网络上流传着很多的个人防火墙软件,它是应用程序级的。个人防火墙是一种能够保护个人计算机系统安全的软件,它可以直接在用户的计算机上运行,使用与状态/动态检测防火墙相同的方式,保护一台计算机免受攻击。通常,这些防火墙是安装在计算机网络接口的较低级别上,使得它们可以监视传入传出网卡的所有网络通信。
一旦安装上个人防火墙,就可以把它设置成“学习模式”,这样的话,对遇到的每一种新的网络通信,个人防火墙都会提示用户一次,询问如何处理那种通信。然后个人防火墙便记住响应方式,并应用于以后遇到的相同那种网络通信。
例如,如果用户已经安装了一台个人Web服务器,个人防火墙可能将第一个传入的Web连接作上标志,并询问用户是否允许它通过。用户可能允许所有的Web连接、来自某些特定IP地址范围的连接等,个人防火墙然后把这条规则应用于所有传入的Web连接。
基本上,你可以将个人防火墙想象成在用户计算机上建立了一个虚拟网络接口。不再是计算机的操作系统直接通过网卡进行通信,而是以操作系统通过和个人防火墙对话,仔细检查网络通信,然后再通过网卡通信。
Linux 防火墙在企业应用中非常有用,举例如下:
综述,Iptables 有两种应用模式:主机防火墙,NAT路由器。
Netfilter 是由 Rusty Russell 提出的 Linux 2.4 内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。Netfilter/Iptables 数据包过滤系统可以当成一个整体,netfilter是内核的模块实现,iptables是对上层操作工具。
Iptables 是一个管理内核包过滤的工具,可以用来配置核心包过滤表格中的规则。运行于用户空间。
netfilter 和 iptables 区别在于( 如果不严格的区分,则在Linux 中 netfilter 和 iptables 都可以认为是指 Linux 防火墙 ):
- netfilter 是 Linux 的2.4版内核引入了一种全新的包过滤引擎,称为 Netfilter。指的是Linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”的防火墙功能体系。Netfilter 所设置的规则是存放在内核内存中的,
- iptables 是用来管理 Linux 防火墙的命令程序,是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改,这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。iptables 通常位于/sbin/iptables,属于“用户态”的防火墙管理体系。iptables 是控制 Netfilter 的工具,是Linux 2.2版内核中比较老的命令 ipchains 的兄弟。类似的应用程序还有 firewalld 。
iptables 和 firewalld:firewalld 跟 iptables 比起来至少有两大好处:
- 1、firewalld 可以动态修改单条规则,而不需要像 iptables 那样,在修改了规则后必须得全部刷新才可以生效;
- 2、firewalld 在使用上要比 iptables 人性化很多,即使不明白 “五张表五条链” ,而且对 TCP/IP协议也不理解也可以实现大部分功能。
iptables 将写好的规则保存在 netfilter 的某些表的某些链中,进而才起到防火墙的功能。
Netfilter 是 Linux 核心中的一个通用架构,工作于内核空间。是 Linux 操作系统核心层内部的一个数据包处理模块,它具有如下功能:网络地址转换(Network Address Translate)、数据包内容修改、以及数据包过滤的防火墙功能
iptables 和 netfilter 的联系?
很多人一提到防火墙立马就想到了是 iptables,其实 iptables 并不是防火墙,他只是一个软件或者说是一个工具,这个软件可以编写某些规则,将写好的规则保存到 netfilter 的规则数据库中。因此,真正起到"防火" 的功能是 netfilter,并不是 iptables。netfilter 是内核中的一个框架,这个框架里面包含了 4个表 和 5个链,这些链又包含了很多的规则。而数据包要比对的规则就是这个链中所定义的规则。
在下述的内容中我们就以 iptables 来称呼 Linux 防火墙了。
chain 的本质是 Netfilter 定义的不同过滤点。总共定义了5个过滤点。INPUT,FORWARDING,OUTPUT,PREROUTING,POSTROUTIONG。
Table 的本质是 Netfilter 定义的不同功能的划分。
filter 用于执行基本过滤。
nat 是对数据IP进行修改。
mangle 是对数据包进行高级修改。
不同的 Table 只能用于特定的 Chain。
1. Netfilter 是 Linux 操作系统核心层内部的一个数据包处理模块,它具有如下功能:
1) 网络地址转换(Network Address Translate)
2) 数据包内容修改
3) 以及数据包过滤的防火墙功能
Netfilter平台中制定了五个数据包的挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候有机会改变它们
的方向、内容),这5个挂载点分别是
1) PRE_ROUTING
2) INPUT
3) OUTPUT
4) FORWARD
5) POST_ROUTING
2. Iptables
Netfilter所设置的规则是存放在内核内存中的,Iptables是一个应用层(Ring3)的应用程序,它通过Netfilter放出的接口来对存放在内核内存中的Xtables(Netfilter的配置表)进行修改
(这是一个典型的Ring3和Ring0配合的架构)
Netfilter提供了一系列的表(tables),每个表由若干个链(chains)组成,每条链可以由一条或若干条规则(rules)组成,其规则由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。即 iptables把有次序的规则 "链(chains)" 应用到网络包上。链的集合就构成了"表(tables)",用于处理特殊类型的流量。
Netfilter支持一下方式对数据包进行分类:源IP地址、目标IP地址、使用接口、使用协议、端口号、连接状态。
Netfilter 是负责实际的数据流改变工作的内核模块,而 Xtables 就是它的规则配置文件,Netfilter 依照 Xtables 的规则来运行,Iptables 在应用层负责修改这个规则文件。
Xtables 由 "表"、"链"、"规则rule" 组成
1. Filter(表)
filter表是专门过滤包的,内建三个链,可以毫无问题地对包进行DROP、LOG、ACCEPT和REJECT等操作
1) INPUT(链)
INPUT针对那些目的地是本地的包
1.1) 规则rule
..
2) FORWARD(链)
FORWARD链过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包
2.1) 规则rule
..
3) OUTPUT(链)
OUTPUT是用来过滤所有本地生成的包
3.1) 规则rule
..
2. Nat(表)
Nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包(因为包
的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表
,一个一个的被NAT,而是自动地完成
1) PREROUTING(链)
PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址
1.1) 规则rule
..
2) INPUT(链)
2.1) 规则rule
..
3) OUTPUT(链)
OUTPUT链改变本地产生的包的目的地址
3.1) 规则rule
..
4) POSTROUTING(链)
POSTROUTING链在包就要离开防火墙之前改变其源地址。
4.1) 规则rule
..
3. Mangle(表)
这个表主要用来mangle数据包。我们可以改变不同的包及包 头的内容,比如 TTL,TOS或MARK。 注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规
则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。注意,mangle表不能做任何NAT,它只是改变数据包的TTL,TOS或MARK,而不是其源目地址。NAT必须在nat表中操作的。
1) PREROUTING(链)
PREROUTING在包进入防火墙之后、路由判断之前改变 包
1.1) 规则rule
..
2) INPUT(链)
INPUT在包被路由到本地之后,但在用户空间的程序看到它之前改变包
2.1) 规则rule
..
3) FORWARD(链)
FORWARD在最初的路由判断之后、最后一次更改包的目的之前mangle包
3.1) 规则rule
..
4) OUTPUT(链)
OUTPUT在确定包的目的之前更改数据包
4.1) 规则rule
..
5) POSTROUTING(链)
POSTROUTING是在所有路由判断之后
5.1) 规则rule
..
规则(rules)是管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
每个链上都有默认的规则。
表(tables)提供特定的功能,iptables有4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。表中的规则写在链上
iptables 的作用在于为包过滤机制的实现提供规则,通过各种不同的规则,告诉 netfilter 对来自某些源,前往某些目的的或具有某些协议特征的数据包应该如何处理。
为了更加方便地组织和管理防火墙规则,iptables采用了 "表" 和 "链" 的分层结构。
1、table 有 filter、nat、mangle 等 规则表;
规则表中包含各种规则链,iptables 管理着四个不同的规则表,其功能分别由独立的内核模块实现。各表解释如下:
filter表:主要用来对数据包进行过滤,根据具体的规则要求决定如何处理一个数据包。
包含INPUT、FORWAED、OUTPUT等三个规则链。
nat表:主要用修改数据包IP地址、端口号等信息,也称网络地址转换。
包含PREROUTING、POSTROUTING、OUTPUT等三个规则链。
mangle表:主要用来修改数据包的TOS,TTL值,或者为数据包设置Mark标记,
以实现流量整形,策略路由等高级应用。
包含PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD等五个规则链。
raw表:主要用来决定是否对数据包进行状态跟踪。包含OUTPUT、PREROUTING两个规则链。
filter 表:主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:
INPUT
链:INPUT针对那些目的地是本地的包FORWARD
链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的OUTPUT
链:OUTPUT是用来过滤所有本地生成的包 nat 表:主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链
PREROUTING
链:作用是在包刚刚到达防火墙时改变它的目的地址OUTPUT
链:改变本地产生的包的目的地址POSTROUTING
链:在包就要离开防火墙之前改变其源地址mangle 表:主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。
raw 表:是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING
iptables 的 规则表 和 规则链 的示意图如下:
在 iptables 规则表中,filter表 和 nat表 用的比较多,而其他两个表用的相对来说比较少。所以后面我们大多是以 filter表 和 nat表 中的规则链做策略。
在这些表当中,raw表的优先级最高,其次是mangle表,接着是nat表,最后才是filter表
因此,他们的优先级顺序应该是这样的:raw ---> mangle ---> nat ---> filter 。 即 raw > mangle > nat > filter
因此,当一个数据包进入到防火墙时,它会依次根据这些表中的相关链中的规则对数据包进行匹配,允许则通过,拒绝则丢弃。
出防火墙时,也是根据这个顺序进行规则匹配的,允许则通过,拒绝则丢弃。
iptables中数据包和 4种被跟踪连接 的4种不同状态:
NEW
:该包想要开始一个连接(重新连接或将连接重定向)RELATED
:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。--icmp-type 0
( ping 应答) 就是--icmp-type 8
(ping 请求)所RELATED出来的。ESTABLISHED
:只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。INVALID
:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。
2、规则链
规则链的作用是容纳各种防火墙规则,规则两分为五种,分别在不同的时机处理数据包。
INPUT 链: 处理入站数据包。
OUTOPUT 链: 处理出站数据包。
FORWARD 链: 处理转发数据包。
POSTROUTING 链: 在进行路由选择后处理数据包。
PREROUTING 链: 在进行路由选择前处理数据包。
其中 INPUT 和 OUTPUT链主要用在“主机型防火墙”中,
而 FORWARD、POSTROUTING和PREROUTING链主要用在“网关防火墙”中。
Linux 防火墙的原理主要是对数据包的控制,看下图(以下图片均来自互联网):netfilter 五条链相互关系,即 iptables 数据包转发流程图。
详细的数据包流程
(图片引用 https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg)
Netfilter 在五个链上,使用 HOOK 技术做规则检查。Netfilter 平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTING
、INPUT
、OUTPUT
、FORWARD
、POST_ROUTING
。
注意:熟知数据包过滤的匹配流程是学习iptables的重点,只有知道数据包经过防火墙的过程,我们才知道在那个表的那个链里面设置规则可以对数据包进行如何操作。
当数据包抵达防火墙时,将依次应用raw,mangle,net和filter表中对应链内的规则(如果有的话)。
入站数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理,然后进行路由选择,如果数据的目标地址时防火墙本机,那么内核将其传递给INPUT链进行处理,通过处理后再交给上层应用程序。
转发数据流向:来自外界的数据包到达防火墙,首先被PREROUTING链处理,然后再进行路由选择,如果数据包的目标地址是其他外部地址,则内核将其传递给FORWARD链处理,最后交给POSTROUTING链进行处理。
出站数据流向:防火墙向外部地址发送数据包,首相被OUTPUT链进行处理,然后进进行路由选择,再交给POSTROUTING链进行处理。
当数据包经过规则链时,依次按照第一条规则,第二条规则......的顺序进行匹配和处理,链内的过滤遵循“匹配即停止”的原则,一旦找到一条匹配的规则,则不在检查本链中后续的规则。
规则执行流程梳理:
iptables 执行规则时,是从规则表中从上至下顺序执行的。
1. 若没遇到匹配的规则,就一条一条往下匹配;
2. 若完全没有匹配的规则,则执行该链上的默认规则;
3. 若遇到匹配的规则,则执行规则,执行后根据本规则的动作(accept,reject,log,drop等),决定下一步执行的情况,后续执行一般有三种情况:
- 继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。
- 中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行。
- 中止所有规则队列的执行。
透过这种机制可以进行复杂、多重的封包过滤,简单的说,iptables可以进行纵横交错式的过滤(tables)而非链状过滤(chains)。
Linux之iptables原理详解:https://www.cnblogs.com/zllong/p/7236881.html
理解了 Netfilter 和 Iptables 的架构和作用,并且学习了控制Netfilter行为的Xtables表的结构,那么这个Xtables表是怎么在内核协议栈的数据包路由中起作用的呢?
工作流程:网口数据包由底层的网卡NIC接收,通过数据链路层的解包之后(去除数据链路帧头),就进入了TCP/IP协议栈(本质就是一个处理网络数据包的内核驱动)和Netfilter混合的数据包处理流程中了。数据包的接收、处理、转发流程构成一个有限状态向量机,经过一些列的内核处理函数、以及Netfilter Hook点,最后被转发、或者本次上层的应用程序消化掉。
从上图中,我们可以总结出以下规律:
在写iptables规则的时候,要时刻牢记这张路由次序图,根据所在Hook点的不同,灵活配置规则
使用 Iptables 是一个非常灵活的过程,我们在写规则的时候,一定要时刻牢记上面的这张 "数据包路由图",明白在5个Hook点,3种"表"分别所处的位置,以及结合在这个5个Hook点可以实现的功能,来理解规则。理解规则的原理比强记规则本身效果要好得多
命令格式:
示例:
iptables -I INPUT -s 0/0 -d 192.168.42.153 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
iptables -t filter -I INPUT -d 192.168.42.153 -p tcp --dport 80 -j ACCEPT
1.[-t 表名]
:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter
-A
:新增一条规则,到该规则链列表的最后一行-I
:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1-D
:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除-R
:替换某条规则,规则替换不会改变顺序,而且必须指定编号。-P
:设置某条规则链的默认动作-nL
:-L
、-n
,查看当前运行的防火墙规则列表2. chain名
:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等
[规则编号]
:插入、删除、替换规则时用,--line-numbers
显示号码[-i|o 网卡名称]
:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出[-p 协议类型]
:可以指定规则应用的协议,包含tcp、udp和icmp等[-s 源IP地址]
:源主机的IP地址或子网地址[--sport 源端口号]
:数据包的IP的源端口号[-d目标IP地址]
:目标主机的IP地址或子网地址[--dport目标端口号]
:数据包的IP的目标端口号3. -m
:extend matches,这个选项用于提供更多的匹配参数,如:
4. <-j 动作>
:处理数据包的动作,包括ACCEPT、DROP、REJECT等
ACCEPT
:允许数据包通过DROP
:直接丢弃数据包,不给任何回应信息REJECT
:拒绝数据包通过,必要时会给数据发送端一个响应的信息。
SNAT
:源地址转换。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。MASQUERADE
,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上
DNAT
:目标地址转换。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。(感谢网友提出之前这个地方与SNAT写反了)REDIRECT
:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。
LOG
:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
除去最后一个
LOG
,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。
大家在自己的实验中可以举一反三
0x1: 提出需求
1. 网口at0(10.0.0.1)是一个伪AP的网口,目标客户端连接到伪AP网口at0之后会发
起DHCPDISCOVER过程,监听在at0上的DHCPD会进行回应,
为客户端分配10.0.0.100的IP地址,并设置客户端的默认网关为10.0.0.1(即at0的IP地址)、
默认DNS服务器为10.0.0.1(即at0的IP地址)
2. 需要将网口at0(10.0.0.1)的入口流量牵引到真正连接外网的网卡接口
eth0(192.168.159.254)上,做一个NAT服务
3. 对网口at0(10.0.0.1)的DHCP流量(目的端口67的广播数据包)予以放行,
因为我们需要在伪AP所在的服务器上假设DHCP服务器
4. 对网口at0(10.0.0.1)的DNS流量(目的端口53)予以放行,
因为我们需要在伪AP所在的服务器上假设DNS服务器
0x2: 逐步抽象化我们的需求
我们根据我们的需求进行抽象化,即用规则来抽象化描述我们的目的,在编写的过程中要注意不同的Hook点所能做的修改是不同的
// 开启Linux路由转发开关,由于本机对数据包进行转发
echo "1" > /proc/sys/net/ipv4/ip_forward
// 将客户端的HTTP流量进行NAT,改变数据包的SrcIP,
// 注意,是在POSTROUTING(数据包即将发送出去之前进行修改)
iptables -t nat -A POSTROUTING -p tcp -s 10.0.0.0/24 --dport 80 -j SNAT --to-source 192.168.159.254
// 将远程WEB服务器返回来的HTTP流量进行NAT,回引回客户端,
// 注意,是在PREROUTING(数据包刚进入协议栈之后马上就修改)
iptables -t nat -A PREROUTING -p tcp -d 192.168.159.254 -j DNAT --to 10.0.0.100
我们在DHCP服务器中指定客户端的默认DNS服务器是10.0.0.1(本机),即伪DNS,但我目前还没有在本机架设DNS,所以目前还需要将53号端口的DNS数据包NAT出去,牵引到谷歌的DNS: 8.8.8.8上去
iptables -t nat -A PREROUTING -p udp -s 10.0.0.0/24 --dport 53 -j DNAT --to 8.8.8.8
iptables -t nat -A POSTROUTING -p udp -s 10.0.0.0/24 --dport 53 -j SNAT --to-source 192.168.159.254
iptables -t nat -A PREROUTING -p udp -d 192.168.159.254 --sport 53 -j DNAT --to 10.0.0.100
iptables -t nat -A POSTROUTING -p udp -s 8.8.8.8 --sport 53 -j SNAT --to-source 10.0.0.1
命令: -A, --append
范例: iptables -A INPUT ...
说明: 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。
命令: -D, --delete
范例: iptables -D INPUT --dport 80 -j DROP
iptables -D INPUT 1
说明: 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
命令: -R, --replace
范例: iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明: 取代现行规则,规则被取代后并不会改变顺序。
命令: -I, --insert
范例: iptables -I INPUT 1 --dport 80 -j ACCEPT
说明: 插入一条规则,原本该位置上的规则将会往后移动一个顺位。
命令: -L, --list
范例1: iptables -L INPUT
说明: 列出某规则链中的所有规则。
范例2: iptables -t nat -L
说明: 列出nat 表所有链中的所有规则。
命令: -F, --flush
范例: iptables -F INPUT
说明: 删除filter 表中INPUT 链的所有规则。
命令: -Z, --zero
范例: iptables -Z INPUT
说明: 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
命令: -N, --new-chain
范例: iptables -N allowed
说明: 定义新的规则链。
命令: -X, --delete-chain
范例: iptables -X allowed
说明: 删除某个规则链。
命令: -P, --policy
范例: iptables -P INPUT DROP
说明: 定义过滤政策。也就是未符合过滤条件之封包, 默认的处理方式。
命令: -E, --rename-chain
范例: iptables -E allowed disallowed
说明: 修改某自定义规则链的名称。
3. [match] 常用封包匹配参数
参数: -p, --protocol
范例: iptables -A INPUT -p tcp
说明: 匹配通讯协议类型是否相符,可以使用! 运算符进行反向匹配,例如:
-p !tcp
意思是指除tcp 以外的其它类型,如udp、icmp ...等。
如果要匹配所有类型,则可以使用all 关键词,例如:
-p all
参数: -s, --src, --source
范例: iptables -A INPUT -s 192.168.1.1
说明: 用来匹配封包的来源IP,可以匹配单机或网络,匹配网络时请用数字来表示子网掩码,
例如:
-s 192.168.0.0/24
匹配IP 时可以使用! 运算符进行反向匹配,例如:
-s! 192.168.0.0/24。
参数: -d, --dst, --destination
范例: iptables -A INPUT -d 192.168.1.1
说明: 用来匹配封包的目的地IP,设定方式同上。
参数: -i, --in-interface
范例: iptables -A INPUT -i eth0
说明: 用来匹配封包是从哪块网卡进入,可以使用通配字符+ 来做大范围匹配,例如:
-i eth+
表示所有的ethernet 网卡
也可以使用! 运算符进行反向匹配,例如:
-i !eth0
参数: -o, --out-interface
范例: iptables -A FORWARD -o eth0
说明: 用来匹配封包要从哪块网卡送出,设定方式同上。
参数: --sport, --source-port
范例: iptables -A INPUT -p tcp --sport 22
说明: 用来匹配封包的源端口,可以匹配单一端口,或是一个范围,例如:
--sport 22:80
表示从22 到80 端口之间都算是符合条件,如果要匹配不连续的多个端口,则必须使用
--multiport 参数,详见后文。匹配端口号时,可以使用! 运算符进行反向匹配。
参数: --dport, --destination-port
范例: iptables -A INPUT -p tcp --dport 22
说明: 用来匹配封包的目的地端口号,设定方式同上
参数: --tcp-flags
范例: iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
说明: 匹配TCP 封包的状态标志;
参数分为两个部分,
第一个部分列举出想匹配的标志,
第二部分则列举前述标志中哪些有被设置,未被列举的标志必须是空的。
TCP 状态标志包括:
SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急) 、PSH(强迫推送)
等均可使用于参数中,
除此之外还可以使用关键词ALL 和NONE 进行匹配。
匹配标志时,可以使用! 运算符行反向匹配。
参数: --syn
范例: iptables -p tcp --syn
说明: 用来表示TCP 通信协议中,SYN 位被打开,而ACK 与FIN 位关闭的分组,即TCP 的初始连接,
与iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,
如果使用!运算符,可用来匹配非要求连接封包。
参数: -m multiport --source-port
范例: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
说明: 用来匹配不连续的多个源端口,一次最多可以匹配15 个端口,
可以使用! 运算符进行反向匹配。
参数: -m multiport --destination-port
范例: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
说明: 用来匹配不连续的多个目的地端口号,设定方式同上
参数: -m multiport --port
范例: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
说明: 这个参数比较特殊,用来匹配源端口和目的端口号相同的封包,设定方式同上。
注意:在本范例中,如果来源端口号为80目的地端口号为110,这种封包并不算符合条件。
参数: --icmp-type
范例: iptables -A INPUT -p icmp --icmp-type 8
说明: 用来匹配ICMP 的类型编号,可以使用代码或数字编号来进行匹配。
请打iptables -p icmp--help 来查看有哪些代码可用。
参数: -m limit --limit
范例: iptables -A INPUT -m limit --limit 3/hour
说明: 用来匹配某段时间内封包的平均流量,
上面的例子是用来匹配:每小时平均流量是否超过一次3 个封包。
除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后:
/second、/minute、/day
除了进行封包数量的匹配外,设定这个参数也会在条件达成时,暂停封包的匹配动作,
以避免因骇客使用洪水攻击法,导致服务被阻断。
参数: --limit-burst
范例: iptables -A INPUT -m limit --limit-burst 5
说明: 用来匹配瞬间大量封包的数量,
上面的例子是用来匹配一次同时涌入的封包是否超过5个(这是默认值),超过此上限的封包将被直接丢弃。
使用效果同上。
参数: -m mac --mac-source
范例: iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
说明: 用来匹配封包来源网络接口的硬件地址,
这个参数不能用在OUTPUT 和POSTROUTING 规则链上,
这是因为封包要送到网卡后,才能由网卡驱动程序透过ARP 通讯协议查出目的地的MAC 地址,
所以iptables 在进行封包匹配时,并不知道封包会送到哪个网络接口去。
参数: --mark
范例: iptables -t mangle -A INPUT -m mark --mark 1
说明: 用来匹配封包是否被表示某个号码,
当封包被匹配成功时,我们可以透过MARK 处理动作,将该封包标示一个号码,号码最大不可以超过4294967296。
参数: -m owner --uid-owner
范例: iptables -A OUTPUT -m owner --uid-owner 500
说明: 用来匹配来自本机的封包,是否为某特定使用者所产生的,
这样可以避免服务器使用root或其它身分将敏感数据传送出,可以降低系统被骇的损失。
可惜这个功能无法匹配出来自其它主机的封包。
参数: -m owner --gid-owner
范例: iptables -A OUTPUT -m owner --gid-owner 0
说明: 用来匹配来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。
参数: -m owner --pid-owner
范例: iptables -A OUTPUT -m owner --pid-owner 78
说明: 用来匹配来自本机的封包,是否为某特定进程所产生的,使用时机同上。
参数: -m owner --sid-owner
范例: iptables -A OUTPUT -m owner --sid-owner 100
说明: 用来匹配来自本机的封包,是否为某特定连接(Session ID)的响应封包,使用时机同上。
参数: -m state --state
范例: iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明: 用来匹配连接状态,
连接状态共有四种:
INVALID、ESTABLISHED、NEW 和RELATED。
INVALID 表示该封包的连接编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的连接。
NEW 表示该封包想要起始一个连接(重设连接或将连接重导向)。
RELATED 表示该封包是属于某个已经建立的连接,所建立的新连接。
例如:FTP-DATA 连接必定是源自某个FTP 连接。
4. [-j target/jump] 常用的处理动作
-j 参数用来指定要进行的处理动作,常用的处理动作包括:
ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,
分别说明如下:
动作: ACCEPT
说明: 将封包放行,
进行完此处理动作后,将不再匹配其它规则,直接跳往下一个规则链(natostrouting)。
动作: REJECT
说明: 拦阻该封包,并传送封包通知对方,
可以传送的封包有几个选择:
ICMP port-unreachable、
ICMP echo-reply 或是
tcp-reset(这个封包会要求对方关闭连接),
进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。
范例: iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
动作: DROP
说明: 丢弃封包不予处理,进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。
动作: REDIRECT
说明: 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则。
这个功能可以用来实现透明代理或用来保护web 服务器。
范例: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
动作: MASQUERADE
说明: 改写封包来源IP 为防火墙NIC IP,可以指定port 对应的范围,
进行完此处理动作后,直接跳往下一个规则链(manglepostrouting)。
这个功能与SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个IP,IP 会从网卡直接读取,
当使用拨号接连时,IP通常是由ISP 公司的DHCP 服务器指派的,这个时候MASQUERADE 特别有用。
范例: iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
动作: LOG
说明: 将封包相关讯息纪录在/var/log 中,详细位置请查阅/etc/syslog.conf 配置文件,
进行完此处理动作后,将会继续匹配其规则。
范例: iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
动作: SNAT
说明: 改写封包来源IP 为某特定IP 或IP 范围,可以指定port 对应的范围,
进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。
范例: iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source?194.236.50.155-194.236.50.160:1024-32000
动作: DNAT
说明: 改写封包目的地IP 为某特定IP 或IP 范围,可以指定port 对应的范围,
进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或filter:forward)。
范例: iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
动作: MIRROR
说明: 镜射封包,也就是将来源IP 与目的地IP 对调后,将封包送回,
进行完此处理动作后,将会中断过滤程序。
动作: QUEUE
说明: 中断过滤程序,将封包放入队列,交给其它程序处理。
通过自行开发的处理程序,可以进行其它应用,例如:计算连接费用等。
动作: RETURN
说明: 结束在目前规则链中的过滤程序,返回主规则链继续过滤,
如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。
动作: MARK
说明: 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,
进行完此处理动作后,将会继续匹配其它规则。
范例: iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给出任何回应信息。
REJECT:DROP和REJECT都会把它们的包丢弃。DROP是默默地丢弃,而REJECT如果必要时会返回一则ICMP错误消息。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。
REDIRECT:把包分流到一个代理,而不是直接让它们通过。您可能会用这个功能来迫使站点上的所有Web流量都通过一个Web高速缓存,比如Squid。
RETURN:终结用户定义的链,类似于子例程调用中的return语句。
MIRROR:目标在发送包之前交换IP源和目的地址。
QUEUE:通过一个内核模块把包交给本地用户程序。
Linux防火墙通常是由rc启动脚本中的一系列iptables命令来实现的。
各个iptables命令通常采取下列形式之一:
iptables -F chain-name
iptables -P chain-name target
iptables -A chain-name -i interface -j target
. 第一种形式(-F)把之前所有的规则都从链中清除掉。
. 第二种形式(-P)给链设置一条默认策略(也就是target)。我们建议您使用DROP作为链默认的目标(target)。
. 第三种形式(-A)把当前的说明追加到链上。
除非使用-t参数指定了表(table)名,否则命令被默认应用到filter表上。
-i参数将规则应用到有名字的接口上,-j则标识出目标(target)。
1、通用匹配
通用匹配也称常规匹配,这种匹配方式可以独立使用,不依赖其他条件或扩展模块,常见的通用匹配包括协议匹配,地址匹配,网络接口匹配。
1)协议pipe
编写iptables规则时使用“-p 协议名”的形式指定,用来检查数据包所使用的网络协议,如:tcp、udp、icmp等。
列如:编写iptables拒绝通过icmp的数据包。
[root@localhost /]#iptables -A INPUT -p icmp -j DROP
2)地址匹配
编写iptables规则时使用“-s源地址”或“-d目标地址”的形式指定,用来检查数据包的源地址或目标地址。
列如:编写iptables拒绝转发192.168.1.0/24到202.106.123.0/24的数据包。
[root@localhost /]#iptables -A FORWARD -s 192.168.1.0/24 -d 202.106.123.0/24 -j DROP
3)网络接口匹配
编写iptables规则时使用“-i 接口名”和“-o 接口名”的形式,用于检查数据包从防火墙的哪一个接口进入或发出,分别对应入站网卡(--in-interface),出站网卡(--out-interface)。
列如:拒绝从防火墙的eth1网卡接口ping防火墙主机。
[root@localhost /]#iptables -A INPUT -i eth1 -p icmp -j DROP
2、隐含匹配
这种匹配方式要求以指定的协议匹配作为前提条件,相当于子条件,因此无法独立使用,其对应的功能由iptables在需要时自动隐含载入内核。常见的隐含匹配包括端口匹配,TCP标记匹配,ICMP类型匹配。
1)端口匹配
编写iptable规则时使用“--sport 源端口”或“--dport”的形式,针对的协议为TCP或UDP,用来检查数据包的源端口或目标端口。单个端口或者以“:”分隔的端口范围都是可以接受的,但不支持多个不连续的端口号。
列如:编写iptables规则允许FTP数据包通过,则需要允许20,21和用于被动模式的24500-24600的端口范围。
[root@localhost /]#iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
[root@localhost /]#iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
2)TCP标记匹配
编写iptables规则时使用“--tcp-flags 检查范围 被设置的标记”的形式,针对的协议为TCP,用来检查数据包的标记位。其中“检查范围”指出需要检查数据包的那几个标记位,“被设置的标记”则明确匹配对应值为1的标记,多个标记之间以逗号进行分隔。
列如:若要拒绝外网卡接口(eth1)直接访问防火墙本机的TCP请求,但其他主机发给防火墙的TCP响应等数据包应允许,可执行如下操作。
[root@localhost /]#iptables -A INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
3)ICMP类型匹配
编写iptables规则时使用“--icmp-type ICMP类型”的形式,针对的协议为ICMP,用来检查ICMP数据包的类型。ICMP类型使用字符串或数字代码表示,如“Echo-quest”(代码为8),“Echo-Reply”(代码为0),“Destination-Unreachable”(代码为3),分别对应ICMP协议的请求,回显,目标不可达。
列如:若要禁止从其他主机ping防火墙本机,但允许防火墙本机ping其他主机,可执行以下操作。
[root@localhost /]#iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost /]#iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@localhost /]#iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
3、显示匹配
这种匹配方式要求有额外的内核模块提供支持,必须手动以“-m 模块名称”的形式调用相应的模块。然后方可设置匹配条件。常见的显示匹配包括多端口匹配,IP范围匹配,MAC地址匹配,状态匹配。
1)多端口匹配
编写iptables规则时使用“-m multiport --dport 端口列表”或“-m multiport --sport 端口列表”的形式,用来检查数据包的源端口,目标端口,多端口之间以逗号进行分隔。
列如:若允许本机开放25,80,110,143等端口,以便提供电子邮件服务,可执行如下操作。
[root@localhost /]#iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
2)IP地址范围匹配
编写iptables规则时使用“-m iprange --src-range IP范围”,“-m -iprange --dst-range IP地址范围”的形式,用来检查数据包的源地址,目标地址,其中IP范围采用“起始地址-结束地址”的形式表示。
列如:若要允许转发源地址IP位于192.168.4.21与192.168.4.28之间的TCP数据包,可执行如下操作。
[root@localhost /]#iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
3)MAC地址匹配
编写iptables规则时使用“-m mac --mac-source MAC地址”的形式,用来检查数据包的源MAC地址。由于MAC地址本身的局限性,此类匹配条件一般只适用于内部网络。
列如:若要根据MAC地址封锁主机,禁止其访问本机的任何应用,可以执行如下操作。
[root@localhost /]#iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
4)状态匹配
编写iptables规则时使用“-m state --state 连接状态”的形式,基于iptables的状态跟踪机制用来检查数据包的连接状态。常见的连接状态包括NEW(如任何连接无关的),ESTABLISHED(相应请求或者一建立连接的),RELATED(与已有连接有相关性的,如FTP数据连接)。
列如:编写iptables规则,只开放本机的80端口服务,对于发送给本机的TCP应答数据包给予放行,其他入站数据包均拒绝,可执行如下操作。
[root@localhost /]#iptables -A INPUT -p tcp -m multiport --dport 80 -j ACCEPT
[root@localhost /]#iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
通过上面知道了 Linux 防火墙的表、链机构,并学会了编写简单的防火墙规则。Linux防火墙在很多时候承担着连接企业内、外网的重任,除了提供数据包过滤功能以外,有时还需要提供一些基本的网关应用。在配置 SNAT 和 DNAT 之前,需要开启 Linux 系统中的地址转发功能,否则数据无法通过防火墙转发出去。
修改/etc/sysctl.conf配置文件件,将ip_forward的值设置为1即可。
[root@localhost /]#vim /etc/sysctl.conf
......//省略部分内容
net.ipv4.ip_forwaed=1 //将此行中的0改为1
[root@localhost /]#sysctl -p //重新读取修改后的配置
也可以开启临时的路由转发,可以执行以下操作。
[root@localhost /]#echo 1> /proc/sys/net/ipv4/ip_forward
或者
[root@localhost /]#sysctl -w net.ipv4.ip_forward=1
SNAT:源地址转换,是Linux防火墙的一种地址转换操作,也是 iptables 命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的源IP地址。
SNAT 策略只能用在nat表的POSTROUTING链中,使用iptables命令编写SNAT策略时,需要结合“--to-source IP地址”选项来指定修改后的源IP地址。
列如:Linux网关服务器通过eth0和eth1分别连接Internet和局域网,其中eth0的IP地址为218.29.30.31,eth1的IP地址为192.168.1.1。现在要求在Linux网关服务器上配置规则,使用局域网内的所有用户可以通过共享的方式访问互联网。可执行以下操作。
1)开启路由转发,上面已经讲过,这里不在详述了。
2)在iptables的POSTROUTING中编写SNAT规则。
[root@localhost /]#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
3)在某些情况下,网关的外网IP地址可能不是固定的,列如使用ADSL宽带接入时,针对这这种需求,iptables提供了一个名为MASQUERASE(伪装)的数据包控制类型,MASQUERADE相当于SNAT的一个特列,同样同来修改数据包的源IP地址只过过它能过自动获取外网接口的IP地址。
参照上一个SNAT案例,若要使用MASQUERADE伪装策略,只需要去掉SNAT策略中的“--to-source IP地址”。然而改为“-j MASQUERADE”指定数据包的控制类型。对于ADSL宽带连接来说,连接名称通常为ppp0,ppp1等。操作如下
[root@localhost /]#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
4)测试SNAT共享接入的结果
同过上面的配置,这时内部局域网访问互联网所使用的IP地址是网关服务器的外网接口地址了。我们可以在往外客户端执行“tcpdump -i eth0”监听访问本机的数据流,然后在内网ping外网客户端,然后查看外网客户端监听的状态,会发现,访问外网客户机的IP地址是网关服务器的外网接口地址,而不是内部局域网的地址。
DNAT:目标地址转换,是Linux防火墙的另一种地址转换操作,同样也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标IP地址,目标端口。
DNAT策略与SNAT策略非常相似,只不过应用方向反过来了。
SNAT用来修改源地址IP,而DNAT用来修改目标IP地址,目标端口;
SNAT只能用在nat表的POSTROUTING链,而DNAT只能用在nat表的PREROUTING链和OUTPUT链中。
列如:借助上述网络环境,公司内部局域网内搭建了一台web服务器,IP地址为192.168.1.7,现在需要将其发布到互联网上,希望通过互联网访问web服务器。那么我们可以执行如下操作。
1)在iptables的PREROUTING中编写DNAT规则。
[root@localhost /]#iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.7:80
2)再列如:公司的web服务器192.168.1.7需要通过互联网远程管理,由于考虑到安全问题,管理员不希望使用默认端口进行访问,这时我们可以使用DNAT修改服务的默认端口。操作如下:
[root@localhost /]#iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to-destination 192.168.1.7:22
3)在外网客户端浏览器中访问网关服务器的外网接口,可以发现访问的居然是内网192.168.1.7的web服务器的网页。而在使用sshd连接2346端口时,居然可以远程连接到192.168.1.7服务器上。
前面学习了如何编写一些简单的防火墙规则了,但是这些规则只是临时生效的,当防火墙关闭或者服务器关机,重启之后所有的规则将会清空。因此我需要将编写好的防火墙规则保存下来,以便在防火墙关闭或重新启动系统后,防火墙规则还可以使用,而不需要再次编写。
iptables规则的导出、导人
防火墙规则的批量备份,还原需要用到两个命令iptables-save、iptables-restore,分别用来保存和恢复。
1、备份保存iptables规则
iptables-save命令用来批量导出iptables防火墙规则,直接执行iptables-save时,将显示出当前启用的所有规则,按照raw、mangle、nat、filter表的顺序依次列出;若只希望显示出某一个表,应添加“-t表名”作为命令选项,然后结合重定向输入“>”将输出内容重定向到某个文件中。
列如:备份所有表的规则,操作如下:
[root@localhost /]#iptables-save > /opt/iprules_all.txt
或者
[root@localhost /]#service iptables save
后者默认将所有规则保存到“/etc/sysconfig/iptables”文件中。
2、恢复iptables规则
iptables-retore命令用来批量导入Linux防火墙规则,如果已经有使用iptable-save命令导出的备份文件,则恢复规则的过程也就是一瞬间的事。与iptables-save命令相对的,iptables-restore命令应结合重定向输入来指定备份文件的位置。
列如:将上所备份的规则恢复到iptables中,操作如下:
[root@localhost /]#iptables-restore < /opt/iprules_all.txt
或者
[root@localhost /]#service iptables start
后者默认将“/etc/sysconfig/iptables”文件中的内容加载到iptables中,也就是说,如果备份使用的是“service iptables save”那么恢复的时候就应该使用“service iptables start”。
使用iptables服务
开启或关闭iptables服务使用以下命令
[root@localhost /]#service iptables start //开启iptables服务
[root@localhost /]#service iptables stop //关闭iptables服务
前者开启iptables服务,默认加载“/etc/sysconfig/iptables”中的规则,后者关闭iptables服务,默认将会清空所有的iptables规则。
编写防火墙脚本
在生产环境中,我很少会一条一条的去编写iptables规则,最普遍的做法就是,将其写到shell脚本,进行一次性处理。常见的防火墙脚本中,通常包括变量定义、模块加载、/proc调整、规则设置等多个部分,某些简单的防火墙脚本可能只包括规则设置部分。下面我们通过一个“网络型”防火墙脚本实例来了解如何编写防火墙脚本。
[root@loaclhost /]#vim /opt/myipfw.sh
#!/bin/bash
# 1.定义基本变量
INET_IF="eth0" //外网接口
INET_IP="218.29.30.31" //外网接口地址
LAN_IF="eth1" //内网接口
LAN_IP="192.168.1.1" //内网接口地址
LAN_NET="192.168.1.0/24" //内网网段
LAN_WWW_IP="192.168.1.7" //网站服务器的内部地址
IPT="/sbin/iptables" //iptables命令的路径
MOD="/sbin/modprobe" //modprode命令的路径
CTL="/sbin/sysctl" //sysctl命令的路径
# 2.加载内核模块
$MOD ip_tables //iptables基本模块
$MOD ip_conntrack //连接跟踪模块
$MOD ipt_REJECT //拒绝操作模块
$MOD ipt_LOG //日志记录模块
$MOD ipt_iprange //支持IP范围匹配
$MOD xt_tcpudp //支持tcp、udp协议
$MOD xt_state //支持状态匹配
$MOD xt_multiport //支持多端口匹配
$MOD xt_mac //支持MAC地址匹配
$MOD ip_nat_ftp //支持TFP地址转换
$MOD ip_conntrack_ftp //支持TFP连接跟踪
# 3.调整/porc参数
$CTL -w net.ipv4.ip_forward=1 //打开路由转发功能
$CTL -w net.ipv4.ip_default_ttl=128 //修改ICMP响应超时
$CTL -w net.ipv4.icmp_echo_ignore_all=1 //拒绝响应ICMP请求
$CTL -w net.ipv4.icmp_echo_ignore_broadcasts //拒绝响应ICMP广播
$CTL -w net.ipv4.tcp_syncookies=1 //启用SYN Cookie机制
$CTL -w net.ipv4.tcp_syn_retries=3 //最大SYN请求重试次数
$CTL -w net.ipv4.tcp_synack_retries=3 //最大ACK确认重试次数
$CTL -w net.ipv4.tcp_fin_timeout=60 //TCP连接等待超时
$CTL -w net.ipv4.tcp_max_syn_backlog=3200 //SYN请求的队列长度
# 4.设置具体的防火墙规则
# 4.1删除自定义链、清空已有规则
$IPT -t filter -X //清空各表中定义的链
$IPT -t nat -X
$IPT -t mangel -X
$IPT -t raw -X
$IPT -t filter -F //清空各表中已有的规则
$IPT -t nat -F
$IPT -t mangel -F
$IPT -t raw -F
# 4.2定义默认规则
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCETP
# 4.3设置nat表中的各种策略
$IPT -t nat -A POSTROUTING -s $LAN_NAT -o $INET_IF -j SNAT --to-source $INET_IP
$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP
# 4.4设置filter表中的各种规则
$IPT -A INPUT -m state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp -m multiport --dport 20,21,25,80,110,143,443 -j ACCEPT
$IPT -A FORWARD -d $LAN_NET -i $INET_IF -m state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -d $LAN_WWW_IP -p tcp --dport 80 -j ACCEPT
$IPT -A FORWARD -d $LAN_WWW_IP -p tcp --sport 80 -j ACCEPT
上述防火墙脚本实例中,仅列出其中最基础的一些规则。更多具体的规则设置取决于实际的应用需求,还有待大家在生产环境中慢慢去体会,逐渐融会贯通。
3. iptables服务操作
检查:# service --status-all
启动:# service iptables start
停止:# service iptables stop
重启:# service iptables restart
4. 彻底清空规则
# iptables -F
# iptables-save > /etc/sysconfig/iptables
1 查看防火墙状态
[root@lvxinghao ~]# systemctl status firewalld
2 查看开机是否启动防火墙服务
[root@lvxinghao ~]# systemctl is-enabled firewalld
3 关闭防火墙
[root@lvxinghao ~]# systemctl stop firewalld
[root@lvxinghao ~]# systemctl status firewalld
4 禁用防火墙(系统启动时不启动防火墙服务)
[root@lvxinghao ~]# systemctl disable firewalld
[root@lvxinghao ~]# systemctl is-enabled firewalld
http://www.cnblogs.com/ld1977/articles/6144297.html
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
3.配置firewalld-cmd
我们假定接口ppp0通往Internet,接口eth0通往内部网络。
ppp0的IP地址是128.138.101.4,eth0的IP地址是10.1.1.1,两个接口的子网掩码都是255.255.255.0。
这个例子使用无状态包过滤机制来保护IP地址为10.1.1.2的Web服务器,这是保护Internet服务器的标准方法。
在这个例子的后面部分,我们将展示如何使用有状态的过滤机制来保护桌面用户。
在您使用iptables之前,必须启用IP forwarding(IP转发)功能,并且确保内核里已经加载了各个iptables模块。
要了解启用IP forwarding功能的更多知识,参见28.4节或者12.11.8节。
带有iptables的所有发行版本也都有能够完成启用和加载的启动脚本。
1. 第一组规则是对filter表进行初始化。
首先,冲洗掉表中所有的链,
然后将INPUT和FORWARD链的默认目标设为DROP。
和其他任何网络防火墙一样,最安全的策略就是丢弃您没有明确允许的任何包。
# iptables -F
# iptables -P INPUT DROP // 如果是用SSH连接进行设置,不要用这条命令,会导致SSH断开;
# iptables -P FORWARD DROP
2. 规则是按照它们出现在链中的顺序来进行匹配的,所以我们将用得最多的规则放在最前面 。
FORWARD链中的前3条规则让去往10.1.1.2上网络服务的连接通过防火墙。
确切地说,我们允许SSH(端口22)、HTTP(端口80)和HTTPS(端口443)能够连到我们的Web服务器。
第一条规则允许来自可信网络的所有连接通过防火墙。
# iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 22 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 80 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 443 -j ACCEPT
3. 我们允许流到防火墙主机(10.1.1.1)的唯一TCP流量是SSH,它用于管理防火墙。
下面列出的第二条规则允许环回(loopback)流量,它留在防火墙主机的本地。
我们的系统管理员在他们不能ping到默认路由时会感到紧张,
所以这里的第三条规则允许从内部IP地址来的ICMP ECHO_REQUEST包。
# iptables -A INPUT -i eth0 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -i lo -d 127.0.0.1 -p ANY -j ACCEPT
# iptables -A INPUT -i eth0 -d 10.1.1.1 -p icmp --icmp-type 8 -j ACCEPT
4. 为了能让任何TCP/IP主机在Internet正常工作,必须允许某些类型的ICMP包通过防火墙。
下面的8条规则就是让ICMP包既能送到防火墙主机,也能送到在它之后的网络的最小集合。
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 5 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 0 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 3 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 5 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 11 -j ACCEPT
5. 接下来向NAT表的PREROUTING链加入规则。虽然NAT表的目的并不是做包过滤,
但是它的PREROUTING链对于反IP欺骗的过滤来说特别有用。
如果我们在PREROUTING链中加入DROP项,它们就不需要出现在INPUT和FORWARD链里了,
因为PREROUTING链会应用到所有进入防火墙主机的包上。
将控制项放到一个地方比重复放置它们的做法条理性要好得多。
# iptables -t nat -A PREROUTING -i ppp0 -s 10.0.0.0/8 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 172.16.0.0/12 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 192.168.0.0/16 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 127.0.0.0/8 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 224.0.0.0/8 -j DROP
6. 最后,我们用一条禁止所有没有得到明确许可的包的规则来结束INPUT和FORWARD链。
虽然我们在前面已经用iptables -P命令实施过这个做法,但是LOG目标(target)能让我们看到谁正在从Internet上敲我们的大门。
# iptables -A INPUT -i ppp0 -j LOG
# iptables -A FORWARD -i ppp0 -j LOG
7. 我们还可以设置IP NAT来伪装在内部网络里使用的私用地址空间。
参见12.12节了解更多有关NAT的知识。
8. Netfilter带给Linux防火墙最强大的功能之一就是有状态包过滤机制。
针对连到Internet的客户机的防火墙不是允许特定的传入服务,而是允许根据客户机的请求而传入的响应。
下面这条简单的有状态FORWARD链允许离开我们网络的所有流量通过,但只允许和我们的主机发起的连接有关的入流量通过。
# iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
要跟踪复杂的网络会话,比如FTP和IRC,必须加载某些内核模块来启动iptables。
如果没有加载这些模块,iptables就会简单地禁止那些连接。虽然有状态包过滤器能够提高站点的安全性,
但是它们也增加了网络的复杂性。所以在防火墙上实现它之前,要确信您的确需要有状态功能。
五、调试iptables规则集
调试iptables规则集最好的办法或许就是用命令:
iptables -L -v
这些选项会告诉您链里面的每条规则匹配了多少个包。
我们经常在想了解有关匹配包的更多信息时,增加带有LOG目标(target)的临时iptables规则。
您可以经常通过使用像tcpdump这样的包探测器解决更棘手的问题。
六、应用实例
1. 禁止端口的实例
1). 禁止ssh 端口
只允许在192.168.62.1上使用ssh 远程登录,从其它计算机上禁止使用ssh
# iptables -A INPUT -s 192.168.62.1 -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP
2). 禁止代理端口
# iptables -A INPUT -p tcp --dport 3128 -j REJECT
3). 禁止icmp 端口
除192.168.62.1外,禁止其它人ping 我的主机
# iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type echo-request -j ACCEPT
# iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request –j DROP
或
# iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP
注:可以用iptables --protocol icmp --help 查看ICMP 类型
4). 禁止QQ 端口
# iptables -D FORWARD -p udp --dport 8000 -j REJECT
2. 强制访问指定的站点
要使192.168.52.0/24网络内的计算机(这此计算机的网关应设为192.168.52.10)强制访问指定的站点,
在做为防火墙的计算机(192.168.52.10)上应添加以下规则:
1). 打开ip 包转发功能
# echo 1 > /proc/sys/net/ipv4/ip_forward
2). 在NAT/防火墙计算机上的NAT 表中添加目的地址转换规则:
# iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 202.96.134.130:80
# iptables -t nat -I PREROUTING -i eth0 -p udp --dport 80 -j DNAT --to-destination 202.96.134.130:80
3). 在NAT/防火墙计算机上的NAT 表中添加源地址转换规则:
# iptables -t nat -I POSTROUTING -o eth1 -p tcp --dport 80 -s 192.168.52.0/24 -j SNAT --to-source 202.96.134.10:20000-30000
# iptables -t nat -I POSTROUTING -o eth1 -p udp --dport 80 -s 192.168.52.0/24 -j SNAT --to-source 202.96.134.10:20000-30000
4). 测试:在内部网的任一台计算机上打开浏览器,输入任一非本网络的IP,都将指向IP 为202.96.134.130的网站.
3. 发布内部网络服务器
图4
要使因特网上的计算机访问到内部网的FTP 服务器、WEB 服务器,在做为防火墙的计算机上应
添加以下规则:
1).
# echo 1 > /proc/sys/net/ipv4/ip_forward
2). 发布内部网web 服务器
# iptables -t nat -I PREROUTING -p tcp -i eth1 -s 202.96.134.0/24 --dport 80 -j DNAT --to-destination 192.168.52.15:80
# iptables -t nat -I POSTROUTING -p tcp -i eth0 -s 192.168.52.15 --sport 80 -j SNAT --to-source 202.96.134.10:20000-30000
3). 发布内部网ftp 服务器
# iptables -t nat -I PREROUTING -p tcp -i eth1 -s 202.96.134.0/24 --dport 21 -j DNAT --to-destination 192.168.52.14:21
# iptables -t nat -I POSTROUTING -p tcp -i eth0 -s 192.168.52.14 --sport 21 -j SNAT --to-source 202.96.134.10:40000-50000
4). 注意:内部网的计算机网关要设置为防火墙的ip(192.168.52.1)
5). 测试:
用一台IP 地址为202.96.134.0段的计算机虚拟因特网访问,
当在其浏览器中访问http://202.96.134.10时, 实际应看到的是192.168.52.15的的web 服务;
当访问ftp://202.96.134.10时,实际应看到的是192.168.52.14上的的ftp 服务
4. 智能DNS
图5
1).
# echo 1 > /proc/sys/net/ipv4/ip_forward
2). 在NAT 服务器上添加以下规则:
在PREROUTING 链中添加目的地址转换规则:
# iptables -t nat -I PREROUTING -i eth0 -p tcp --dpor 53 -j DNAT --to-destination 202.96.134.130
# iptables -t nat -I PREROUTING -i eth0 -p udp --dpor 53 -j DNAT --to-destination 202.96.134.130
在POSTROUTING 链中添加源地址转换规则:
# iptables -t nat -I POSTROUTING -o eth1 -s 192.168.52.0/24 -p tcp --dpor 53 -j SNAT --to-source 202.96.134.10:40000-50000
# iptables -t nat -I POSTROUTING -o eth1 -s 192.168.52.0/24 -p udp --dpor 53 -j SNAT --to-source 202.96.134.10:40000-50000
3). 测试
在内部网任一台计算机上,将DNS 设置为任意的外网IP,就可以使用DNS
测试工具如nslookup来解析DNS 服务器202.96.134.130上的名称.
5. 端口映射
见上节透明代理设置
# iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.62.0/24 --dport 80 -j REDIRECT --to-ports 3128
6. 典型NAT 上网
一般做为NAT 的计算机同时也是局域网的网关,
假定该机有两块网卡eth0、eth1,
eth0连接外网, IP 为202.96.134.134;
eth1连接局域网,IP 为192.168.62.10
1). 先在内核里打开ip 转发功能
# echo 1 > /proc/sys/net/ipv4/ip_forward
2). 使局域网用户能访问internet 所要做的nat
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to?202.96.134.134
如果上网的IP 是动态IP,则使用以下规则:
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.62.0/24 -j MASQUERADE
如果是通过ADSL 上网,且公网IP 是动态IP,则使用以下规则:
# iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.62.0/24 -j MASQUERADE
3). 使internet 用户可以访问局域网内web 主机所要做的nat
# iptables -t nat -A PREROUTING -p tcp -d 202.96.134.134 --dport 80 -j DNAT --to-destination 192.168.62.10
注:局域网内的客户端需将默认网关、DNS 设为防火墙的IP
7. 在我们的网络机房实现NAT 共享上网
工作环境:上层代理192.168.60.6(4480),只授予教师机(192.168.62.111)使用该代理的权限
目标:不使用squid 代理上网,而是使用NAT 的方式上网
方法:
1). 确保停止教师机(192.168.62.111)的squid 或其它代理服务
2). 客户端网关、DNS 均指向192.168.62.111,浏览器代理设置为192.168.60.6(4480)。
测试在当前情况下能否上网
3). 在教师机(192.168.62.111)上添加如下iptables 规则:
# iptables -t nat -A POSTROUTING -p tcp -d 192.168.60.6/32 --dport 4480 -j SNAT --to-source 192.168.62.111:10000-30000
解释:对于目的地为192.168.60.6、目的端口为4480的TCP 包,
在经过防火墙路由后,将其源地址转换为192.168.62.111,端口转换为10000-30000间的某个端口。
4). 客户端测试能否上网
8. 对流媒体服务器的服务做IP 限制
1). 清空规则并放开SSH
# iptables -F
# iptables -A INPUT -s 10.1.1.11 -p tcp --dport 22 -j ACCEPT
2). 对指定IP放开,可以推送流到这台服务器, 其余的IP都禁止
A. 只对单个IP放开
# iptables -A INPUT -s 10.2.1.54 -j ACCEPT
# iptables -A INPUT -s! 10.2.1.54 -j REJECT
或
# iptables -A INPUT -s 10.2.1.54 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT
B. 对多个IP放开,即将要放开的IP插入到最后一条拒绝的规则之前
# iptables -A INPUT -s 10.2.1.54 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT
# iptables -I INPUT 2 -s 10.2.1.13 -j ACCEPT
3). 对指定IP段 放开,可以推送流到这台服务器,其余的IP都禁止
A. 对单个IP段放开
# iptables -I INPUT 2 -s 10.2.1.0/24 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT
B. 对多个IP段放开
# iptables -I INPUT 2 -s 10.2.1.0/24 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT
# iptables -I INPUT 2 -s 10.2.2.0/24 -j ACCEPT
其中:
10.2.1.0/24 表示: A类地址主机为8位,表示10.2.1固定,后面是可变
前面是IP地址10.2.1.0,是表示局域网地址。
后而的24是指掩码,因为IP地址和掩码用二进制表示的话都是32位的。
所以掩码的24表示那掩码前24位是1,后8位是0,转换成10进制就是表示掩码是255.255.255.0
即, 255.255.255.0=11111111.11111111.11111111.0=24个1
192.168.0.0/16 代表B类地址 主机为16,表示192.168固定,后面是可用.
4). 对指定IP拒绝,
A. 对单个IP拒绝
# iptables -A INPUT -s 10.2.1.11 -p tcp --dport 1935 -j REJECT