iptables(第26天)

iptables: 包过滤型防火墙

Firewall: 防火墙,隔离工具;
工作于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到的报文做出相应处理的组件;

防火墙分类:
主机防火墙:
网络防火墙


iptables的完整组件:iptables/netfilter

netfilter其实是一个框架,通过在适当位置(5个位置)植入钩子函数(hook function),来达到对流量进行监视的目的。
iptables是一个规则管理工具,用来对流量做设置规则。

iptables的本质不是服务,也不是进程,因为iptables是在内核中实现的。只要内核启动成功,配置好iptables规则,就能工作。开机启动iptables,其实只是让早前那些定义好的规则重新生成一遍而已。


iptables原理图如下:
上图中的nat preouting,filter input,filter forward,filter output,nat postrouting这5个点是钩子函数的工作点。



iptables数据包的流向图如下:




功能:也被称之为4表
filter: 过滤,防火墙;
nat: network address translation, 网络地址转换;
mangle:拆解报文,做出修改,再封装报文;
raw:关闭nat表上启用的连接追踪机制;


链(内置):也被称之为5链
PREROUTING:路由选择之前,
INPUT   :数据包进入本机
FORWARD:数据包由本机转发
OUTPUT   :本机发出的包
POSTROUTING:路由选择之后,

每个链上可以添加多个功能,查看上文中的iptables数据包的流向图:
PREROUTING上的包的流向是如下的:
raw-->connection tracking(链接追踪)-->mangle-->destination NAT(目标 网络地址转换)


INPUT上的包的流向是如下的:
mangle-->filter


FORWARD上的包的流向是如下的:
mangle-->filter


OUTPUT上的包的流向是如下的:
raw-->connection tracking(链接追踪)-->mangle-->destination NAT(目标 网络地址转换)-->filter


POSTROUTING上的包的流向是如下的:
mangle-->source NAT(源 网络地址转换)




流入的报文的走向:PREROUTING --> INPUT
流出的报文的走向:OUTPUT --> POSTROUTING
转发的报文的走向:PREROUTING --> FORWARD --> POSTROUTING




各功能的分别实现:
filter:INPUT, FORWARD, OUTPUT
nat: PREROUTING(DNAT), OUTPUT, POSTROUTING(SNAT)
mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw:PREROUTING, OUTPUT




路由发生的时刻:
报文进入本机后:判断目标主机;
报文发出之前:判断经由哪个接口送往下一跳;





iptables:四表五链
添加规则时的考量点:
(1) 要实现哪种功能:判断添加在哪张表上;
(2) 报文流经的路径:判断添加在哪个链上;

链:链上规则的次序,即为检查的次序;因此隐含一定的法则
(1) 同类规则(访问同一应用),匹配范围小的放上面;
(2) 不同类规则(访问不同应用),匹配到报文频率较大的放上面;
(3) 将那些可由一条规则描述的多个规则合并为一个;
(4) 设置默认策略;
功能的优先级次序:raw --> mangle --> nat --> filter



规则:
规则的组成部分:报文的匹配条件,匹配到之后处理动作
    匹配条件:根据协议报文特征指定
基本匹配条件
扩展匹配条件
    处理动作:
内建处理机制,比如丢弃,拒绝,接受等
自定义处理机制
注意:报文不会经过自定义链,自定义链只能在内置链上通过规则进行引用后生效;


iptables规则的编写:
iptables是一个规则管理工具,用于添加、修改、删除、显示规则等;

规则和链有计数器,计数器用来计算接收到的报文的数量:
pkts:由规则或链所匹配到的报文的个数;
bytes:由规则或链匹配到的所有报文大小之和;

iptables命令用法如下:

       iptables [-t table] {-A|-D} chain rule-specification

       iptables [-t table] -I chain [rulenum] rule-specification

       iptables [-t table] -R chain rulenum rule-specification

       iptables [-t table] -D chain rulenum

       iptables [-t table] -S [chain [rulenum]]

       iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

       iptables [-t table] -N chain

       iptables [-t table] -X [chain]

       iptables [-t table] -P chain target

       iptables [-t table] -E old-chain-name new-chain-name

-t table  表示使用哪个表,表有如下4种,默认是filter
    filter, nat, mangle, raw

