我们需要安装iptables-services,用来启动和停止iptables服务

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,开启iptables

关闭firewalld

systemctl stop firewalld 
systemctl disable firewalld

开启iptables

systemctl start iptables.service
systemctl enable iptables.service

查询配置

iptables -nL

用户请求来的时候,默认先从input链这里一行一行规则往下匹配,如果都没有匹配上了,就走input链后面的小括号里面的规则

清除所有规则,但不会清除默认规则

iptables -F

禁止访问 80 端口(指定端口)

未指定默认是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,访问本服务器指定端口
 

禁止指定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

使用iptables实现禁止ping功能

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

修改默认规则为drop,默认都不接受的做法

在修改默认策略为拒绝时,首先要提前做些准备。比如接受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

添加ip和端口白名单

iptables -A INPUT -p tcp -s 192.168.111.201 --dport 8080 -j ACCEPT

允许 192.168.111.201 访问服务器的8080端口

限速limit

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

tcp头的标志位

握手阶段: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 源端口号

参考:

https://www.cnblogs.com/machangwei-8/p/15978257.html

https://www.cnblogs.com/ip99/p/15313691.html

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