Iptables(一):Linux防火墙基础与iptables命令
简介:
防火墙(Firewall);工作于主机或网络边缘,对于进出的报文根据定义的规则作检查,进而对被规则匹配到的报文作为相应处理的套件;
主机防火墙:工作在一个主机的边缘;
网络防火墙:工作在网络边缘;
按照实现方法可分为软件防火墙和硬件防火墙,纯硬件防火墙是很少的,大部分防火墙设备都是由设备中依靠软件搭配实现的;
按照工作位置可分为网络层防火墙和应用层网关;
Linux防火墙:iptables/netfilter;
iptables:规则生成器;运行于用户空间的应用软件,用于编写生成规则,并自动发往netfilter,立即生效;
netfilter:网络过滤器;在linux内核中的软件框架,用于管理网络数据包,接收并生效规则;
iptables/netfilter的表、链结构:
netfilter在内核空间定义了5个钩子函数(hook function,即5链),控制数据包的走向,进入x本机用户控件交由本机应用处理,或经由本机转发,5链分别为:
1、PREROUTING:路由前
2、INPUT:到达本机内部的报文必经之路
3、OUTPUT:由本机发出的报文的必经之路
4、FORWARD:由本机转发的报文必经之路
5、POSTROUTING:路由后
iptables可定义4种规则(即4表),分别实现的功能:
filter:包过滤,定义是否允许通过防火墙
nat:地址转换,启用connection_track;
SNAT:源地址转换
DNAT:目标地址转换
PNAT:端口转换
mangle:对数据包进行修改
raw:目标是关闭nat表上启用的连接追踪功能;
4表的优先级:raw > mangle > nat > filter
4表和5链的对应关系:
filter:INPUT,FORWARD,OUTPUT
nat:PREROUTING(SNAT),POSTROUTING(DNAT),OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw:PREROUTING,OUTPUT
数据报文流程:
跟本机内部进程通信:
进入:--> PREROUTING --> INPUT -->
出去:--> OUTPUT --> POSTROUTING -->
由本机转发:
请求:--> PREROUTING --> FORWARD --> POSTROUTING
响应:--> PREROUTING --> FORWARD --> POSTROUIING
数据报文的流向:
规则中如果限定源地址,目标地址,源端口,目标端口,等与流向相关的设定;源IP和目标IP由流向决定;
iptables命令:
/etc/rc.d/init.d/iptables \\:启动脚本:
/etc/sysconfig/iptables \\:规则文件;
保存启用中的规则与规则文件中:
1、# iptables-save > /etc/sysconfig/iptables
2、# service iptables save
生效规则文件中的规则:
执行的操作:清空现有规则,读取并生效规则文件中的规则;
1、# iptables-restore < /etc/sysconfig/iptables
2、# service iptables restart
开机自动启动:读取并生效规则文件中的规则;
chkconfig iptables on
基本语法:
# iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
命令结构简介:
-t TABLE:指定表,表为filter、nat、mangle、raw,默认为filter;
-j处理目标:
内置目标:
ACCEPT:允许
REJECT:拒绝,并通知对方;不建议使用;
DENY:拒绝,委婉式拒绝
DROP:丢弃
SNAT:源地址转换
DNAT:目标地址转换
自定义的链:
COMMAND:
链:
-F:Flush,清空规则链
-N:New,自建一条链
-X:delete,删除一条自定义的空链
-E:rEname,重命名自定义链
-Z:Zero,计数器归零
-P:Policy,设置默认策略;对filter表来讲,默认规则为ACCEPT或DROP;
链中的规则管理:
-A:Append,在链的尾部附加一条规则;
-I:Insert,插入一条新规则
-D:Delete,删除规则
-R:Replace,替换规则
-L:List,查询;
子选项:
-n:Numeric,数字格式显示主机地址和端口;
--line-numbers:显示规则编号
-x:eXactly,不要对计数器的计数结果做单位换算,而显示其精确值
-v:详细格式,-vv,-vvv
pkts bytes target prot opt in out source destination
包数 字节数 目标 协议 流入的接口 流出的接口 源地址 目标地址
CRETIRIA,匹配条件: 通用匹配:
-s ADDRESS:指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;可使用!取反;同--src,--source;
-d ADDRESS:指定报文目标IP地址匹配的范围;同--dst,--destination
-p PROTOCOL:指定匹配报文的协议类型,一般有三种tcp,udp和icmp;
-i INTERFACE:数据报文流入的接口;PREROUTING,INPUT,FORWARD
-o INTERFACE:数据报文流出的接口;OUTPUT,FORWARD,POSTROUITING
扩展匹配: 隐式扩展:
当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;
-p tcp [-m tcp]:
子选项:
--sport PORT[-PORT]:指定源端口
--dport PORT[-PORT]:指定目标端口
--tcp-flags:要检查标志位列表(用逗号分隔),必须为1的标志位列表(逗号分隔)
all none
例如:
--tcp-flags syn,ack,rst,fin syn,相当于--syn
-p udp [-m udp]:
子选项:
--sport
--dport
-p icmp [-m icmp]:
子选项:
--icmp-type
0:echo-reply,ping响应
8:echo-request,ping请求
扩展匹配之隐式匹配示例:
通常防火墙默认策略应为丢弃,以白名单的方式放行被允许的链接;
注意:通常运维工作中大部分情况都是通过ssh客户端远程连接服务器进行管理,所以在设置默认连接为丢弃之前要先设置放行ssh(默认为22/tcp端口)服务;同样在删除ssh相关的设置或清空设置前要先将默认策略修改为允许;
服务器IP:192.168.1.7
1、允许服务器所在网络的所有主机访问服务器的ssh服务,并将默认策略修改为DROP;
[root@node3 ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.7 -p tcp --dport 22 -j ACCEPT
[root@node3 ~]# iptables -A OUTPUT -s 192.168.1.7 -d 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT
[root@node3 ~]# iptables -P INPUT DROP
[root@node3 ~]# iptables -P OUTPUT DROP
2、允许本机ping外部主机;
[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p icmp --icmp-type 0 -j ACCEPT
[root@node3 ~]# iptables -A OUTPUT -s 192.168.1.7 -p icmp --icmp-type 8 -j ACCEPT
3、仅允许192.168.1.6主机ping通服务器的eth1接口;
[root@node3 ~]# iptables -A INPUT -i eth1 -s 192.168.1.6 -d 192.168.1.7 -p icmp --icmp-type 8 -j ACCEPT
[root@node3 ~]# iptables -A OUTPUT -o eth1 -s 192.168.1.7 -d 192.168.1.6 -p icmp --icmp-type 0 -j ACCEPT
4、允许本机通过外部dns服务器解析域名,添加为第二条规则;
[root@node3 ~]# iptables -I INPUT 2 -d 192.168.1.7 -p udp --sport 53 -j ACCEPT
[root@node3 ~]# iptables -I OUTPUT 2 -s 192.168.1.7 -p udp --dport 53 -j ACCEPT
5、查看当前配置,并保存当前配置;
[root@node3 ~]# iptables -L -n -v
Chain INPUT (policy DROP 119 packets, 11100 bytes)
pkts bytes target prot opt in out source destination
1640 120K ACCEPT tcp -- * * 192.168.1.0/24 192.168.1.7 tcp dpt:22
0 0 ACCEPT udp -- * * 0.0.0.0/0 192.168.1.7 udp spt:53
4 336 ACCEPT icmp -- * * 0.0.0.0/0 192.168.1.7 icmp type 0
0 0 ACCEPT icmp -- eth1 * 192.168.1.6 192.168.1.7 icmp type 8
Chain FORWARD (policy ACCEPT 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
1129 131K ACCEPT tcp -- * * 192.168.1.7 192.168.1.0/24 tcp spt:22
0 0 ACCEPT udp -- * * 192.168.1.7 0.0.0.0/0 udp dpt:53
4 336 ACCEPT icmp -- * * 192.168.1.7 0.0.0.0/0 icmp type 8
0 0 ACCEPT icmp -- * eth1 192.168.1.7 192.168.1.6 icmp type 0
[root@node3 ~]# service iptables save
iptables:将防火墙规则保存到 /etc/sysconfig/iptables: [确定]
[root@node3 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Wed Jan 13 23:53:15 2016
*filter
:INPUT DROP [2456:219373]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [100:7280]
-A INPUT -s 192.168.1.0/24 -d 192.168.1.7/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -d 192.168.1.7/32 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -d 192.168.1.7/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -s 192.168.1.6/32 -d 192.168.1.7/32 -i eth1 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -s 192.168.1.7/32 -d 192.168.1.0/24 -p tcp -m tcp --sport 22 -j ACCEPT
-A OUTPUT -s 192.168.1.7/32 -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -s 192.168.1.7/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -s 192.168.1.7/32 -d 192.168.1.6/32 -o eth1 -p icmp -m icmp --icmp-type 0 -j ACCEPT
COMMIT
6、清空当前配置,注意清空前默认策略设置为放行;
[root@node3 ~]# iptables -P INPUT ACCEPT
[root@node3 ~]# iptables -P OUTPUT ACCEPT
[root@node3 ~]# iptables –F
[root@node3 ~]# iptables -Z
显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;
-m 扩展模块名称:
multiport:多端口匹配;可用于匹配非连续或连续端口,最多指定15个端口;
专用选项:离散,连续:
[!] --source-ports,--sports port[,port,port:port]
[!] --destination-ports,--dports port[,port,port:port]
--ports:指定源端口和目标端口;
示例:允许服务器所在网络所有主机访问主机的ssh和web服务;
[root@node3 ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.7 -p tcp -m multiport --dport 22,80 -j ACCEPT
[root@node3 ~]# iptables -A OUTPUT -s 192.168.1.7 -d 192.168.1.0/24 -p tcp -m multiport --sport 22,80 -j ACCEPT
iprange:匹配指定范围内的地址;匹配一段连续的地址而非整个网络时有用;
专用选项:
[!] --src-ragne IP[-IP]
[!] --dst-range IP[-IP]
示例:允许服务器ssh服务开放给192.168.1.1-192.168.1.100访问;
[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p tcp --dport 22 -m iprange --src-range 192.168.1.1-192.168.1.100 -j ACCEPT
[root@node3 ~]# iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 22 -m iprange --dst-range 192.168.1.1-192.168.1.100 -j ACCEPT
string:字符串匹配,能够检测报文应用层中的字符串;字符匹配检查高效算法:kmp,bm;
专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;
示例:禁止包含有“sex”的报文进入服务器;
[root@node3 ~]# iptables -I INPUT -m string --algo kmp --string "sex" -j DROP
time:基于时间做访问控制
专用选项:
--datestart
--datestop
YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]...
Mon, Tue,
示例:禁止工作时间(工作日的09:00-17:00)访问服务器的web资源;
[root@node3 ~]# iptables -I INPUT -d 192.168.1.7 -p tcp --dport 80 -m time --timestart 09:00 --timestop 17:00 --weekdays Mon,Tue,Wed,Thu,Fri -j REJECT
connlimit:连接数限制,对每IP所能够发起并发连接数做限制;
专用选项:
[!] --connlimit-above [n]
示例:允许服务器ssh服务最大2个连接;
[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
limit:速率限制
专用选项:
--limit n[/second|/minute|/hour|/day]
--limit-burst n
示例:限制ping往本机的请求包数量为每分钟20个,最大通过包数为5个;
[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
state:状态检查
专用选项:
--state
连接追踪中的状态:
NEW:新建立一个会话
ESTABLISHED:已建立的连接
RELATED:有关联关系的连接
INVALID:无法识别的连接
注意:
整连接追踪功能所能容纳的连接的最大数目:
/proc/sys/net/nf_conntrack_max
当前追踪的所有连接:
/proc/net/nf_conntrack
不同协议或连接类型追踪时的属性:
/proc/sys/net/netfilter目录:
法则:
1、对于进入的状态为ESTABLISHED都应该放行;
2、对于出去的状态为ESTABLISHED都应该放行;
3、严格检查进入的状态为NEW的连接;
4、所有状态为INVALIED都应该拒绝;
示例:特殊应用:放行被动模式下的FTP服务:
1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
[root@node3 ~]# modprobe nf_conntrack_ftp
[root@node3 ~]# modprobe nf_nat_ftp
[root@node3 ~]# modprobe nf_conntrack
2、放行请求报文:
1)放行NEW状态对21端口请求的报文;
[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p tcp --dport 21 -m state --state NEW -j ACCEPT
2) 放行ESTABLISHED以及RELATED状态的报文
[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p tcp --dport 21 -m state --state RELATED,ESTABLISHED -j ACCEPT
3、旅行响应报文:放行ESTABLISHED以及RELATED状态的报文
[root@node3 ~]# iptables -A OUTPUT -s 192.168.1.7 -p tcp --sport 21 -m state --state RELATED,ESTABLISHED -j ACCEPT