赞
踩
yum -y install iptables-services
防火墙配置文件 /etc/sysconfig/iptables
查询开启了那些内核模块
lsmod|egrep 'filter|nat|iptable'
需要加载的模块
- modprobe ip_tables
- modprobe iptable_filter
- modprobe iptable_nat
- modprobe ip_conntrack
- modprobe ip_conntrack_ftp
- modprobe ip_nat_ftp
- modprobe ipt_state
然后再检查下,现在有这些内核模块了
- [root@oradb ~]# lsmod|egrep 'filter|nat|iptable'
- nf_nat_ftp 12809
- nf_conntrack_ftp 18478
- iptable_nat 12875
- nf_nat_ipv4 14115
- nf_nat 26583
- nf_conntrack 139264
- iptable_filter 12810
- ip_tables 27126
- libcrc32c 12644
关闭firewalld
- systemctl stop firewalld
- systemctl disable firewalld
开启iptables
- systemctl start iptables.service
- systemctl enable iptables.service
查询配置
iptables -nL
用户请求来的时候,默认先从input链这里一行一行规则往下匹配,如果都没有匹配上了,就走input链后面的小括号里面的规则
清除所有规则,但不会清除默认规则
iptables -F
未指定默认是filter表了;添加;在input链上;tcp协议,目标端口80;来访问了就drop丢掉
iptables -A INPUT -p tcp --dport 80 -j DROP
--dport 目标端口, -d 目标ip --sport源端口
-A添加规则;INPUT,我要在INPUT链中添加规则。
是需要指定端口还是ip呢,这里是 80 端口,指定端口的话一般要先指定协议(协议一般这里有tcp,udp,icmp,all就是所有),
端口在网络中一般有两种情况,ip也是有两种情况,就是目标端口,源端口,目标ip,源ip,
我这里是禁止访问 80 端口,也就是端口是目标端口,所以--dport 80;
需要禁止访问,那就是 -j DROP ,这个DROP要大写
如果我们只是想清除一条规则,可以先执行
iptables -nL --line-numbers
查看到是第几条链,防止眼睛数错行。
这里是在INPUT链上的第一条规则,然后执行删除这条规则,这里的1就表示第1条规则。
iptables -D INPUT 1
禁止指定ip,访问本服务器指定端口
禁止10.0.0.12访问服务器的80端口
iptables -I INPUT -s 10.0.0.12 -p tcp --dport 80 -j DROP
防火墙四表五链,我们常用的是filter,nat表。我们常用的是filter表的INPUT,FORWARD,OUTPUT链;nat表的PREROUTING,POSTROUTING链,OUTPUT链
指定只能某个网段访问本服务器。(不是指定网段的拒绝掉)
iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
ping使用的是 icmp协议
iptables -I INPUT -p icmp --icmp-type any -j DROP
iptables-save 保存当前防火墙到配置文件中,加上重定向,可以将防火墙规则导入到指定文件中备份起来
iptables-save 会把所有的打印出来,*后面显示表的名字;冒号后是默认的规则,再往下就是我们自己配置的规则
防火墙配置,实际保存的是如下文件中。可以看到和命令查询出来的差不多
cat /etc/sysconfig/iptables
如下保存防火墙规则到 iptRule.txt 文件中。
iptables-save > iptRule.txt
不小心把防火墙都误清除了,因为之前保存到配置里了,重启一下防火墙重新就出来了
- iptables -F
- iptables -nL
- # 这条命令会清空iptables的规则
- systemctl restart iptables.service
iptables-restore无需重启防火墙,可以将备份导出来的防火墙规则,再导入回去
iptables-restore < iptRule.txt
在修改默认策略为拒绝时,首先要提前做些准备。比如接受22端口访问
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
设置本地 lo网卡 通讯规则
- iptables -A INPUT -i lo -j ACCEPT
- iptables -A OUTPUT -o lo -j ACCEPT
这3条规则加好以后,如下图所示:
iptables -nL --line-numbers
开放常用的端口:
-m参数指定扩展模块,通过multiport参数就可以同时指定多个不连续的端口号
iptables -I INPUT -p tcp -m multiport --dport 20,21,22,80,443 -j ACCEPT
修改默认规则
- iptables -P INPUT DROP
- iptables -P FORWARD DROP
- iptables -P OUTPUT ACCEPT
添加 ip 白名单
用who命令查看当前访问者的ip
who
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
- 192.168.111.1/8, 说明它的子网掩码是255.0.0.0, 19开头的ip都可以访问;
- 192.168.111.1/16,说明它的子网掩码是255.255.0.0,192.168开头的ip都可以访问;
- 192.168.111.1/24,说明它的子网掩码是255.255.255.0,192.168.111开头的ip都可以访问;
- 192.168.111.1/32说明它的子网掩码是255.255.255.255,这个说明只能192.168.111.1可以访问。当然192.168.111.1/32可以省略后的/32。
添加 端口 白名单
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.111.201 --dport 8080 -j ACCEPT
允许 192.168.111.201 访问服务器的8080端口
iptables -I INPUT -p tcp --dport 8080 -m limit --limit=500/s --limit-burst=1000 -j ACCEPT
这条规则是:8080端口会对包的速率做匹配,也就是每秒只处理500个包,假如某一时刻进来700个包,只处理500个包,后面ACCEPT表示放行,也就是这500个包放行。
剩下的200个包不做处理,交给下一个规则处理。
初始的burst值是1000,表示刚开始1000个包不受500/s速率限制,当减为0时,就受500/s速率限制。
上面描述可能有问题,应该这样理解,这一条规则看作一个池子,里有1000个令牌,有数据流量进来先从池里取令牌,
取到令牌:根据后面的规则处理,由于是ACCEPT,所以放行允许数据包通过。
未取到令牌(数量为0):不做处理,下一条规则去处理。
假如池子里令牌数量减为0,就会触发--limit 500/s,以每秒500个令牌的速度像池里放令牌。
iptables -A INPUT -p tcp --dport 8080 -j DROP
这条规则是:这是对数据包进行丢弃
--limit 500/s 表示每秒500次; 1/m 则为每分钟一次
--limit-burst 表示允许触发 limit 限制的最大次数 (预设5)
这里的--limit-burst=1000相当于说最开始我有1000的可以匹配的包去处理,然后我匹配的包的个数是根据--limit=500/s进行处理的,
也就是每秒限制500个数据包,多余的会被下面符合要求的DROP规则去处理,去进行丢弃,这样就实现了对数据包的限速问题。
通过对上面的数据分析,可以知道,利用iptables进行限速主要是利用率iptables的limit模块对数据包进行匹配处理,从而实现限速的;
--limit=match,这个是限定了匹配包的速率,
换句话说就是每秒可以转发多少个数据包,这是对iptables做限速的最主要的参数,通过制定它就基本可以确定要控制的限制速率是多少;
--limit-burst是允许触发 limit 限制的最大次数,默认预设是5;
也就是说最开始的5个包会被直接转发,这时burst就会减为0,再来的包就会丢给下一条规则去处理(这里设定是DROP),直到limit参数产生新的令牌,才会继续去匹配转发。
简单来说限速最主要的就是limit和burst,
burst是最初有多少令牌可以去转发包,后面limit会进行按速率匹配,相当于按时间补充令牌数,
第一条规则达到速率上限就会把剩下的包丢给下一条规则去处理,我们下一条和它对应的就是DROP,所以会把剩下的包丢弃,从而实现了限速。
根据端口限速
- iptables -I INPUT -p tcp --dport 8080 -m limit --limit=1/s --limit-burst=1 -j ACCEPT
- iptables -A INPUT -p tcp --dport 8080 -j DROP
- iptables -nL --line-numbers
根据ip限速
- iptables -I INPUT -s 192.168.111.1 -m limit --limit=1/s --limit-burst=1 -j ACCEPT
- iptables -A INPUT -s 192.168.111.1 -j DROP
- iptables -nL --line-numbers
握手阶段:SYN,ACK
传输数据阶段:PSH
挥手阶段:FIN,RST
- #第一次握手,拒绝
- iptables -I INPUT -p tcp -m tcp --dport 8080 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
- 或者
- iptables -I INPUT -p tcp -m tcp --dport 8080 --tcp-flags ALL SYN -j REJECT
-
- #第二次握手,拒绝
- iptables -I OUTPUT -p tcp -m tcp --sport 8080 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
- 或者
- iptables -I OUTPUT -p tcp -m tcp --sport 8080 --tcp-flags ALL SYN,ACK -j REJECT
-
- #第三次握手,拒绝
- iptables -I INPUT -p tcp -m tcp --dport 8080 --tcp-flags SYN,ACK,FIN,RST,URG,PSH ACK -j REJECT
- 或者
- iptables -I INPUT -p tcp -m tcp --dport 8080 --tcp-flags ALL ACK -j REJECT
-
-
-
- #服务端挥手,拒绝
- iptables -I OUTPUT -p tcp -m tcp --sport 8080 --tcp-flags SYN,ACK,FIN,RST,URG,PSH FIN,ACK -j REJECT
- 或者
- iptables -I OUTPUT -p tcp -m tcp --sport 8080 --tcp-flags ALL FIN,ACK -j REJECT
- iptables -I OUTPUT -p tcp -m tcp --sport 8080 --tcp-flags ALL FIN,PSH,ACK -j REJECT

