iptables
1:Iptables/netfiter是linux下工作在网络层的防火墙,但是他支持连接追踪(状态检测).很多防火墙资料但中,都把iptables和netfiter叫做防火墙,其实netfiter是linux内核中实现的包过滤防火墙的内部结构,不以程序或文件的形式存在,属于内核态(内核空间),而iptables是管理防火墙命令的工具,是一个程序,iptables在为netfiter的管理上提供策略和规则(以下统统成为iptables).其中又分为网络防火墙和应用层防火墙(网关).
1.1:网络防火墙
数据报文到达该防火墙时,该防火墙会检测ip首部中的源地址,目标地址,TTL,tcp的源端口,目标端口TTL等,如果匹配到防火墙定义的规则,就进行相应的处理,如:通过,丢弃,许进不许出等.但是ip是很容易伪装的,所以就有了应用层防火墙
1.2:应用层防火墙(网关,代理服务器)
工作在应用层,不检测ip和tcp报文,但是会检测数据的内容,如果内容匹配到防火墙的策略,就进行相应的处理,如:丢弃或通行,许进不许出等.但是ip和tcp已经被丢弃了,没有了源ip,和源端口,所以该防火墙就把自己当成源ip源端口.
2:工作机制
2:1Iptables的钩子函数
一个数据报文进入我们的linux主机有5中流向,首先进入我们主机的内核空间,这是就是路由前(PREROUTING),内核空间的tcp/ip协议栈上的路由功能(FORWARD)对该报文进行检测,判断该报文的目标ip,如果该报文的目标ip就是我们的机器,就检查目标端口,如果该目标端口有进程在监听,那么路由就会把该报文转发到本机的用户空间中,这就是输入(INPUT).如果目标ip不是本机,就判断本机是否允许做网络间转发,如果不允许,就丢弃该包.如果允许,路由就会把该报文转发到另外一张网卡,这是路由后(POSTROUTING).还有一种情况,如果报文是通过本机出去的呢?这就是输出(OUTPUT)了,总结下来有5种情况了.路由前(PREROUTING),输入(INPUT),路由(FORWARD),输出(OUTPUT),路由后(POSTROUTING),而这5个流向也叫做钩子函数(),也就是我们需要设置的规则.
2.2iptables的处理机制
Iptables是如何防火的呢?有几种情况:过滤(Ffilter).网络地址转换(NAT),NAT又分为源地址转换(DNAT),目标地址转换(SNAT)(源地址转换为目标地址都是在路由后(请求),目标地址转换为源地址都在路由前(响应)).(私有ip是不能访问公网的,客户端经过一台公网ip的服务器访问互联网,在服务器端需要完成地址转换(NAT),该报文刚进入到服务器端的时候(路由前),还不知道该报文的目标ip,所以不能做NAT,需要在路由后做.互联网的响应发回来的时候,服务器在接受到响应报文,因为该报文就是发往本服务器的,如果经过服务器内部的路由的话,就会被服务器端的用户空间接受到该报文,但是该报文又不是服务器端的进程发送的,所以只能不经过该服务器端的路由,直接发回给最初发送请求的客户端,这叫路由前,也就是目标地址转换.简单的说,经过了路由的就叫路由后,没经过路由的就叫路由前).mangle:主要是做记录用的,他可以改变ip或tcp报文中的一些信息,相当于打个标记.raw:这个用的不多,就不做介绍了....总的来说就是:过滤(filter) ,网络地址转换(NAT),mangle,raw
2.3:规则钩子函数+处理机制就组成了规则表了
钩子函数加上处理机制就是他的处理规则了,下面看组合以及优先级
优先级:raw-->mangle-->NAT—>filter
组合四表五链,是表和链的对应关系
raw:PREROUTING,OUTPUT,-->这个用的不多
mangle:INPUT,FORWORD,OUTPUT,PREROUTING,POSTROUTING(主要做防火墙标记的)
nat: PREROUTING,POSTROUTING,OUTPUT
filter:INPUT,FORWORD,OUTPUT(这是默认表,如果执行命令的时候不指定表,默认使用此表),默认有通和堵,通:默认为堵,只对能识别的记性放行.堵:默认为通,只对能识别的就行阻截.
下面是为了另一种记法,五链四表,和上面一样的
路由前(PREROUTING):nat,mangle,raw
输入(INPUT):filter,mangle
路由(FORWARD):mangle,nat
输出(OUTPUT):filter,mangle,nat,raw
路由后(POSTROUTING):mangle,nat
如下图:
2.4:检查条件:网络层防火墙只能检查,ip首部,tcp首部,帧首部等等
IP:源IP,目标IP
TCP:源端口,目标端口,Flags(SYN,ACK,FIN)
UDP:源端口,目标端口
ICMP:ICMP-TYPE
2.5:扩展检查:对时间,对协议,对关键字,对state,
处理机制
DENY:悄悄丢弃
DROP:丢弃
REJECT:丢弃,有挑衅的味道,少用
ACCEPT:允许通过
RETURN:返回
2.6:匹配条件
通用匹配:-s:匹配源地址,可以是IP,也可以是网络地址,可以用!取反,不写表示所有的地址-d:匹配目标地址,不写表示所有的地址-p:匹配协议,通常只是用{TCP|UDP|ICMP}三者之一-i:数据报文流入的接口,通常只用于INPUT,FORWARD和PERROUTING这三个表-o:数据报文流出的接口,通常只用于OUPUT,FORWARD和POSTROUTING这三个表
2.7:扩展匹配-->隐含扩展
如:iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT
实际上是:iptables -A OUTPUT -s 172.16.100.7 -p icmp -m icmp --icmp-type 8 -j ACCEPT
因为-p指定了icmp协议,就可以省略-m icmp,所以这就是隐含扩展,但是有些是无法隐含的,就只能显示扩展了.
隐含扩展:使用-p{TCP|UDP|ICMP}指定某协议后,自动能够对协议进行的扩展
-p tcp
--dport:(目标端口)
--sport:(源端口)
--tcp-flags(标识位匹配)[URG,PSH,RST,SYN,ACK,FIN],flags条件要检查两组参数,第一组是要检查的标志位,第二组是要检查的标志位为1的.如:--tcp-flags rst,syn,ack,fin syn,这表示要检查的标识位是rst,syn,ack,fin,只有syn为1,其他的都要为0
-p udp
--sport:源端口
--dport:目标端口
-p icmp
这里只要注意0和8就行了
8:ping请求
0:ping响应
2.8:扩展匹配-->显示扩展
显示扩展:必须要明确指定的扩展模块,在/lib/xtables中定义了许多的特许模块,这写模块就是基于一些协议来做扩展的,就是显示扩展.
-m 扩展名称模块
multiport:多端口匹配
--sposrts:源端口
--dports:目标端口
--ports:
iprange:指定IP范围
[!] --src-range from
[!] --dst-range from
time: 指定时间范围
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --weekdays day[,day...]
tring: 字符串匹配
--algo {bm|kmp}:字符匹配查找时使用算法
--string "STRING": 要查找的字符串
connlimit: 每IP对指定服务的最大并发连接数;
[!] --connlimit-above [n]
limit: 报文速率控制,一般在INPUT阶段控制
--limit #[/second|/minute|/hour|/day]
--limit-burst #
state: 状态匹配
ip_conntrack, nf_conntrack
--state
NEW:新建立的连接
ESTABLISHED:建立连接后,只要会话没超时,就是这个状态
RELATED:比如ftp的两条连接,一条命令连接,一条数据连接的关系
INVALID:就是无效的,比如6个标志位全1的
对于每一个和主机相连的会话,在主机内都有一个连接追踪表,记录每一条被防火墙匹配到的一进一出的会话的关联状态,每一条关联关系的表都有一个倒计时器,当计时器返回为0,就会把这个条目清除出去,如果在返回0之前,该条目一直在访问,就刷新该计时器的时间,任何连接在访问之前都会先查询这张表,如果有条目就是ESTABLISHED,如果没有条目就是NEW,如果有条目,但是和条目本身没有关系,与条目连接的另一条连接有关系,就是RELATED,如果请求的报文6个标志位全为1或全为0的就是INVALID,但是这个链表的内存非常小,只要内存满了就拒绝服务,所以此功能虽强大,但是不建议开启,就算开启,也要加大此内存.
3:TCP的有限状态机(这里简单说说,不熟悉的去补补吧)
第一次握手:SYN=1,ACK=0,FIN=0
第二次握手:SYN=1,ACK=1,FIN=0
第三次握手:SYN=0,ACK=1,FIN=0
3.1状态:
客户端 | 服务器 | 状态 |
Close | Listen | 初始状态 |
syn_sent | syn_rcvd | 三次握手 |
established | established | 连接状态 |
4.Iptables命令
4.1新增链
iptables -t filter -N mychain #-N:新增一条链表iptables -t filter -L -n #查看链表Chain INPUT (policy ACCEPT) #系统链是policyREJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT)target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)target prot opt source destination Chain mychain (0 references) #增加了一条mychain的链,自定义链名为references,为引用target prot opt source destination
iptables -X mychain #删除mychain的链iptables -t filter -L -n #查看链,可以看到已经不存在了Chain INPUT (policy ACCEPT)target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT)target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)target prot opt source
4.3:修改链的默认策略
iptables [-t table] -P chain target #改变表的默认规则,就是我们前面提到的通和堵iptables -t filter -P FORWARD DROP #改变filter表中的forward链的默认规则,可以看到意见改变了iptables -t filter -L -n #查看链表Chain INPUT (policy ACCEPT)target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHEDChain FORWARD (policy DROP)target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)target prot opt source destination
4.4:iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
-L: list,列出表中的所有规则-n: 数字格式显示IP和Port #这是-L的子选项-v: 以详细格式显示 #这是-L的子选项-vv:更详细的格式显示 #这是-L的子选项-vvv:更更详细的格式显示 #这是-L的子选项-x:精确显示bytes的值 #这是-L的子选项--line-numbers:显示各规则的行号 #这是-L的子选项 iptables -t filter -L -n -v #示例命令Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 1413 106K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0pkts: packets, 被本规则所匹配到的报文的个数;bytes: 被本规则所匹配到的所有报文的大小之和,会执行单位换算;target: 目标,即处理机制;prot: 协议,一般为{TCP|UDP|ICMP};opt: 可选项in: 数据包的流入接口;out: 数据包的流出接口;source: 源地址;destination: 目标地址; -F: 清空链中的规则,规则有编号,在链中自上而下,从1开始-Z:zero,清零,把pkts和bytes清零
4.5:iptables [-t table] {-A|-D} chain rule-specification
-A:append追加一条规则# iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.251.209 -j ACCEPT# -t 指定表 -A增加 指定链 -s源网域 -d目标主机 -j处理方式 允许通过整句的意思就是:增加一条记录到filter表INPUT链中,允许所有来自172.16.0.0/16网域的主机与172.16.251.209通信# iptables -tfilter -L -n -vChain INPUT (policy ACCEPT 16 packets, 2998 bytes) pkts bytes target prot opt in out source destination 66 4616 ACCEPT all -- * * 172.16.0.0/16 172.16.251.209-D:删除一条规则-D chain rulenum-I:插入规则
4.6:保存iptables的配置信息
默认如果修改完配置信息不保存,重启服务后,之前的配置信息会消失
service iptables save# service iptables saveiptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
4.7:如果想保存配置文件到默认的文件
# iptables-save > /path/to/somewhere #使用输出重定向保存特定位置# iptables-restore < /path/to/somewhere #使用输入重定向读取配置文件
5.练习题
5.1:数据报文只能从eth0这块网卡进来
#iptables -A INPUT -i eth0 -d 172.16.251.209 -j ACCEPT# iptables -L -n -vChain INPUT (policy ACCEPT 12 packets, 2436 bytes) pkts bytes target prot opt in out source 0 0 ACCEPT all -- eth0 * 0.0.0.0/0 172.16.251.209
5.2:数据报文只能从eth0这块网卡出去,注意和上面的对比
# iptables -A OUTPUT -o eth0 -s 172.16.251.209 -j ACCEPT# iptables -L -n -vChain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 22 2168 ACCEPT all -- * eth0 172.16.251.209 0.0.0.0/05.3:shuju b
5.3:数据报文从eth0口进入,并且协议为tcp协议的
# iptables -A INPUT -i eth0 -d 172.16.251.209 -p tcp -j ACCEPT# iptables -L -n -vChain INPUT (policy ACCEPT 8 packets, 1124 bytes) pkts bytes target prot opt in out source destination 36 2376 ACCEPT tcp -- eth0 * 0.0.0.0/0 172.16.251.209
5.4:不允许数据报文从eth0口ping进来
#iptables -A INPUT -i eth0 -d 172.16.251.209 -p icmp -j DROP# iptables -L -n -vChain INPUT (policy ACCEPT 92 packets, 6491 bytes) pkts bytes target prot opt in out source destination 4 240 DROP icmp -- eth0 * 0.0.0.0/0 172.16.251.209
5.5:放行来至172.16.0.0/16网络的主机对本机的ssh服务的请求,因为是放行,所以是一进一出,请注意
#iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.251.209 -p -tcp --dport 22 -j ACCEPT# iptables -t filter -A OUTPUT -s 172.16.251.209 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEP# iptables -L -n -vChain INPUT (policy ACCEPT 47 packets, 4974 bytes) pkts bytes target prot opt in out source destination 390 26420 ACCEPT tcp -- * * 172.16.0.0/16 172.16.251.209 tcp dpt:22Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 38 5360 ACCEPT tcp -- * * 172.16.251.209 172.16.0.0/16 tcp spt:22
5.6:改变filter的默认规则为DROP
# iptables -P INPUT DROP #INPUT为DROP# iptables -P OUTPUT DROP #OUTPUT为DROP# iptables -P FORWARD DROP #FORWARD为DROP# iptables -L-n -v# iptables -L -n -vChain INPUT (policy DROP 8 packets, 1040 bytes) pkts bytes target prot opt in out source destination 643 44404 ACCEPT tcp -- * * 172.16.0.0/16 172.16.251.209 tcp dpt:22Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 195 21360 ACCEPT tcp -- * * 172.16.251.209 172.16.0.0/16 tcp spt:22
5.7:允许本机到本机的通信,5.6中改变默认策略后,本机ping本机是ping不通的(127.0.0.1)
# iptables -A INPUT -i lo -j ACCEPT #添加本机入口# iptables -A OUTPUT -o lo -j ACCEPT #添加本机出口
5.8:禁止广播探测本网络主机在线情况
iptables -A INPUT -d 255.255.255.255 -p icmp -j DROPiptables -A INPUT -d 172.16.255.255 -p icmp -j DROP5.9:qing
5.9:清除不正常报文,参照2.7和3提到的
iptables -A INPUT -p tcp --flags ALL ALL -j DROP #标志位全1的丢弃,全1肯定是不正常的包iptables -A INPUT -p tcp --flags ALL NONE -j DROP #标志位全0的丢弃,全0肯定是不正常的包不明白的去看看tcp的相关知识,以及上面2.7和3提到的内容6.0:放行本机的tftp武夫
6.0:放行本机的tftp服务
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p udp --dport 69 -j ACCEPTiptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p udp --sport 69 -j ACCEPT
6.1:放行本机的DNS服务,这个有点特别,要注意
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p udp --dport 53 -j ACCEPT #允许别人来查询iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p udp --sport 53 -j ACCEPT #响应别人的查询iptables -A OUTPUT -s 172.16.100.7 -p udp --dport 53 -j ACCEPT #去查询别的DNS服务器iptables -A INPUT -d 172.16.100.7 -p udp --sport 53 -j ACCEPT #允许别的DNS服务器响应iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 53 -j ACCEPT #允许别人来查询iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 53 -j ACCEPT #响应别人的查询iptables -A OUTPUT -s 172.16.100.7 -p tcp --dport 53 -j ACCEPT #去查询别的DNS服务器iptables -A INPUT -d 172.16.100.7 -p tcp --sport 53 -j ACCEPT #允许别的DNS服务器响应
6.2:允许ping其他主机,参照2.7的icmp
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT #允许请求报文出去iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT #允许响应报文进来
6.3:删除规则,参照4.5
iptables -D INPUT 2 #删除filter表中INPUT链中的第二条规则
6.4:插入规则,替换规则,显示规则
iptables -I INPUT 2 -i lo -j ACCEPT #在filter表中INPUT链中的第二条的位置插入一条数据,如果不指明位置,就在第一条插入iptables -R INPUT 1 -s 172.16.0.0/16 -d 172.16.100.7 -i eth0 --dport 22 -j ACCEPT #替换filter表中INPUT链中的第一条规则iptables -S INPUT #显示INPUT链中的所有规则,如果不加INPUT,则显示filter表中的所有规则
6.5:开放本机的22号端口和80号端口,显示扩展,参照2.8
iptables -A INPUT -d 172.16.251.209 -p tcp -m multiport --dports 22,80 -j ACCEPT #允许数据报文进入22号端口和80端口iptables -A OUTPUT -s 172.16.100.7 -p tcp -m multiposr --sports 22,80 -j ACCEPY #允许数据报文从22号端口和80号端口出去
6.6:放行ip地址段
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPTiptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
6.7:指定时间放行指定服务
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPTiptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 901 -j ACCEPT
6.8:如果字符串中匹配到hello的就丢弃
iptables -A OUTPUT -s 172.16.251.209 -p tcp --sports 80 --algo kmp --string "hello" -j DROP #对web页面只要匹配到响应hello的字符串就丢弃
6.9:对80端口并发数大于5的IP不予响应
iptables -I INPUT -d 172.16.251.209 -p tcp --dport 80 -m connlimit --connlimit-above 5 -j DROP
6.10:对响应的ping请求每秒不得超过2个,峰值不能超过5个
iptables -A INPUT -d 172.16.251.209 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -j ACCEPT #
6.11:仅允许NEW和ESTABLISHED状态的报文进出本机
iptables -A INPUT -d 172.16.251.209 -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT #进允许NEW和ESTABLISHED状态的报文从eth0口进入本机iptables -A OUTPUT -s 172.16.251.209 -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT #本机是服务器,不会去主动联系客户端,所以不放行NEW状态的6.12:zi
6.12:自定义清理链
iptables -t filter -N clean_in #创建一条新链iptables -A clean_in -d 172.16.251.209 -p tcp --tcp-flags ALL ALL -j DROP #标志位全1的报文丢弃iptables -A clean_in -d 172.16.251.209 -p tcp --tcp-flags ALL NONE -j DROP #标志位全0的报文丢弃iptables -A clean_in -d 172.16.255.255 -p ICMP -j DROP #广播报文丢弃iptables -A clean_in -d 255.255.255.255 -p ICMP -j DROP #广播报文丢弃iptables -A clean_in -d 172.16.251.209 -j RETURN #正常的报文RETURNiptables -I INPUT -d 172.16.251.209 -j clean_in #所有到达本机的报文先送给clean_in清理一遍
6.13:放行本机的ftp服务
iptables -A INPUT -d 172.16.251.209 -p tcp --dport 21 -j ACCEPTiptables -A OUTPUT -s 172.16.251.209 -p tcp --sport 21 -j ACCEPTiptables -A INPUT -d 172.16.251.209 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -A OUTPUT -s 172.16.251.209 -p tcp -m state --state ESTABLISHED注意:ftp需要装载模块才能生效:ip_nat_ftp,ip_conntrack_ftp这两个模块...
6.14:写完了....看不懂吧...没事..我也看不懂