链管理:
  -F:flush,清空规则链;省略链,表示清空指定表上的所有的链;
  -N:new, 创建新的自定义规则链;
  -X:drop, 删除用户自定义的空的规则链(没有规则的自定义的链);
  -Z:zero,清零,置零规则计数器;
  -P:Policy,为指定链设置默认策略;对filter表中的链而言,默认策略通常有ACCEPT, DROP, REJECT;
  -E: rEname,重命令自定义链;引用计数不为0的自定义链,无法改名,也无法删除;


规则管理:
        -A:append,将新规则追加于指定链的尾部;
        -I:insert,将新规则插入至指定链的指定位置;
        -D:delete,删除指定链上的指定规则;
        有两种指定方式:
        (1) 指定匹配条件;
        (2) 指定规则编号;
        -R:replace,替换指定链上的指定规则;



查看:
    -L:list,列出指定链上的所有规则;
        -n: numberic,以数字格式显示地址和端口号;
        -v: verbose,显示详细信息;
        -vv, -vvv
        --line-numbers:显示规则编号;
        -x: exactly, 显示计数器计数结果的精确值;
      查看规则的常用用法   iptables -L -n 或者 iptables -L -n -v


匹配条件:基本匹配和扩展匹配
        基本匹配:
        [!] -s, --src, --source IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围;
        [!] -d, --dst, --destination IP|Netaddr:检查报文中目标IP地址是否符合此处指定的地址范围;
        -p, --protocol {tcp|udp|icmp}:检查报文中的协议,即ip首部中的protocols所标识的协议;
        -i, --in-interface IFACE:数据报文的流入接口;仅能用于PREROUTING, INPUT及FORWARD链上;
        -o, --out-interface IFACE:数据报文的流出接口;仅能用于FORWARD, OUTPUT及POSTROUTING链上;

        扩展匹配:-m macth_name --spec_options     扩展匹配包括隐式扩展和显示扩展
        例如:-m tcp --dport 22
            隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项;
        -p tcp
        --dport PORT[-PORT]:目标端口,可以是单个端口或连续多个端口;
        --sport PORT[-PORT]    源端口匹配
        --tcp-flags LIST1 LIST2:检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0;没有LIST1中指明的,不作检查;标志位有SYN, ACK, FIN, RST, PSH, URG
                    例如--tcp-flags SYN,ACK,FIN,RST SYN 这表示SYN=1,其余的位为0的报文,--tcp-flags SYN,ACK,FIN,RST等同于--syn
        -p udp
        --dport
        --sport

        -p icmp
        --icmp-type
        可用数字表示其类型:0:表示echo-reply    8: 表示echo-request

        显式扩展: 必须使用-m选项指定使用的扩展;


目标:目标表示某条规则匹配之后要做什么
    -j TARGET:jump至指定的TARGET
        ACCEPT: 接受
        DROP: 丢弃
        REJECT: 拒绝
        RETURN: 返回调用链
        REDIRECT:端口重定向
        LOG: 记录日志
        MARK:做防火墙标记
        DNAT:目标地址转换
        SNAT:源地址转换
        MASQUERADE:地址伪装
        ...
        自定义链:由自定义链上的规则进行匹配检查



回顾:
iptables/netfilter
netfilter: kernel framework,
iptables:一个规则管理工具

四表:filter, nat, mangle, raw
五链:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

iptables的子命令:
链管理:-F, -X, -N, -E, -Z, -P, -L
规则管理:-A, -I, -D, -R

-j TARGET:
ACCEPT, DROP, REJECT, RETURN, LOG, MARK, DNAT, SNAT, MASQUEARDE, ...


iptables的报文匹配标准:
通用匹配:-s, -d, -p, -i, -o
扩展匹配
隐含扩展:
-p tcp: --dport, --sport, --tcp-flags, --syn (相当于--tcp-flags SYN,ACK,FIN,RST SYN)
-p udp: --dport, --sport
-p icmp: --icmp-type
显式扩展: -m



显式扩展:必须显式指明使用的扩展模块(rpm -ql iptables | grep "\.so")
每个扩展模块一般都有自己专用的选项。

对于CentOS6,CentOS7,iptables的显示扩展的帮助文档:
CentOS 6: man iptables
CentOS 7: man iptables-extensions


1、multiport扩展   表示多端口匹配
以离散方式定义多端口匹配;最多指定15个端口;

[!] --source-ports,--sports port[,port|,port:port]...:指明多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指明多个离散的目标端口;
[!] --ports port[,port|,port:port]...

~]# iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT
~]# iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT


2、iprange扩展
指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;

