当前位置:   article > 正文

iptables使用详解(centos7)_centos7 iptables

centos7 iptables

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

yum -y install iptables-services

防火墙配置文件 /etc/sysconfig/iptables

查询开启了那些内核模块

lsmod|egrep 'filter|nat|iptable'

需要加载的模块

  1. modprobe ip_tables
  2. modprobe iptable_filter
  3. modprobe iptable_nat
  4. modprobe ip_conntrack
  5. modprobe ip_conntrack_ftp
  6. modprobe ip_nat_ftp
  7. modprobe ipt_state

然后再检查下,现在有这些内核模块了

  1. [root@oradb ~]# lsmod|egrep 'filter|nat|iptable'
  2. nf_nat_ftp 12809
  3. nf_conntrack_ftp 18478
  4. iptable_nat 12875
  5. nf_nat_ipv4 14115
  6. nf_nat 26583
  7. nf_conntrack 139264
  8. iptable_filter 12810
  9. ip_tables 27126
  10. libcrc32c 12644

关闭firewalld,开启iptables

关闭firewalld

  1. systemctl stop firewalld
  2. systemctl disable firewalld

开启iptables

  1. systemctl start iptables.service
  2. 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

不小心把防火墙都误清除了,因为之前保存到配置里了,重启一下防火墙重新就出来了

  1. iptables -F
  2. iptables -nL
  1. # 这条命令会清空iptables的规则
  2. systemctl restart iptables.service

iptables-restore无需重启防火墙,可以将备份导出来的防火墙规则,再导入回去

iptables-restore < iptRule.txt

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

在修改默认策略为拒绝时,首先要提前做些准备。比如接受22端口访问

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

设置本地 lo网卡 通讯规则

  1. iptables -A INPUT -i lo -j ACCEPT
  2. 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

修改默认规则

  1. iptables -P INPUT DROP
  2. iptables -P FORWARD DROP 
  3. iptables -P OUTPUT ACCEPT

 添加 ip 白名单

用who命令查看当前访问者的ip

who
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
  1. 192.168.111.1/8, 说明它的子网掩码是255.0.0.019开头的ip都可以访问;
  2. 192.168.111.1/16,说明它的子网掩码是255.255.0.0192.168开头的ip都可以访问;
  3. 192.168.111.1/24,说明它的子网掩码是255.255.255.0192.168.111开头的ip都可以访问;
  4. 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,所以会把剩下的包丢弃,从而实现了限速。

根据端口限速

  1. iptables -I INPUT -p tcp --dport 8080 -m limit --limit=1/s --limit-burst=1 -j ACCEPT
  2. iptables -A INPUT -p tcp --dport 8080 -j DROP
  3. iptables -nL --line-numbers

 根据ip限速

  1. iptables -I INPUT -s 192.168.111.1 -m limit --limit=1/s --limit-burst=1 -j ACCEPT
  2. iptables -A INPUT -s 192.168.111.1 -j DROP
  3. iptables -nL --line-numbers

tcp头的标志位

握手阶段:SYN,ACK
传输数据阶段:PSH
挥手阶段:FIN,RST

  1. #第一次握手,拒绝
  2. iptables -I INPUT -p tcp -m tcp --dport 8080 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
  3. 或者
  4. iptables -I INPUT -p tcp -m tcp --dport 8080 --tcp-flags ALL SYN -j REJECT
  5. #第二次握手,拒绝
  6. iptables -I OUTPUT -p tcp -m tcp --sport 8080 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
  7. 或者
  8. iptables -I OUTPUT -p tcp -m tcp --sport 8080 --tcp-flags ALL SYN,ACK -j REJECT
  9. #第三次握手,拒绝
  10. iptables -I INPUT -p tcp -m tcp --dport 8080 --tcp-flags SYN,ACK,FIN,RST,URG,PSH ACK -j REJECT
  11. 或者
  12. iptables -I INPUT -p tcp -m tcp --dport 8080 --tcp-flags ALL ACK -j REJECT
  13. #服务端挥手,拒绝
  14. iptables -I OUTPUT -p tcp -m tcp --sport 8080 --tcp-flags SYN,ACK,FIN,RST,URG,PSH FIN,ACK -j REJECT
  15. 或者
  16. iptables -I OUTPUT -p tcp -m tcp --sport 8080 --tcp-flags ALL FIN,ACK -j REJECT
  17. 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。

完整的一个请求过程如下

 客户端强制终止,异常标识

 按照上面的标识,就可以拦截了,各个阶段的流量了。

命令参数

  1. iptables命令的管理控制选项
  2. -A 在指定链的末尾添加(append)一条新的规则
  3. -D  删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
  4. -I  在指定链中插入(insert)一条新的规则,默认在第一行添加
  5. -R  修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
  6. -L  列出(list)指定链中所有的规则进行查看
  7. -E  重命名用户定义的链,不改变链本身
  8. -F  清空(flush)
  9. -N  新建(new-chain)一条用户自己定义的规则链
  10. -X  删除指定表中用户自定义的规则链(delete-chain)
  11. -P  设置指定链的默认策略(policy)
  12. -Z 将所有表的所有链的字节和数据包计数器清零
  13. -n  使用数字形式(numeric)显示输出结果
  14. -v  查看规则表详细信息(verbose)的信息
  15. -V  查看版本(version)
  16. -h  获取帮助(help)
  17. -i 进入的网卡名
  18. -o 出去的网卡名
  19. -s 源地址IP
  20. -d 目的地址IP
  21. --dport 目的端口号
  22. --sdport 源端口号

参考:

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/509281
推荐阅读
相关标签
  

闽ICP备14008679号