使用wireshark在ssh客户端抓包,跟踪对应的tcp流
上图表示在第1次握手阶段,SYN标识为1,其他标识位如ACK,FIN,RST,URG,PSH都为0。
上图的下方可以看到 [TCP Flags: ··········S·],其中的"S"就表示SYN位,整体表示只有SYN位为1。用点.表示
上图表示在第2次握手阶段,SYN和ACK标识为1,其他标识位如FIN,RST,URG,PSH都为0。
上图的下方可以看到 [TCP Flags: ·······A··S·],表示只有ACK标志位与SYN标志位为1用点.表示0
上图为第3次握手阶段,ACK标识为1,其他标识位如SYN,FIN,RST,URG,PSH都为0。
完整的一个请求过程如下
客户端强制终止,异常标识
按照上面的标识,就可以拦截了,各个阶段的流量了。
- iptables命令的管理控制选项
- -A 在指定链的末尾添加(append)一条新的规则
- -D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
- -I 在指定链中插入(insert)一条新的规则,默认在第一行添加
- -R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
- -L 列出(list)指定链中所有的规则进行查看
- -E 重命名用户定义的链,不改变链本身
- -F 清空(flush)
- -N 新建(new-chain)一条用户自己定义的规则链
- -X 删除指定表中用户自定义的规则链(delete-chain)
- -P 设置指定链的默认策略(policy)
- -Z 将所有表的所有链的字节和数据包计数器清零
- -n 使用数字形式(numeric)显示输出结果
- -v 查看规则表详细信息(verbose)的信息
- -V 查看版本(version)
- -h 获取帮助(help)
-
- -i 进入的网卡名
- -o 出去的网卡名
- -s 源地址IP
- -d 目的地址IP
-
- --dport 目的端口号
- --sdport 源端口号

参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。