小白也能看懂的 iptables 防火墙

371 阅读5分钟

一、介绍

iptables是Linux中功能最为强大的防火墙软件之一

image.png

是一个在 Linux 系统上常用的防火墙工具,用于配置和管理网络数据包过滤规则。它可以通过定义规则集来控制进出系统的网络流量,实现网络安全策略

可以定义多种类型的规则,包括过滤、转发、网络地址转换(NAT)、端口转发等。每个规则由一系列匹配条件和对应的动作组成。匹配条件可以包括源/目标 IP 地址、协议、端口等信息。动作可以是接受、拒绝、重定向等。

在centos7 之后,firewalld 防火墙正式取代了 iptables 防火墙,firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,firewalld是iptables的一个封装,可以让你更容易地管理iptables规则。

防火墙的分类:双宿主主机防火墙、基于代理型防火墙和基于屏蔽子网的防火墙

二、参数

iptables [-t tbl] -COMMAND 链名 匹配条件 相应操作 #[-t tbl]为可选参数,-t用来指定具体操作那张表,不指定的话默认是Filter

COMMAND 说明

参数作用
-P设置默认策略
-F清空规则链
-L查看规则链
-A在规则链的末尾加入新规则
-I num在规则链的头部加入新规则
-D num删除某一条规则
-s匹配来源地址IP/MASK,加叹号“!”表示除这个IP外
-d匹配目标地址
-i网卡名称 匹配从这块网卡流入的数据
-o网卡名称 匹配从这块网卡流出的数据
-p匹配协议,如TCP、UDP、ICMP
--dport num匹配目标端口号
--sport num匹配来源端口号
-j执行的操作,例如:REJECT,DROP,ACCEPT

匹配条件

匹配条件用来实现更为精细和具体的条件,如网络接口名称,协议名称,源目的端口号等,高频匹配条件如下:

-i:网络接口名称 #指定数据包从哪个网络接口进入
​
-m:匹配的模块 #指定数据包规则所使用的过滤模块
​
-o:网络接口名称 #指定数据包从哪个网络接口输出
​
-p:协议名称 #指定数据包匹配的协议,如TCP、UDP和ICMP等
​
-s:源地址或子网地址 #指定数据包匹配的源地址
​
-state:数据包当前状态 #指定ESTABLISHED,RELATED等
​
-sport:源端口号 #指定数据包匹配的源端口号
​
-dport:目的端口号 #指定数据包匹配的目的端口号iptables规则的动作

相应操作

对于符合过滤规则或条件的数据包,需要进行相应的操作,如下:

-ACCEPT:接受数据包-DNAT:目标地址转换,即改变数据包的目的地址。例如:将的广域网IP(222.101.98.54/24) ==> 局域网的IP(.1/24),且在NAT表的PREROUTING链上进行该动作-DROP:丢弃数据包-LOG:日志功能,将符合规则的数据包的相关信息记录在日志中,便于分析和排错-MASQUERADE:IP伪装,改写数据包来源IP为防火墙的IP及端口,和SNAT不同的是,当进行IP伪装时,不需指定要伪装成哪个IP,IP会从网卡直接读取-EDIRECT:与DROP基本一样,区别在于它除了阻塞包之外,还向发送者返回错误信息-SNAT:源地址转换,即改变数据包的源地址

三、样例使用

  1. 查看所有规则

    iptables -L -n --line-number

  2. 禁用某个ip的ICMP协议(禁ping)

    iptables -I INPUT -s 172.168.0.1 -p icmp -j DROP

  3. 封禁某个ip

    iptables -I INPUT -s 172.168.0.1 -j DROP

  1. 允许外部访问指定端口(3306)

    sudo iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

  2. 只允许指定 IP 访问指定端口

    需要注意的是,使用iptables时,规则添加的顺序至关重要。

    # 只允许指定ip(192.168.1.123192.168.1.124)访问指定端口(50079)
    # 第一步:在tcp协议中,禁止所有的ip访问本机的50070端口。
    iptables -I INPUT -p tcp --dport 50070 -j DROP
    ​
    # 第二步:允许192.168.1.123访问本机的50070端口
    iptables -I INPUT -s 192.168.1.123 -p tcp --dport 50070 -j ACCEPT
    ​
    # 第三步:允许192.168.1.124访问本机的50070端口
    iptables -I INPUT -s 192.168.1.124 -p tcp --dport 50070 -j ACCEPT
    ​
    # 注意以上3条命令的顺序不能错。
    
  1. 封杀指定网段

    要添加IP段到封停列表中,使用下面的命令:

    sudo iptables -I INPUT -s 192.168.1.0/24 -j DROP  #DROP掉所有来自192.168.1.0网段的数据包
    ​
    sudo iptables -I INPUT -s 123.0.0.0/8 -j DROP      #封整个段即从123.0.0.1123.255.255.254的数据包
    sudo iptables -I INPUT -s 124.45.0.0/16 -j DROP    #封IP段即从123.45.0.1123.45.255.254的数据包
    sudo iptables -I INPUT -s 123.45.6.0/24 -j DROP    #封IP段即从123.45.6.1123.45.6.254的数据包
    
  2. 允许SSH服务

    sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    
  1. 拒绝其它数据包

    需要的端口和协议都开启了,最后就需要iptables绝对拒绝上面规则之外的数据包内容,参考操作如下:

    sudo iptables -A INPUT -j REJECT
    sudo iptables -A FORWARD -j REJECT
    sudo iptables -A OUTPUT -j REJECT
    
  1. 删除某条规则

    # 展示带编号的所有iptables规则
    sudo iptables -L -n --line-number
    ​
    # 对指定编号规则进行删除
    ​
    sudo iptables -D INPUT {num}
    ​
    # 比如要删除INPUT里序号为8的规则,执行:
    ​
    sudo iptables -D INPUT 8
    

    或直接

    iptables -D INPUT -s ***.***.***.*** -j DROP
    

四、总结提高

以上学习了iptables的一些操作,可以封杀部分IP,禁用某个协议,更加详细的操作请看

参考网站

  1. blog.csdn.net/weixin_4656…
  2. www.muouseo.com/topic/z64y9…