[!] --src-range from[-to]:指明连续的源IP地址范围;
[!] --dst-range from[-to]:指明连续的目标IP地址范围;

~~]# iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT


3、string扩展
检查报文中出现的字符串;

--algo {bm|kmp}      指定匹配字符串的算法
bm  表示Boyer-Moore算法
kmp 表示Knuth-Pratt-Morris算法      著名的kmp算法
[!] --string pattern
  [!] --hex-string pattern

~]# iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT

4、time扩展
根据报文到达的时间与指定的时间范围进行匹配;

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

--timestart  hh[:mm[:ss]
--timestop  hh[:mm[:ss]

--monthdays  day[,day...]
--weekdays    day[,day...]

例子  iptables -I INPUT  -d 172.16.100.9 -p tcp --dport 80 -m time --timestart 00:00 --timestop 23:59 -j DROP

5、connlimit扩展
根据每客户端IP(也可以是地址块)做并发连接数数量匹配;

--connlimit-above n:连接的数量大于n
--connlimit-upto n: 连接的数量小于等于n

iptables  -A  INPUT  -p  tcp  --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT


6、limit扩展
基于收发报文的速率做检查;

使用令牌桶过滤器来实现速率匹配

--limit rate[/second|/minute|/hour|/day]
--limit-burst number    峰值

例子:
iptables -I INPUT -d 171.16.100.9 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT

iptables -I OUTPUT -s 171.16.100.9 -p icmp --icmp-type 0  -j ACCEPT


7、state扩展
根据连接追踪机制检查连接的状态;

调整连接追踪功能所能够容纳的最大连接数量:意思是能够追踪的连接的最大数量
/proc/sys/net/nf_conntrack_max 或者 /proc/sys/net/netfilter/nf_conntrack_max  对于CentOS 6和7
   /proc/sys/net/ipv4/netfilter/ip_conntrack_max或者者/proc/sys/net/ipv4/ip_conntrack_max    对于CentOS 5

已经追踪到的,并记录下的连接:
/proc/net/nf_conntrack

自定义不同协议或连接类型追的时长的属性:
/proc/sys/net/netfilter/

可追踪的连接状态:(这个状态和TCP的有限状态机不是同一个,这是iptables自己维护的)
NEW:新发出的请求;连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;
RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系,数据连接由命令连接建立起来的。
INVALIED:无法识别的连接;

[!] --state STATE1,STATE2,...

反弹式木马

例子: 经典的例子
1:进入22端口的流量,且其状态为NEW和ESTABLISHED的,放行
iptables -I INPUT -d 172.16.100.9 -p tcp  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

2:从22端口出去的流量,且状态为ESTABLISHED的,放行
iptables -I OUTPUT -s 172.16.100.9 -p tcp  --sport 22 -m state --state ESTABLISHED -j ACCEPT

3:进入80端口的流量,且其状态为NEW和ESTABLISHED的,放行
iptables -I INPUT -d 172.16.100.9 -p tcp  --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

4:从80端口出去的流量,且状态为ESTABLISHED的,放行
iptables -I OUTPUT -s 172.16.100.9 -p tcp  --sport 80 -m state --state ESTABLISHED -j ACCEPT

5:允许别的主机来ping本机,且状态为NEW和ESTABLISHED的,放行
iptables -A INPUT -d 172.16.100.9 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT

6:本机回应ping
iptables -A OUTPUT -s 172.16.100.9 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT

观察2,4,6的 OUTPUT链,可以看到只要是能进来的连接,都可以放其出去。
iptables -I OUTPUT   -m state --state ESTABLISHED -j ACCEPT

观察1,3,5发现流入的流量,只要是ESTABLISH状态的都可以放行其进来。
iptables -I INPUT  -m state --state ESTABLISHED -j ACCEPT


流入的流量中,端口为22,80的连接,且状态为NEW的,必须放行。
iptables -I INPUT 2 -d 172.16.100.9 -p tcp -m state --state NEW  -m multiport --dports 22,80  -j  ACCEPT


问题:如何开放被动模式的ftp服务?原理是追踪ftp链接的RELATED状态

(1) 装载ftp追踪时的专用的模块:
# modprobe nf_conntrack_ftp

(2) 放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED

# iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT    这个表示放行命令连接
# iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT    这个表示放行数据连接

(3) 放行响应报文:
ESTABLISEHD

# iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT



如何保存及重载规则:

保存规则至指定文件:适用于CentOS 6,CetnOS7
iptables-save > /PATH/TO/SOMEFILE

从指定文件重载规则:适用于CentOS 6,CetnOS7
iptables-restore < /PATH/FROM/SOMEFILE

对于CentOS 6:
service iptables save  相当于 iptables-save > /etc/sysconfig/iptables
   service iptables restart 相当于 iptables-restore < /etc/sysconfig/iptables
   service iptables start  相当于   iptables-restore < /etc/sysconfig/iptables
   iptables服务脚本位于/etc/rc.d/init.d/目录下,该脚本没有启动任何服务,或者任何进程,当start该服务脚本时,其实只是netfilter读取/etc/sysconfig/iptables文件的规则使之生效而已。
   /etc/sysconfig/iptables-config文件是配置文件,里面可以配置启动iptables时,要加载的模块。
    具体细节请阅读/etc/rc.d/init.d/iptables文件。


对于CentOS 7:
引入了新的iptables前端管理服务工具:firewalld
firewalld-cmd
firewalld-config  这是图形工具
         注意: 要在CentOS 7上使用iptables,先禁用firewalld使其开机不自动启动( systemctl disable firewalld.service),然后停止firewalld服务(systemctl stop firewalld.service  此命令会清空规则)
    在CentOS 7上启动iptables服务: systemctl start iptables.service  (可能不存在这样的unit,必须自己写一个iptables的unit)

关于firewalld:
http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html





网络防火墙
网络防火墙的拓扑结构:


环境如下:
1:左边的2个主机表示内网里的主机的网卡设置为vmnet2,假设为192.168.20.2(kali linux   并且在192.168.20.2上提供web服务和ssh服务,以及ftp服务)和192.168.20.3。并且这2个内网主机的网关设置为如图所示,即指向中间的主机的网卡:route add default gw 192.168.20.1
2:中间的主机(CentOS 7)表示网路防火墙主机,打开路由转发sysctl -w net.ipv4.ip_forward=1,有2个网卡,如图所示,左边的那个网卡通过编辑虚拟机的网络适配器添加,假设添加为vmnet2,地址为192.168.20.1,左边内网的那2个主机的ip地址也设置为该网段的ip,右边的网卡ip地址为192.168.1.104 ,这个ip地址是可以连接互联网的。
3:外部主机,假设为192.168.106,是一台ubuntu主机。添加一条路由:
route add -net 192.168.20.0/24 gw 192.168.1.104     这样一来的话,ping 192.168.20.2时,就可以通过网关192.168.1.104出去。


这样一来环境就搭建好了。
在网路防火墙主机上执行 iptables -F 清空规则连,并且iptables -P FORWARD DROP,表示改变防火墙的FORWARD连的默认处理方式为DROP。

现在要如何写规则,使得192.168.106可以访问192.168.20.2主机提供的web服务?
添加的规则如下:规则写在网路防火墙主机上
iptables -A FORWARD -d 192.168.20.2 -p tcp  --dport 80  -j ACCEPT
iptables -A FORWARD -s  192.168.20.2 -p tcp  --sport 80  -j ACCEPT

现在要放行ssh服务,web服务的包,如何写规则,使得192.168.106可以访问192.168.20.2主机提供的web服务和ssh服务。
iptables -F
iptables -A FORWARD -m state --state ESTABLISHED -j ACCPET
iptables -A FORWARD -d 192.168.20.2 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
第一条规则表示不管是响应还是请求,只要是ESTABLISHED状态的包,都放行。
第二条规则表示目标是192.168.20.2,端口为22,80的,并且是ESTABLISHED状态的包才放行。


如何写规则,使得192.168.106可以访问192.168.20.2主机提供的web服务和ssh服务和ftp服务? 在上面2条规则的基础上更改。
modprobe nf_conntrack_ftp
iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCPET
iptables -R FORWARD 2 -d 192.168.20.2 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
这2条规则基于上面的规则修改而来。








练习:
网络模型如图:
左边的2个表示内网里的2台主机,中间的那个主机左边的网卡服务于内网,右边的网卡服务于外网。内部网络里的主机的网关指向中间主机的左边网卡的ip地址。通过虚拟机可以添加多个实际网卡。


主机防火墙:
放行telnet, ftp, web服务;
放行samba服务;
放行dns服务(查询和区域传送);

网络防火墙:
放行telnet, ftp, web服务;
放行samba服务;
放行dns服务(查询和区域传送);























评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用