之前发过关于iptables和firewall的文章,基本上是一些命令的总结。
最近由于在做lvs,需要用到iptables的一些知识,所以我又做了详细的总结
firewall: 防火墙,隔离工具。对于进出本机或网络的报文根据事先定义好的检查规则进行检测,能够被规则匹配到的报文作出相应处理的组件。
防火墙分为: 主机防火墙,网络防火墙
注意:
(1)防火墙与网络攻击有关,与本地程序病毒没有太大关系。
(2)进出报文是通过tcp/ip协议栈实现的,而tcp/ip协议栈工作在内核中,火墙又是对进出报文进行检测的,所以火墙也是工作在内核中。
主机防火墙
目标报文有两种:
目标主机是本机:tcp/ip协议将请求根据对方所访问的目标端口送给监听在此目标端口上的应用程序 (报文到达用户空间的应用程序)。
目标主机不是本机:
既然目标主机不是本机,请求为什么会发到本机上呢?
答:有主机将网关设置为本机的网卡地址。
报文通过mac地址送过来,拆封后发现目标ip不是本机,这时怎么办?
linux网络协议栈有一个功能:ip_forward(路由转发)。
如果打开了ip_forward,则会将请求装发给下一跳路由(这时请求报文没有进入用户空间)
本机访问别人:
例如本机浏览器打开一个网站(报文出去),报文先发往内核中的tcp/ip协议栈,然后根据路由选择一个接口离本机而去。
所以报文的进出可以分为三种:目标地址是本机、报文经由本机但目标地址不是主机、本机出去的报文。
基于这三种情形,在tcp/ip协议栈上,根据报文的不同流向,分别进行不同情形下的检查。
网络防火墙:
在网络进出口对进出某网络的报文设立防火墙,这个防火墙应该是一个硬件设备。
网络内部两个主机发起了攻击,网络防火墙管不了。只有报文经由防火墙接口时,防火墙才能发挥作用。
所以一般来说,网络防火墙用于防“外鬼“,主机防火墙用于防“内鬼“。
IDS:和IPS
规则是写死的,防火墙一般防范的都是一些预知行为,有些人经过一些巧妙的伪装后让自己的行为看起来像协议非攻击行为,防火墙就会对其放行。
这里就要用到IDS(入侵检测系统)。它可以发送警告给管理员,由管理员再进行处理。这样就会有一定延迟,有可能管理员刚收到警报,系统已经被攻陷了。。。。
还有一种机制:IPS,入侵检测系统检测到非法行为后,将这种行为通知给火墙,firewall在这种条件下触发生成一条规则,将非法行为拒之门外。
用IDS举例来说,IDS分为HIDS(主机入侵检测系统),NIDS(网络入侵检测系统)。HIDS部署在单台主机上就行,NIDS需要在网络上部署传感器。(类似于在街头部署摄像头)
说完了firewall,接下来说iptables
iptables全称: netfilter/iptables
**netfilter:**内核tcp/ip协议栈内部所实现的网络过滤器框架,由它来提供hooks function(钩子函数)。
钩子函数将报文“钩住“,由规则进行对比检测。
iptables就是负责往这些钩子上面添加、删除、修改规则的
所以iptables实质上就是一个管理工具(rule util)
运行中的内核其实是在内存中,所以规则其实是被扔到内存中,要想规则永久有效,需要写成脚本。
**所以启动防火墙不是启动服务,而是让规则文件重新生效,并不需要启动进程,而是直接在内核上运行。所以防火墙从来就不是服务。 **
iptables的功能:
filter:过滤
nat:network address translation。网络地址转换
mangle: nat仅可以修改源ip,目标ip,源port,目标port,而mangle作用是:拆开报文,作出修改,封装报文。
raw: 关闭nat表上启用的连接追踪机制。(连接追踪机制简单理解就是:你家是开餐馆的,一个顾客第一次去你家吃饭,你就将他记住,下一次再去吃,你就知道这是之前来你家吃饭那家伙)。
要想追踪连接,就要把访问者信息记下来,记下来需要内存空间,这样有可能导致内存溢出(内存不够),后续访问就进不来了。所以在一些访问量很大的场合不建议开启连接追踪机制。如果不得不启用的话,准备好足够大的内存。
5个钩子函数:
PREROUTING: 路由前
INPUT: 报文目标地址是主机内部
*FORWARD:*报文目标地址不是本机内部,需要转发出去
*OUTPUT:*从本机内部直接发出的报文
*POSTROUTING:*无论是本机转发的还是本机进程自己发出的报文,在离开之本机之前,都得做在路由选择,这一次路由选择完之后作出的处理就是POSTROUTING
PREROUTING和POSTROUTING和网卡没有多大的关系。无论从哪个网卡来,在转发之前都叫PREROUTING,无论从哪个网卡离开,在转发之后都叫POSTROUTING。
根据报文流向分类:
流入:PREROUTING------->INPUT
流出:OUTPUT-------->POSTROUTING
转发:PREROUTING------->FORWARD-------->POSTROUTING
各功能的分别实现:
可以使用iptables -L -t filter|nat|mangle|raw
查看
filter:INPUT、FORWARD、OUTPUT
nat:PREROUTING(DNAT)、INPUT、OUTPUT、POSTROUTING(SNAT)
mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
raw:PREROUTING、OUTPUT
路由发生的时刻:
报文进入本机后:判断目标主机
报文发出前:判断路由经由哪个接口送往下一跳
iptables有四表五链,添加规则时的考量点:
(1)要实现哪种功能,判断添加在哪张表上
(2)报文流经的路径,判断添加在哪条链上
-
链:链上规则的次序,即为检查的次序:
-
一般iptables一旦有一条规则匹配上了,那么后续规则不再匹配,这样可以提高效率
(1)同类规则(访问同一应用),匹配范围小的放上面;
例如:规则一:拒绝172.25.24网段的人访问
规则二:接受172.25.24.25这台主机
(2)不同类规则(访问不同应用),匹配到报文频率较大的放上面;
(3)将那些可由一条规则描述的多个规则合并成一个;
(4)设置默认策略
功能的优先级次序:raw------>mangle------->nat---------->filter
-
规则
-
组成部分:报文匹配条件,匹配到之后的处理动作
匹配条件:根据协议报文特征指定
基本匹配:
[!] -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,--oout-interface IFACE:数据流出接口;仅用于FORWARD,OUTPUT,POSTROUTING
扩展匹配:
-m match_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
SYN,ACK,FIN,RST,PSH,URG
例如:--tcp-flags SYN,AVK,FIN,RST SYN #此处表示检查tcp三次握手的第一次。 相当于--syn
-p udp:
--dport
--sport
-p icmp
--icmp-type
可用数字表示其类型
0:echo-reply 回送应答
8:echo-request 回送请求
eg:iptables -A OUTPUT -s 172.25.44.5 -p icmp --icmp-type 8 -j ACCEPT #出去的报文中只允许icmp类型为8的出去
iptables -A INPUT -d 172.16.44.5-p icmp --icmp-type 0 -j ACCEPT
这样自己ping别人可以ping通,别人ping自己ping不通。
处理动作:
内建处理机制,自定义处理机制
注意:报文不会经过自定义链,只能通过在内置链上引用后生效
目标:
-j TARGET:jump至指定的TARGET
ACCPET:接受
DROP:丢弃
REJECT:拒绝
RETURN:返回调用链
LOG:记录日志
MARK:作防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装
。。。
自定义链:由自定义链上的规则进行匹配
自定义链引用:
报文被内置链上的某条规则匹配到,这条规则的target指向另一条自定义链,
return:若自定义链上的规则匹配不上,则回到内置链刚才匹配位置的下一条继续匹配。
规则和链计数器:
pkts:由规则或链所匹配到的报文个数
bytes:有规则或链匹配到的报文大小之和
iptables命令:
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-t table] {-A|-C|-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:filter、nat、mangle、raw (省略默认为filter(
链管理:
-F:flush,清空规则链,省略链,表示清空指定表上的所有链
-N:new,创建新的自定义规则链;
-X:drop,删除用户自定义的空的规则链(若不是空的,可以先清空再删除)
-Z:zero,清零,置零规则计数器
-P:Policy,为指定链设置规则策略,岁filter表中的链而言,默认策略通常有ACCEPT,DROP,REJECT;
-E:rEname:重命名自定义链,引用计数不为0的自定义链,无法改名,也无法删除
规则管理:
-A:append,将新规则链追加于指定链的尾部;
-I:insert,将新的规则插入指定链的指定位置;
-D:delect,删除指定链的指定规则;
有两种指定方式:
(1)指定匹配条件
(2)指定规则编号
-R:replace,替换指定链上的指定规则
查看:
-L: list,列出指定链上的所有规则
-n:numberic,以数字格式显示地址和端口号;
-v:verbose,显示详细信息,-vv,-vvv
-line-numbers:显示规则编号;
-x:exactly,显示计数器计数结果的精确值
演示:
使用iptables -L可以看到filter表的所有链,包括自定义的链
这时候直接用iptables -X清空的话会有报错,先使用iptables -F刷掉所有规则,再清空就可以了
同时我们可以看到括号里面内置链的参数为policy,自定义链为references
创建新的自定义规则链:
对自定义规则链重命名
重启服务后之前所作的操作都没了
ctstate RELATED,ESTABLISHED:连接追踪状态
以数字形式显示端口和ip
显示规则编号
删除INPUT链上的第3条规则