iptables
一、基础概念
1、防火墙概念
Firewall:隔离工具;Packets Filter Firewall;工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件;
如果没有防火墙,你的本机的所有端口都会被别人访问到!
2、分类
- 硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现;
5 - 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;
- 主机防火墙:服务范围为当前主机;
- 网络防火墙:服务范围为防火墙被的局域网;
3、防火墙的两个层面 — iptables/netfilter:
netfilter:防火墙框架,framework;位于内核空间;
iptables:命令行工具程序,位于用户空间;规则管理工具;
-
netfilter:防火墙框架
hooks function prerouting 路由之前 input 入栈 forward 转发 output 出栈 postrouting 路由之后
-
iptables:为了驱动内核防火墙框架创造5条链
CHAINS:链 PREROUTING INPUT FORWARD OUTPUT POSTROUTING
4、Linux下防火墙如何实现?
1、iptables,这个只是方便用户编写各类规则交由netfilter处理执行。
2、一部分是基于TCP/IP协议栈的netfilter安全框架,通过“数据报文进入主机,内核处理完成,交由用户空间处理,在由内核处理完成并响应给客户”, 数据报文的处理路径设置了各种规则链,根据规则链的顺序或者特点, 又在规则链中增加功能表,通过在不同的功能表中设置具体的规则,来达到安全访问。
那么netfilter的规则定义是如何来达到安全访问的效果呢?
首先我们应该知道主机之间的通信是数据流,是参考OSI七层模型来包装用户的数据,OSI七层包括了应用层,表示层,会话层,传输层,网络层,数据链路层,物理层,每一层都有其自己的功能,netfilter就是通过识别每一层功能中的数据是否符合我们定义的规则,从而达到监控,修改,丢弃,转发的目录。
–
5、报文流向:
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文:OUTPUT –> POSTROUTING
6、tables:
- filter:过滤,防火墙;
- nat:network address translation,网络地址转换;
- mangle:拆解报文,做出修改,并重新封装;盖戳
- raw:关闭nat表上启用的连接追踪机制;
优先级次序(由高而低):
raw –> mangle –> nat –> filter
功能<–>钩子:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
7、iptables规则的组成部分:
匹配条件:
-
网络层首部:Source IP, Destination IP
-
传输层首部:Source Port, Destination Port
-
扩展检查机制:拓展了可以检查应用层首部,需要指明使用了那些扩展
处理动作:target
- ACCEPT:允许
- DROP :丢弃
- REJECT:拒绝后并回应
二、安装:
1、内核要确保安装netfilter这个协议框架
netfilter:位于内核中的tcp/ip协议栈报文处理框架;对于任何发行版来说这都是必备的功能
2、iptables 工具:
iptables并不是一个服务,它只是内核中的一个功能而已,只要内核在,这个功能就在。我们并不需要启动!虽然我们在centos 6上会用到service但只是用它来加载配置文件的!
CentOS 5/6:iptables命令编写规则;
# iptables -t filter -F
# service iptables save
CentOS 7:firewalld,firewall-cmd, firewall-config
# systemctl disable firewalld
注意:firewalld 我们并不建议使用,因为这只是在redhat这一个分支上使用并不能通用!
由于这个应用,centos7就没有unit file文件,这需要我们自己加载配置的防火墙规则!
程序包:iptables, iptstate
三、iptables命令:
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;
匹配条件:
- 基本匹配条件:源地址,目标地址,传输层协议
- 扩展匹配条件:需要借助于扩展模块进行指定的匹配条件
- 隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;
- 显式扩展:隐式扩展之外的其它扩展匹配条件;
处理动作:
- 基本动作:ACCEPT,DROP,REJECT…
- 扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作;
添加规则时需要考量的问题:
- 报文流经的位置:用于判断将规则添加至哪个链;
- 实现的功能:用于判断将规则添加至哪个表;
- 报文的方向:用于判断哪个为“源”,哪个为“目标”;
- 匹配条件:用于编写能够正确匹配目标报文的规则;
四、iptabls命令的使用格式:
iptables [-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
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
规则管理格式:
iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]
-t table:指明要管理的表; 默认为filter;
iptables [-t table] COMMANDS:
链管理:
-
-P chain target
定义链的默认策略;其target一般可使用ACCEPT或DROP; -
-N chain
自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数; -
-X [chain]
删除自定义的空的引用计数为0的链;如果后边不加名的话就会删除所有符合的自定义链 -
-F [chain [rulenum]] [options…]
清空指定的链,或删除指定链上的规则,不指名就会删除所在表上的所有链 -
-E old-chain-name new-chain-name
重命名自定义的引用计数为0的链; -
-Z [chain [rulenum]] [options…]
清零,置零规则计数器;
规则:
-
-A:append, iptables [-t table] -A chain rule-specification,
追加规则到指定的链尾部; -
-I:insert, iptables [-t table] -I chain [rulenum] rule-specification,
插入规则到指定的链中的指定位置,默认为链首; -
-D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum
删除指定的链上的指定规则;指明规则的条件来删除那条规则,或直接删除规则所对应的额号码 -
-R:replace,iptables [-t table] -R chain rulenum rule-specification,
将指定的链上的指定规则替换为新的规则;
查看:-vnL
-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
-n:数字格式;
-v:verbose,详细格式信息;
-vv, -vvv
--line-numbers:显示链上的规则的编号;
-x:exactly,显示计数器的精确值;
计数器:
每条规则以及链的默认策略分别有各自的两个计数器:
(1) 匹配到的报文的个数:pkts
(2) 匹配到的所有报文的大小之积:bytes
总结
iptables/netfilter
四表:raw, mangle, nat, filter
五链:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
iptables命令:
iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]
COMMANDS:
链管理:-P,-N,-X,-E,-F,-Z
规则管理:-A,-I,-D,-R
查看:-L,-n, -x, -v, --line-numbers
iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]
匹配条件
基本匹配条件
扩展匹配条件
隐式扩展
显式扩展
注意:多重条件之间的隐含逻辑为“与”操作;
1.基本匹配条件:
- [!] -s –source address[/mask][,…]:检查报文中的源IP地址是否符合此处指定的地址或地址范围;
-
[!] -d, –destination address[/mask][,…]:检查报文中的目标IP地址是否符合此处指定的地址或地址范围;
-
[!] -p, –protocol protocol:检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 “all”;
-
[!] -i, –in-interface name:检查报文进入本机时的接口是否符合本处指定的接口;INPUT, FORWARD and PREROUTING ;
-
[!] -o, –out-interface name:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING;
-m, –match match:显式指明要使用的扩展模块;
-j, –jump target:跳转目标;
我们设置防火墙规则时 一般都是要把入栈进程阻断!不过最好INPUT OUTPUT都要阻断最好
练习1.设置防火墙规则为默认禁止所有人访问,只允许自10.1.250.28主机进行访问
练习2、在上提基础上加上允许10.1.0.0/16网络上的主机都能访问但10.1.249.175不能访问
练习3、删除练习1的记录条目两种方法
练习4、仅允许10.1.0.0/16网段对本机(10.1.6.72)tcp开放
2.扩展匹配条件:
隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;
- -p tcp:可直接使用tcp协议对应的扩展选项;
[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;
[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;
[!] --tcp-flags mask(所有标志位) comp(标志位为1)
SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST
comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0;
--tcp-flags SYN,ACK,FIN,RST SYN
[!] --syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN
表示匹配 tcp标志位中的SYN,ACK,FIN,RST,且其中只有SYN为1其他为0的位
TCP握手的第一次,初次连接
- -p udp:可直接使用udp协议对应的扩展选项;
[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;
[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;
- -p icmp:可直接使用icmp协议对应的扩展选项;
[!] --icmp-type {type[/code]|typename}
--icmp-type 0/0:匹配对ping请求的响应报文
--icmp-type 8/0:匹配ping请求报文
例1.:仅开放本机(10.1.6.72)tcp 22号端口给本网段
–
例2、在1的基础上允许别人ping本地主机
例3、在此基础上允许自己ping其他主机
(2)显式扩展:必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;
1、multiport
以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified.
[!] --source-ports,--sports port[,port|,port:port]...‘:’指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...‘:’指定多个目标端口;
[!] --ports port[,port|,port:port]...‘:’匹配此处指定的源或目标端口;
2、iprange
以连续的ip地址范围指明多地址匹配条件;
[!] --src-range from[-to]
[!] --dst-range from[-to]
3、string
对报文中的应用层数据做字符串匹配检测;
[!] --string pattern
[!] --hex-string pattern
--algo {bm|kmp}:字符串匹配检查算法;
--from offset 不检查from之前的字符
--to offset 到达的to字符之后的字符
iptables -I OUTPUT -s 10.1.0.6 -p tcp --sport 80 -m string --string "haha" --algo bm -j REJECT
表示定义到达本机(10.1.0.6)上的tcp 80端口用 bm算法匹配到含有字符为 “haha” 的就拒绝并回
例:服务端对 “haha“字符做了限制
–
客户端也可以对请求的网页做限制
–
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 10.1.6.72 -p tcp –dport 23 -m time –timestart 1600 –timestop 0900 ! –weekdays Sat,Sun -j REJECT
5、connlimit
根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求;
--connlimit-upto n:连接数小于等于阈值;
--connlimit-above n:连接数超出阈值;
~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
单个ip的请求的连接请求大于 2个就REJECT
6、limit
基于收发报文的速率进行匹配;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT
设置令牌桶为3 每分钟20个
7、state *重要
状态检测:连接追踪机制(conntrack)
相当于在连接前建立了一个表,每次连接前都要与这个表中的ip匹配,这张表中的内容会有默认的保存时间! 不要随意打开这个连接追踪器,因为如果访问并发数非常大的话就会导致某些请求相应不了!
NEW:新连接
ESTABLISHED:已建立的连接,
NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态
RELATED:相关联的连接
如ftp协议的命令连接与数据连接之间的关系;
modprobe nf_conntrack_ftp 要先打开这个
INVALID:无法识别的连接
UNTRACKED:未被追踪连接;
[!] --state state
相关的内核模块:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp
-
已经追踪到并记录下的连接:
/proc/net/nf_conntrack
-
能追踪的最大连接数量定义在:
/proc/sys/net/nf_conntrack_max 建议调整至足够大;和内存空间有关系
-
不同的协议的连接追踪时长:
/proc/sys/net/netfilter/ [!] --state state
–
如何开放被动模式的ftp服务:
(1) 装载追踪ftp协议的模块;
# modprobe nf_conntrack_ftp
这个模块是Netfilter专门用来处理FTP这个复杂协议的模块,它能够将FTP的数据包标识为RELATED状态,从而允许使用被动模式访问。
使用命令: modprobe nf_conntrack_ftp 加载该模块,之后客户端就能以被动模式连接至FTP服务器了。
(2) 放行入站命令连接
# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
(3) 放行入站数据连接
# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(4) 放行出站的ESTABLISHED连接
# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
1.处理动作(跳转目标):
-j tagetname [per-target-options]
-
简单target:
ACCEPT,DROP -
扩展target:
REJECT:
–reject-with type
默认为icmp-port-unreachable;
icmp-net-unreachable, 网络不可达
icmp-host-unreachable, 主机不可达
icmp-port-unreachable, 端口不可达
icmp-proto-unreach‐able, 协议不可达
icmp-net-prohibited, 网络被禁止
icmp-host-prohibited, 主机被禁止
icmp-admin-prohibited, 管理禁止
* 表示所有
LOG: 要在拒绝之前使用
Turn on kernel logging of matching packets.
--log-level level
--log-prefix prefix:日志信息的前导信息;
-j LOG --log-prefix prefix "内容表示 日志信息的前缀"
规则优化的思路:
- (1) 优先放行双方向状态为ESTABLISHED的报文;
- (2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
- (3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
- (4) 设置默认策略:白名单机制
- (a) 可使用iptables -P设定默认策略;
- (b) 建议在规则链的最后定义规则做为默认策略;
保存和载入规则:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE 注意默认会清空原有的表!
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不予提交;
注意:重载文件中的规则,会清除已有规则;
CentOS 6:要先要有这个文件
保存规则:service iptables save
保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容;
重载规则:server iptables restart
默认重载/etc/sysconfig/iptables文件中的规则
脚本配置文件:/etc/sysconfig/iptables-config
用于指明要装载的模块;
IPTABLES_MODULES="nf_conntrack_ftp"就会把依赖的模块装载,先要touch 一个/etc/sysconfig/iptables 就能装载此文件了
CentOS 7开机自动生效规则:
(1) firewalld服务;
(2) shell脚本,直接记录iptables命令;
(3) 自定义unit file或init script;
自动生效规则文件中的规则:
把iptables命令放在脚本文件中,让脚本文件开机自动运行
/etc/rc.d/rc.local
iptables-restore < /PATH/TO/SOME_RULE_FILE
或者此文件内写上脚本的路径 /usr/bin/iptables.sh
练习:
基于状态放行telnet, ftp, ssh, http, samba, icmp等服务;
- (1) 对本机的ping请求每分钟不得超出20个;
- (2) 每客户端对本机的ssh的并发连接数不得超过3个;
- (3) 本机的telnet服务仅允许工作时间内访问;
iptables -I INPUT -d 10.1.6.72 -p icmp --icmp-type 8 -m limit --limit-burst 1 --limit 20/minute
设置对本机的ping请求不超过20/min
~]# iptables -I INPUT -d 10.1.6.72 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
设置22端口 ssh的连接数不能大于3个
iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --weekdays Sat,Sun --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
设置周六周天拒绝telnet服务
iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --timestart 10:00:00 --timestop 00:00:00 --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
设置非工作时间禁止使用telnet
iptables -A INPUT -d 10.1.6.72 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
设置允许RELATED ESTABLISHED
~]# iptables -A INPUT -d 10.1.6.72 -p tcp -m multiport --dport 21:23,80,139,445 -m state --state NEW -j ACCEPT
设置对21:22:80:139:445第一次请求不限制
iptables -A INPUT -d 10.1.6.72 -p udp -m multiport --dport 138,139 -m state --state NEW -j ACCEPT
设置对138,139号udp端口的第一次相应不限制
iptables -A INPUT -d 10.1.6.72/32 -j REJECT
禁止其他对端口的访问
iptables -A OUTPUT -s 10.1.6.72 -p udp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 10.1.6.72 -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 10.1.6.72 -p icmp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 10.1.6.72/32 -j REJECT
原创文章,作者:qzx,如若转载,请注明出处:http://www.178linux.com/54715