开发语言:
服务器端:在内核中实现,无守护程序
客户端:一般是cli界面下的iptables命令
相关包:iptables-1.4.7-11.el6.x86_64
Netfilter采用模块化设计,具有良好的可扩充性。其重要工具模块IPTables连接到Netfilter的架构中,并允许使用者对数据报进行过滤、地址转换、处理等操作,Netfilter提供了一个框架,将对网络代码的直接干涉降到最低,并允许用规定的接口将其他包处理代码以模块的形式添加到内核中,具有极强的灵活性。
根据工作的层次的不同来划分,常见的防火墙工作在OSI第三层,即网络层防火墙,工作在OSI第七层的称为应用层防火墙,或者代理服务器(代理网关)。网络层防火墙又称包过滤防火墙,在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,来确定是否允许该数据包通过。特点:对用户来说透明,处理速度快且易于维护。但是一旦黑客突破防火墙,就可以轻易地伪造数据包的源地址,目的地址和IP的端口号,即“IP地址伪造”。代理服务型防火墙(PRoxy Service)将所有跨越防火墙的网络通信链路分为两段。当代理服务器接收到用户对某个站点的访问请求后会检查该请求是否符合控制规则。如果规则允许,则代理服务器会替用户去那个站点取回所需要的信息,转发给用户。内外网用户的访问都是通过代理服务器上的“链接”来实现的,从而起到了隔离防火墙内外计算机系统的作用。特点:在应用层对数据进行检查,比较安全。但是会增加防火墙的负载。
包过滤防火墙将对每一个接收到的包做出允许或拒绝的决定。具体地讲,它针对每一个数据包的包头,按照包过滤规则进行判定,与规则相匹配的包依据路由信息继续转发,否则就丢弃。包过滤是在IP层实现的,包过滤根据数据包的源IP地址、目的IP地址、协议类型(TCP包、UDP包、ICMP包)、源端口、目的端口等包头信息及数据包传输方向等信息来判断是否允许数据包通过。包过滤也包括与服务相关的过滤,这是指基于特定的服务进行包过滤,由于绝大多数服务的监听都驻留在特定TCP/UDP端口,因此,为阻断所有进入特定服务的链接,防火墙只需将所有包含特定TCP/UDP目的端口的包丢弃即可。现实生产环境中所使用的防火墙一般都是二者结合体。即先检查网络数据,通过之后再送到应用层去检查。
netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件 netfilter 和 iptables 组成。netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。
四种处理机制(表):过滤(filter)主要用于过滤数据包,该表根据管理员预定义的一组规则过滤符合条件的数据包。filter表是iptables默认的表。INPUT:主要与想要进入我们 Linux 本机的数据包有关;OUTPUT:主要与我们 Linux 本机所要送出的数据包有关;FORWARD:与 Linux 本机比较没有关系,他可以传递数据包到后台的计算机中,与下列 nat table 相关性较高。地址转换(NAT)主要用于网络地址转换,该表可实现一对一。一对多,多对多等工作,iptables就是使用该表实现共享上网功能。PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)OUTPUT:与发送出去的数据包包有关包重构(mangle)对指定的数据包进行修改,例如更改TTL和TOS等,实际中很少使用。RAW 很少使用
一条链可以包含一条或者数条规则。nat:prerouting,postrouting,outputmangle:Input ,Output,Forward,prerouting,postrouting。RAW:prerouting,output
4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。filter:一般的过滤功能nat:用于nat功能(端口映射,地址映射等)mangle:用于对特定数据包的修改raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。PREROUTING:数据包进入路由表之前INPUT:通过路由表后目的地为本机FORWARDING:通过路由表后,目的地不为本机OUTPUT:由本机产生,向外转发POSTROUTIONG:发送到网卡接口之前。如下图:
-j target drop,accept,reject
-Z:zero 清空计数器,iptables中每条规则默认有两个计数器,用于记录本条规则所匹配到的数据包的个数和本条规则所匹配到的数据包的总大小支持-vv -vvv格式,v越多,信息越详细
有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED。
例如:comment (备注匹配),string(字符串匹配,可以用做内容过滤),iprang(ip范围匹配),time(时间匹配),ipp2p(点对点匹配),connlimit(同时连接个数匹配),Nth(第n个包匹配),geoip(根据国家地区匹配). quota(配额匹配)-m state --state established,invalid,new,related-m string-m connlimit --connlimit-above,-m iprange --src-range,-m ipp2p-m qutoa
TARGET EXTENSIONSLOG--log-level level记录级别(数字或参看 syslog.conf⑸)。--log-prefix prefix在纪录信息前加上特定的前缀:最多14个字母长,用来和记录中其他信息区别。MARK--set-mark mark用来设置包的netfilter标记值。只适用于mangle表。REJECT作为对匹配的包的响应,返回一个错误的包:其他情况下和DROP相同。TOS用来设置IP包的首部八位tos。只能用于mangle表。SNAT--to-source [-][:port-port]这个目标只适用于nat表的POSTROUTING链。它规定修改包的源地址(此连接以后所有的包都会被影响),停止对规则的检查,
作为主机使用,保护本机
作为网关使用,保护网络
mangle表应用
这次讲解的是iptables之mangle表应用实现策略路由。前面的文章已经讲解了:mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。mangle 表对应的内核模块为 iptable_mangle。修改IP包头的TTL值伪装系统版本;修改IP包头的DSCP值或对特定的数据包设置QOS;不同业务的传送优先级、带宽使用率都可以设置。下面就来案例说明一下实用且常用的用途吧:
案例1、iptables网关服务器三块网卡:eth0(网通ip:10.0.0.1)、eth1(电信ip:20.0.0.1);eth2:网关192.168.10.1。要求:公司内网要求192.168.10.1---100以内的ip使用 10.0.0.1 网关上网(网通),其他IP使用 20.0.0.1 (电信)上网;iptables网关服务器配置如下: ip route add default gw 20.0.0.1ip route add table 10 via 10.0.0.1 dev eth0#eth0 是10.0.0.1所在的网卡,10 是路由表的编号ip rule add fwmark 10 table 10#fwmark 10 是标记,table 10 是路由表10。 标记了 10 的数据使用table10 路由表iptables -A PREROUTING -t mangle -i eth2 -s 192.168.10.1 - 192.168.10.100 -j MARK --set-mark 10#使用iptables给相应的数据打上标记 mangle应用顺序要高于nat、filter哈。
案例2、iptables网关服务器三块网卡:eth0(网通ip:10.0.0.1)、eth1(电信ip:20.0.0.1);eth2:网关192.168.10.1。要求:公司内网要求员工访问外面的网站服务;使用 10.0.0.1 网关上网(网通),其他IP使用 20.0.0.1 (电信)上网;iptables -t mangle -A PREROUTING -i eth2 -p tcp --dport 80 -j MARK --set-mark 20ip route add default gw 20.0.0.1ip route add table 20 via 10.0.0.1 dev eth0ip rule add fwmark 20 table 20
SNAT
有两台机器,其中一台可以访问外网(hostA),有两个网卡,地址分别为202.102.32.156(eth0),192.168.222.1(eth1)。其中202.102.32.156可以上外网。另外一台机器地址为192.168.222.2(hostB),是个内网地址,但是可以与192.168.222.1连通,把其网关设置成了192.168.222.1。这样设置后,并不能访问外网,必须在第一台机器上设置转发规则才行。iptables -P FORWARD DROPiptables -A FORWARD -s 192.168.222.0/24 -j ACCEPTiptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -t nat -A POSTROUTING -o eth0 -s 192.168.222.0/24 -j SNAT --to 202.102.32.156
这个流程需要说明的是,如果这是一个新的连接跟踪,那么hook操作会操作NAT表,寻找对应的规则进行处理,如果这个连接不是新的连接,即连接跟踪已经记录并且NAT已经更改过连接的源地址,那么hook操作会直接调用nf_nat_packet来修改报文的目的地址,这个不同于DNAT,它都是在SNAT中完成。也就是说netfilter中所有的NAT操作都可以通过一次NAT设置完成,也就是说NAT会自动帮我们判断另一个方向的报文。进一步分析nf_nat_rule_find的工作流程如下:我们假设应用层的iptables有如下的NAT设置:iptables -t nat -A POSTROUTING -o eth0 -s192.168.0.0/24 -j SNAT -to 11.11.11.11这条命令的意义在于将私用ip段:192.168.0.0/24,封包的源地址都改为公用ip:11.11.11.11,这个IP为NAT主机的ip。现在我们假设有一台私用ip为:192.168.18.135的机器用临时端口45678来访问218.247.215.238的80端口。则连接跟踪建立如下的连接ORIGINAL: 192.168.18.135.45678->218.247.215.238.80REPLY: 218.247.215.238.80->192.168.18.135.45678设定了SNAT后,我在POSTROUTING进入NAT的hook操作,并用SNAT的target做相应的处理,进入6.1流程的nf_nat_fn后,我们发现这个连接是一个新的连接,则遍历NAT表,发现设置了如上描述的规则,并且此私用IP符合我们的设定的私用ip范围,故对此报文做SNAT处理,在流程图6.2的nf_nat_setup_info中,我们调用get_unique_tuple获得一个唯一的tuple(符合上面iptables所设定的),我们通过find_best_ips_proto在指定的ip范围内寻找合适的ip,本例中只使用了唯一的公用IP:11.11.11.11,则合适的IP就为这个。在协议相关的成员函数unique_tuple中我们找到一个端口,同时判断新的tuple是否在连接跟中存在,如果存在,在换另一个端口,这样一个新的tuple被建立起来了他为:REPLY: 218.247.215.238.80-11.11.11.11.56789(这个端口为NAT主机上的端口)同时我们更改连接跟踪的REPLY tuple为如上的tuple,这样连接跟踪建立的新连接如下:ORIGINAL: 192.168.18.135.45678->218.247.215.238.80REPLY: 218.247.215.238.80-11.11.11.11.56789这个封包发送到主机218.247.215.238后,218.247.215.238后发送一个确认的数据包,连接为:218.247.215.238.80-11.11.11.11.56789NAT主机11.11.11.11收到这个封包后,连接跟踪发现这个连接已经被记录,不做新的记录,同时设定ctinfo为:IP_CT_RELATED+IP_CT_IS_REPLY,NAT发现这个数据包的信息为这个时,直接调用nf_nat_packet,而不是去查NAT表所对应的规则,nf_nat_packet中会有连接的相反方向,即本例中为REPLY封包,相反为ORINGAL,修改相应的报文。即将数据包中的11.11.11.11.56789再次替换成192.168.18.135.45678,NAT主机将这个数据包转发给192.168.18.135,这就完成了一次SNAT操作。
用iptables实现单网卡做网关上网?
http://www.360doc.com/content/10/0720/22/25127_40415401.shtml 很好的样例,先画拓扑图,再有明确的需求描述
http://lyp0909.blog.51cto.com/508999/509408
http://blog.chinaunix.net/uid-22590270-id-3245147.htmlhttp://blog.chinaunix.net/uid-20775448-id-3504538.html
[root@localhost kernel]# pwd/lib/modules/2.6.32-431.el6.x86_64/kernel[root@localhost ip_tables]# pwd/sys/module/ip_tables[root@Firewall ~]# lsmod|grep "^ip"iptable_mangle 6784 1ipt_REDIRECT 5760 3ipt_MASQUERADE 6656 5iptable_nat 8964 1ipt_REJECT 6912 0ipv6 216820 28iptable_filter 6656 1ip_tables 14224 3 iptable_mangle,iptable_nat,iptable_filter[root@Firewall ~]# lsmod|grep "^iptable"iptable_mangle 6784 1iptable_nat 8964 1iptable_filter 6656 1连接跟踪conntrack有些特殊,它是NAT模块和状态防火墙的功能基础conntrack模块连接跟踪模块是NAT的基础,但作为一个单独的模块实现。它用于对包过滤功能的一个扩展,管理单个连接(特别是TCP连接),并负责为现有的连接分配输入、输出和转发IP数据报,从而基于连接跟踪来实现一个“基于状态”的防火墙。当连接跟踪模块注册一个连接建立包之后,将生成一个新的连接记录。此后,所有属于此连接的数据报都被唯一地分配给这个连接。如果一段时间内没有流量而超时,连接将被删除,然后其他需要使用连接跟踪的模块就可以重新使用这个连接所释放的资源了。 NAT模块网络地址转换的机制一般用于处理IP地址转换,在Netfilter中,可以支持多种NAT类型,而其实现的基础是连接跟踪。 NAT可以分为SNAT和DNAT,即源NAT和目的NAT,在Netfilter中分别基于以下HOOK: NF_IP_PRE_ROUTING:可以在这里定义DNAT的规则,因为路由器进行路由时只检查数据报的目的IP地址,所以为了使数据报得以正确路由,我们必须在路由之前就进行DNAT NF_IP_POST_ROUTING:可以在这里定义SNAT的规则,系统在决定了数据报的路由以后在执行该HOOK上的规则 NF_IP_LOCAL_OUT:定义对本地产生的数据报的DNAT规则同时,MASQUERADE(伪装)是SNAT的一种特例,它与SNAT几乎一样,只有一点不同:如果连接断开,所有的连接跟踪信息将被丢弃,而去使用重新连接以后的IP地址进行IP伪装;而REDIRECT(重定向)是DNAT的一种特例,这时候就相当于将符合条件的数据报的目的IP地址改为数据报进入系统时的网络接口的IP地址数据报修改模块--mangle表mangle这个词的原意是撕裂、破坏,这里所谓“packet mangling”是指对packet的一些传输特性进行修改。mangle表被用来真正地对数据报进行修改,它可以在所有的5个HOOK上进行操作。其它高级功能模块 Netfilter中还有一些其它的高级功能模块,基本是为了用户操作方便的,没有对它们进行分析,如: REJECT,丢弃包并通知包的发送者,同时返回给发送者一个可配置的ICMP错误信息,由ipt_REJECT.o完成 MIRROR,互换源和目的地址以后并重新发送,由ipt_MIRROR.o完成 LOG, 将匹配的数据报传递给系统的syslog()进行记录,由ipt_LOG.o完成 ULOG,Userspace logging,将数据报排队转发到用户空间中,将匹配的数据适用用户空间的log进程进行记录,由ip_ULOG.o完成。这是Netfilter的一个关键技术,可以使用户进程可以进行复杂的数据报操作,从而减轻内核空间中的复杂度 Queuing,这是上面ULOG技术的基础,由ip_queue.o完成,提供可靠的异步包处理以及性能两号的libipq库来进行用户空间数据报操作的开发。 等等……
启动iptables日志一、配置syslogd的配置文件/etc/syslog.conf在文件syslog.conf里添加如下内容kern.debug /var/log/iptables用的日志源是/proc/kmsg,由它产生
iptables 內就是只要是符合就進行某動作,所以您也只是需要插入一個 rule 讓流通的封包 jump 到 LOG or ULOG 這些 target 即可. 像是:iptables -A FORWARD -m state --state NEW -j LOG 这样可以记录nat的日志到指定的文件
iptables -nvL --line-number -t nat
iptables-save >aa 保存规则
iptables-restore <aa 恢复规则
[root@iptables ~]# iptables -L iptable_filter模块Chain INPUT (policy ACCEPT)target prot opt source destinationChain FORWARD (policy ACCEPT)target prot opt source destinationChain OUTPUT (policy ACCEPT)target prot opt source destination[root@iptables ~]# iptables -L -t mangle iptable_mangle模块Chain PREROUTING (policy ACCEPT)target prot opt source destinationChain INPUT (policy ACCEPT)target prot opt source destinationChain FORWARD (policy ACCEPT)target prot opt source destinationChain OUTPUT (policy ACCEPT)target prot opt source destinationChain POSTROUTING (policy ACCEPT)target prot opt source destination[root@iptables ~]# iptables -L -t nat iptable_nat模块Chain PREROUTING (policy ACCEPT)target prot opt source destinationChain POSTROUTING (policy ACCEPT)target prot opt source destinationSNAT all -- 192.168.3.0/24 anywhere to:172.16.1.92Chain OUTPUT (policy ACCEPT)target prot opt source destination[root@iptables log]# iptables -L -t nat -n -v 加参数-v列出详细信息Chain PREROUTING (policy ACCEPT 166 packets, 11758 bytes)pkts bytes target prot opt in out source destinationChain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 2 155 SNAT all -- * eth0 192.168.3.0/24 0.0.0.0/0 to:172.16.1.92Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination
添加规则有两个参数:-A和-I。其中-A是添加到规则的末尾;-I可以插入到指定位置,没有指定位置的话默认插入到规则的首部[root@iptables log]# iptables -I INPUT 3 -s 192.168.1.3 -j DROP 插入一条规则到第三行[root@iptables log]# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP 添加一条规则到尾部[root@iptables log]# iptables -L -n --line-numbers 查看规则行号,下一步准备删除Chain INPUT (policy ACCEPT)num target prot opt source destination1 DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 8Chain FORWARD (policy ACCEPT)num target prot opt source destinationChain OUTPUT (policy ACCEPT)num target prot opt source destination[root@iptables log]# iptables -R INPUT 3 -j ACCEPT 修改第三行为接受[root@iptables log]# iptables -D INPUT -s 192.168.1.5 -j DROP 删除有两种方法,删除规则号与规则,规则有时太长,就删号,简单方便[root@iptables log]# iptables -D INPUT 2[root@iptables log]# iptables -D INPUT 1 这样便可以删除规则
[root@iptables log]# iptables-save 临时保存生效# Generated by iptables-save v1.4.7 on Wed Sep 24 02:00:26 2014*nat:PREROUTING ACCEPT [1284:101615]:POSTROUTING ACCEPT [0:0]:OUTPUT ACCEPT [0:0]-A POSTROUTING -s 192.168.3.0/24 -o eth0 -j SNAT --to-source 172.16.1.92COMMIT# Completed on Wed Sep 24 02:00:26 2014# Generated by iptables-save v1.4.7 on Wed Sep 24 02:00:26 2014*filter:INPUT ACCEPT [798:65414]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [596:57240]COMMIT# Completed on Wed Sep 24 02:00:26 2014[root@iptables log]# service iptables save 保存到配置文件中永久生效iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ][root@iptables log]# vi /etc/sysconfig/iptables
先清空,再添加规则,以免干扰# iptables -F# iptables -X# iptables -Z# iptables -t nat -F# iptables -t nat -X# iptables -t mangle -F# iptables -t mangle -X添加默认策略 ACCEPT或DROP 这两个的区别是accept表明除非明确禁止的,其它一切皆可访问。drop表明除非明确允许的,其它一切皆不能访问。# iptables -P INPUT ACCEPT# iptables -P OUTPUT ACCEPT# iptables -P FORWARD ACCEPT 此策略还是默认accept的好,然后再drop,如果默认是drop,再accept,很多都不成功,除非对应用或协议非常明确,才可以Type the following command to block ICMP ping requests:# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP 阻止所有接口# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP 阻止特定接口# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT 阻止特定IP或网段# iptables -L -n --line-number 查看# iptables -D INPUT 1 删除The following only accepts limited type of ICMP requests:### ** assumed that default INPUT policy set to DROP ** ### 只允许从防火墙上往外pingiptables -A INPUT -p icmp --icmp-type echo-reply|0 -j ACCEPTiptables -A INPUT -p icmp --icmp-type destination-unreachable|3 -j ACCEPTiptables -A INPUT -p icmp --icmp-type time-exceeded|11 -j ACCEPT## ** all our server to respond to pings ** ## 允许防火墙响应外部pingiptables -A INPUT -p icmp --icmp-type echo-request|8 -j ACCEPT# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP 阻止此mac的所有应用,大小写无所谓,针对直连网段,因为mac不能跨网段# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT 只允许此mac访问22口# iptables -A INPUT -p icmp --icmp-type 8 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT 只允许此macping防火墙# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "int: " 记录从内部某个网段的所有日志# iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j LOG --log-prefix "ext: " 记录从外部某个网段的所有日志 # grep --color 'IP SPOOF' /var/log/iptables 给过滤的关键字上色# iptables -P FORWARD ACCEPT 默认转发允许# iptables -A FORWARD -j LOG --log-prefix "beta: " 并记录进出防火墙的日志# iptables -A FORWARD -d www.cnbeta.com -j DROP 再阻止内网用户访问此网站,可以针对域名与ip,但是像迅雷这种p2p,这两个效果不理想,应该用协议去禁用。# grep --color 'beta' /var/log/iptables# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT## nat example ### iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25# iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j SNAT --to-source 172.16.1.92
新闻热点
疑难解答