; iptables | Linux运维部落

iptables

一、前言

什么是iptables?当我们启动iptables时,使用service命令可以启动iptables。但是并非使用service启动的iptables就能说明其是一个服务。Iptables是一个便以我们写规则的工具,真正起作用的是内核中的netfilter一个框架。Netfilter内置了5个hook函数,当一个数据包交由此机器时,经过这5个hook函数的其中某个才能进入用户空间,或者转发出去。

二、netfilter工作原理

netfilter2.png

当数据包到达目标主机时,经过PREROUTING链,经路由之后决定是否转发,不转发则进入INPUT链,到达用户空间。进程对外通信时,经由OUTPUT链出去,路由之后到达POSTROUTING链,经网卡出去。当一数据包经过PREROUTING链发现其不是到达本主机,那么数据包经过FORWARD链,到达 POSTROUTING链转发出去。本机进程对发送数据时,经由OUTPUT链路由之后进入POSTROUTING链出去。iptables匹配规则时,是自上而下匹配的,匹配到第一条规则时既跳出,否则一直往下匹配,没有则使用默认规则。

五个hook函数分别是PREROUTING,INPUT ,OUTPUT,POSTROUTING,FORWARD,我们把这五个钩子函数称为链,Netfilter实现了几功能,raw ,mangle,nat,filter。我们一般把这几个功能称为表,表之间有优先级关系,从低到高为filter—-nat—-mangle—-raw,表与链之间有对应关系,具体见图表。

filter INPUT FORWARD OUPUT
nat PREROUTING(DNAT) POSTROUTING(SNAT) OUTPUT
mangle PREROUTING INPUT FORWARD OUTPUT POSTROUTING
raw PREROUTING OUTPUT

iptables规则建立时,首先需要确定功能(表),确定报文流向,确定要实现的目标,确定匹配条件。iptables时,尽量遵循以下规则:尽量减少规则条目,彼此间无关联,访问条目大放上面,有关联(同一功能),规则更严格的放上面

三、基本语法

iptables [-t TABLE] COMMAND CHAIN  CRETIRIA -j TARGET

-t TABLE :  TABLE为nat,mangle,raw,filter中的一个,默认为filter

                  COMMAND 

                    链 : -F 清空规则链

                            -N 自建一条链

                            -X 删除一条自定义空链

                            -Z 计数器归零

                            -P 设置默认策略

                            -E 重命名自定义链

iptables –t nat -F                  
iptables –t filter –N web_services                   
iptables –t filter  –X web_services 
iptables –t filter   -Z 
iptables –t filter  –P DROP                     
iptables –t filter  –E web_services www_services

                         规则:

                            -A 在规则链最后添加一条规则

                            -I 在规则链中插入一条规则,默认为第一条

                            -D 删除一条规则链

                            -R 替换规则链

               
iptables –t filter –A www_services –p tcp –-dport 80 –j ACCEPT                   
iptables –t filter –I www_services –p tcp –-dport 22 –j ACCEPT 
iptables –t filter –D www_services –p tcp –-dport 22 –j ACCEPT
iptables –t filter –D www_services 1                    
iptables –t filter –R www_services –p tcp –dport 22 –j DROP

                         查看:

                            -L: List

                        子选项:

                                -n: numeric

                                -v, -vv, -vvv

                                -x: eXactly

                                –line-numbers

                              iptables –t filter –L –n –v

                 CRETIRIA

                         通用匹配

                                -s, –src, –source:

                                -d, –dst, –destination:

                                -p {tcp|udp|icmp}:

                                -i IN_IF:

                                -o OUT_IF:

                            扩展匹配:

                        调用netfilter额外模块实现特殊检查机制,(使用到相关功能,要使用iptables命令的-m选项来指定调用哪个模块)

                                隐式扩展:

                                  -p tcp [-m tcp]

                                  –sport PORT[-PORT]

                                  –dport

                                  –tcp-flag 要检查标志位列表(用逗号分隔)  必须为1的标志位列表(逗号分隔)

                                  -p icmp [-m icmp]

                                    –icmp-type

                                     0: echo-reply, ping响应

                                     8: echo-request, ping请求

iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP                        
iptables -t filter -A INPUT -p tcp --tcp-flags syn,ack,rst,fin syn -j DROP               
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags all none -j DROP

                           显式扩展:

                                -m 扩展模块名称

                          模块:iptables,netfilter各拥有一部分代码

                                   multiport: 多端口匹配,可用于匹配非连续或连续端口;最多指定15个端口;

                                            –source-ports, –sports port[,port,port:port]

                                            –destination-ports, –dports

                                            –ports

iptables -I INPUT -d 192.168.19.128 -p tcp -m multiport --dports 22,80 -j ACCEPT           
iptables -I OUTPUT -s 192.168.19.128 -p tcp -m multiport --ports 22,80 -j ACCEPT

                                   iprange: 匹配指定范围内的地址,匹配一段连续的地址而非整个网络时有用;

                                            [!] –src-ragne IP[-IP]

                                            [!] –dst-range

