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)
成吉思汗成吉思汗
上一篇 2015-10-27
下一篇 2015-10-27

相关推荐

  • 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

    设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序。但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关。例子1:银行业务办理流程在银行办理业务时,一般都包含几个基本固定步骤:取号排队->…

    Linux干货 2015-04-07
  • Linux命令执行

    Linux命令 Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和外部命令。 命令格式 COMMAND [OPTIONS…] [ARGU…

    Linux干货 2017-07-15
  • 文件的查找

    文件的查找 使用locate命令 默认从根开始搜索 非实时查找(数据库查找) locate 文件名 查询系统上预建的的文件索引数据库    /var/lib/mlocate/mlocate.db 依赖于事先构建的索引 索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb)。注意工作中不能轻易…

    Linux干货 2016-08-18
  • 新建用户的全​程解析

     新建用户的全程解析: 1,编辑passwd文件,添加newuser用户一行  nano /etc/passwd  newuser:x:2000:2000:NEWUSER:/home/newuser:/bin/bash  2,编辑group文件,添加newuser组一行 &nbs…

    系统运维 2016-08-05
  • alias——Linux基本命令(4)

    1.     alias别名 (1)查看、设置别名 Linux系统提供了一个有用的工具叫alias,可以让我们将一些需要频繁使用的但又过于冗长的命令设置一个别名,这样一来,以后只需输入一个简短的别名就可以达到同样的作用。 alias显看当前已定义的别名   使用aliasaliname=’comm…

    2017-07-13

评论列表(2条)

  • stanley
    stanley 2015-10-27 23:19

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

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

      @stanley谢谢,新手不敢造次呀