iptables -A INPUT -d 192.168.19.128 -p tcp --dport 23 -m iprange --src-range 192.168.19.129-192.168.19.135 -j ACCEPT                  
iptables -A OUTPUT -s 192.168.19.128 -p tcp --sport 23 -m iprange --dst-range 192.168.19.129-192.168.19.135 -j ACCEPT

                                    string: 字符串匹配,能够检测报文应用层中的字符串

                                            –algo {kmp|bm}

                                            –string "STRING"

                                            –hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;

                                              iptables -I OUTPUT -m string –algo bm –string "sex" -j DROP

                                    time: 基于时间做访问控制

                                            –datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]

                                            –datestop

                                 –timestart hh:mm[:ss]

                                            –timestop hh:mm[:ss]

                                            –weekdays day[,day]

                                               iptables -I INPUT -d 192.168.19.128 -p tcp –dport 80 -m time –timestart 08:20 –timestop 18:00 –weekdays Mon,Tue,Thu,Fri -j REJECT

                                    connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;

                                            [!] –connlimit-above [n]

                                              iptables -A INPUT -d 172.16.100.7 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j DROP

                                    limit: 速率限制

                                            –limit n[/second|/minute|/hour|/day]

                                            –limit-burst n

                                               iptables -A INPUT -d 192.168.19.128 -p icmp –icmp-type 8 -m limit –limit 20/minute –limit-burst 5 -j ACCEPT

                                    state: 状态检查

                                            –state

                                             连接追踪中的状态:

                                               NEW: 新建立一个会话

                                               ESTABLISHED:已建立的连接

                                               RELATED: 有关联关系的连接

                                               INVALID: 无法识别的连接

                                     iptables -t filter -A OUTPUT -p tcp –sport 22 -m state –state NEW -j DROP 

                                     放行被动模式下的FTP服务:

                                                 1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/

                                                 模块:nf_conntrack_ftp

modprobe nf_conntrack_ftp                                    
lsmod | grep nf_conntrack_ftp                            
nf_conntrack_ftp       12913  0                             
nf_conntrack                            
79758  3 nf_conntrack_ftp,nf_conntrack_ipv6,xt_state

                                                 2、放行请求报文:

                                                 (1)放行NEW状态对21端口请求的报文;

                                        iptables -A INPUT -p tcp –dport 21 -m –state NEW -j ACCEPT

                                                  (2) 放行ESTABLISHED以及RELATED状态的报文

                                        iptables -A INPUT -m –state ESTABLISHED,RELATED -j ACCEPT

                                                 3、放行响应报文:

                                                  (1) 放行ESTABLISHED以及RELATED状态的报文

                                         iptables -A OUTPUT -m –state ESTABLISHED,RELATED -j ACCEPT

                                                 由于系统对调整连接追踪功能所能容纳的连接有最大数目,视具体清空调整最大连接数目,或者不启用此功能

                                                 cat /proc/sys/net/nf_conntrack_max

                                     65536

                                                 其中当前追踪的所有连接在/proc/net/nf_conntrack中

                                                 /proc/net/nf_conntrack

                                                  不同协议或连接类型追踪时的属性,/proc/sys/net/netfilter目录:

              TARGET: (-j target)

                                   ACCEPT, REJECT, DROP, SNAT, DNAT, MASQERADE, RETURN, LOG, REDIRECT, MARK

                                SNAT:

                                –to-source SIP

                                    DNAT

                                –to-destination

iptables -t nat -A POSTROUTING -p tcp --dport 23210 -j SNAT --to-source 192.168.19.129       
iptables -t nat -A PREROUTING -p tcp --dport 23220 -j DNAT --to-destination 192.168.19.129     
iptables -A INPUT -d 192.168.19.128 -p tcp --dport 80 -j LOG --log-prefix "from iptables: "

四、 案例

4.1、实验拓扑图

iptables实验拓扑.png

4.2、配置过程

搭建环境

在firewall添加一块网卡,同时网络连接为自定义–VMnet3,webserver和client的网络连接也自定义在VMnet3上

  blob.png

Firewall配置ip,其中eth1网卡ip地址是自动获取的

blob.png

Webserver

blob.png

添加网关

blob.png

Client

blob.png

添加网关

blob.png

为了不让已有iptables规则对实验产生影戏,先清空规则链

在所有主机上执行这些命令

blob.png

此时在webserverclient 上无法ping通外网

blob.png 

当需要使用转发功能时,需要打开网络转发功能

Vim /etc/sysctl.conf

Net.ipv4.ip_forward=1

Sysctl –p

blob.png 

配置SNAT

blob.png

或者

blob.png

测试,在webserver上测试

blob.png

远程主机返回应答的包到目标主机时,没有在防火墙上做地址转换,却依然能把数据包转发给webserver,这是因为防火墙那台主机上维持了一张转换或的IP或端口对应表,故无需人为去添加转换规则。

在防火墙上添加DNAT

blob.png

在物理机上访问172.16.0.2的网站

blob.png

五、总结

iptables可做主机防火墙和网络防火墙,做为网络防火墙时需要打开转发功能,iptables规则顺序很重要,其自上而下匹配的规则链,故需要一条一条检查规则链,故常用规则,特别是匹配次数大的放在上边,同一规则更严格的条目放在上面。

原创文章,作者:成吉思汗,如若转载,请注明出处:http://www.178linux.com/8950

评论列表(2条)

  • stanley
    stanley 2015-10-27 23:19

    赞,已置顶,有机会可以给大家分享写blog经验

    • 成吉思汗
      成吉思汗 2015-10-30 17:26

      谢谢,新手不敢造次呀

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班