防火墙iptables和firewall-cmd

防火墙iptables和firewall-cmd

防火墙是通过定义一些有序的规则,并管理进入到网络内的主机数据包的一种机制,更广义的来说,只要能分析与过滤进出我们管理的网络的数据包的数据,就可以称之为防火墙。

防火墙最大的功能就是帮助你限制某些服务的访问来源。这就是为什么搭建服务器的时候有些服务启动不了的原因。
防火墙并不能有效阻挡病毒或者密码程序,且防火墙对来自内部的攻击无能为力

iptables

iptables 是一种软件防火墙,称为数据包过滤软件。iptables是一种低级工具,他仅能调整IPv4防火墙规则。为保证更完整的防火墙覆盖率,需要使用其他的实用程序,例如用于IPv6的ip6tables和用于软件桥的ebtables

数据包进入流程:规则顺序的重要性
iptables 利用的是分析数据包的报头数据,根据报头数据与定义的规则来决定该数据包是否可以进入主机或者是被丢弃。也就是说,根据数据包的分析资料对比预先定义的规则内容,若数据包与规则内容相同则进行相关动作,否则进入下一条负责的比对。如果对比第一条就成功了,则不会比对后面的规则,所以规则的顺序非常重要。当规则顺序排列错误时,就会产生很严重的错误。

iptables的表格(table)与链(chain)
(三表(filter、NAT、Mangle)五链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING))
iptables里面有多个表格,每个表格定义出自己的默认策略与规则,且每个表格的用途都不一样。

  • Filter(过滤器):主要跟进入linux本机的数据包有关,是默认的table
    INPUT:主要与想进入本机的数据包有关
    OUTPUT:主要与linux本机想要送出的数据包有关
    FORWARD:与linux本机没有关系,它可以传递数据包到后端的计算机中,与NAT的table相关性较高

  • NAT(地址转换,Network Address Translation):这个表格的作用是进行来源于目的地的IP或port转换,与linux本机无关,主要与linux主机后的局域网内的计算机有关
    PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
    POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASOUERADE)
    OUTPUT:与发送出去的数据包有关

  • Mangle (破坏者):这个表格主要是与特殊的数据包的路由标志有关,这个表格与特殊标志相关性较高。

查看iptables

表格定义下面的就是链(chain)
由一条条规则组成。

本机iptables的语法

iptables -t filter  -L  -n 

查看规则
-t :指定table,不使用-t选项,则是默认的filter表格
-L :列出目前的table的规则
-n:不进行IP与hostname的反查,显示信息的速度会快很多

[root@nisa ~]# iptables -t filter -L -n   (-n 以IP形式输出)
Chain INPUT (policy ACCEPT)   <=== 针对INPUT链,默认策略为可接受
target     prot   opt     source               destination
  • target:代表进行的操作,ACCEPT(放行),REJECT(拒绝),DROP(丢弃),LOG(记录日志,继续匹配下一条规则)
  • prot:代表使用的数据包协议,主要有TCP,UDP,ICMP3种
  • opt:额外的选项说明
  • source:代表此规则是针对哪个来源IP进行限制
  • destination:代表此规则是针对哪个目标IP进行限制

iptables-save列出完整的防火墙规则,输出没有格式化

定义默认策略

iptables -t 【filter,nat】 -P【INPUT,OUTPUT,FORWARD】 【ACCEPT,DROP(这里不能使用REJECT)】
这里修改的是 Chain INPUT (policy ACCEPT) 括号里面的默认策略

[root@nisa ~]# iptables -t filter -P INPUT DROP
[root@nisa ~]# iptables -L  
Chain INPUT (policy DROP)  <===设置成了DROP
target     prot    opt      source                destination     

自定义链

添加一个新的链

iptables -N RHCE
iptables -A RHCE -s 172.25.254.122  -j  ACCEPT
iptables -A ACCEPT -j RHCE

清空自定义链

iptables -F  RHCE

DNAT转换

# INBOUND
iptables -t nat -A PREROUTING -p  tcp -d 172.16.1.1  --dport 80  -j DNAT --to-dest  192.128.1.1:8080

# OUTBOUND
iptables -t  nat  -A OUTPUT -p tcp --deport 80 -j DNAT --to-dest  192.128.2.1:3128

SNAT地址伪装

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -t nat -A POSTROUTING -j SNAT  --to-source 1.2.3.45

自定义规则

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

-t<表>:指定要操纵的表;包括:
       filter包过滤,用于防火墙规则,默认
       nat地址转换,用于网关路由器
       mangle数据包修改(QOS),用于实现服务质量
规则链名:
       INPUT:处理输入数据包
       OUTPUT:处理输出数据包
       FORWARD:处理转发数据包
       PREROUTING:用于目标地址转换(DNAT)
       POSTROUTING:用于源地址转换(SNAT)
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-I:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清楚规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;包括:
       accept接收
       drop丢弃
       redirect重定向、映射、透明代理
       snat源地址转换
       dnat目标地址转换
       masquerade IP地址伪装
       log日志记录
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。

清除已有iptables规则

iptables -F
iptables -X
iptables -Z

开放指定的端口

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问

屏蔽IP

iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是

查看已添加的iptables规则

[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination        
33355   16M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0          
1285 77555 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0          
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
  811 47992 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination        
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 35021 packets, 16M bytes)
pkts bytes target     prot opt in     out     source               destination        

删除已添加的iptables规则

将所有iptables以序号标记显示,执行:

iptables -L -n --line-numbers

比如要删除INPUT里序号为8的规则,执行:

iptables -D INPUT 8

特殊的标志

除了端口之外,tcp数据包还有特殊的标志,最常见的就是主动链接的SYN标志,在iptables里面还支持“–syn”的处理方式
例如,将来自任何地方来源port 1到1023端口主动链接到本地端的1到1023端口的链接丢弃

[root@nisa ~]# iptables -A INPUT -i eth0  -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP

iptables的外挂模块:state和mac

iptables -A INPUT 【-m state】【--state 状态】
  • -m:一些外挂模块,主要常见的有state(状态模块),mac(网卡硬件地址)
  • –state:一些数据包的状态,主要有:
    INVALID:无效的数据包,例如破损的数据包状态
    ESTABLISHED:已经建立成功的状态
    NEW:想要新建立连接的数据包状态
    RELATED:这个最常用,表示这个数据包是与主机发送出去的数据包有关

将已经建立或已发出的请求的相关数据包放行

[root@nisa ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

将无效的数据包丢弃

[root@nisa ~]# iptables -A INPUT -m state --state INVALID -j DROP

另外,iptables还可以针对网卡来进行放行与防御

[root@nisa ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j REJECT
  • –mac-source:就是来源主机的mac

mutiport指定多个端口

[root@nisa ~]# iptables -A INPUT -p tcp -m mutiport --dport 1,2,3,4,5 -j REJECT

Firewall防火墙工具

redhat7.0中引入了一种新的与netfilter交互的方法:firewall。该守护进程不仅涵盖了IPv4,IPv6,还能ebtables设置。

redhat7.0中,可以通过三种方式与netfilter交互:
1、直接编辑/etc/firewall/中的配置文件
2、使用firewall-config图形工具
3、firewall-cmd命令行配置

!!!使用firewall-config进行图形化配置时,左上方Configuration是Runtime时,防火墙配置将不会写入配置文件,重启后规则将失效,若想生成永久配置,需要将其勾选成Permanent,配置完成后,需要立即生效的话,需要在Options中进行Reload Firewalld操作。

使用firewall-cmd命令配置防火墙

查看默认区域

[root@nisa ~]# firewall-cmd --get-default-zone 
public

设置默认的区域

[root@nisa ~]# firewall-cmd  --set-defaults-zone=dmz(默认的区域是public)

来自192.168.0.0/24网络的所有流量都被分配给internal区域,而且internal区域上打开了mysql的网络接口

[root@nisa ~]# firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
[root@nisa ~]# firewall-cmd --permanent --zone=internal --add-service=mysql
[root@nisa ~]# firewall-cmd --reload (重新加载,立即生效)
[root@nisa ~]# firewall-cmd --list-all
  public (default, active)
  interfaces: eno16777736    <===接口名
  sources:                        <===源地址
  services: dhcpv6-client nfs ssh     <===预定义的各种服务
  ports:                     <===端口和协议      
  masquerade: no   <===地址伪装,私有的网络地址可以被映射到公开的ip地址,这是一次正规的地址转换
  forward-ports:      <===地址转发,端口可以映射到另一个端口以及/或者其他主机
  icmp-blocks:         <===icmp阻塞
  rich rules:              <===自定义规则

查看接口所属的区域

[root@nisa ~]# firewall-cmd --get-zone-of-interface=eno16777736 
public

添加源地址到internal区域

[root@nisa ~]# firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
success

添加mysql服务

[root@nisa ~]# firewall-cmd --permanent --zone=internal --add-service=mysql
success

添加8080/tcp端口

[root@nisa ~]# firewall-cmd --permanent --add-port=8080/tcp;firewall-cmd --reload
success
success

添加端口转发

firewall-cmd --permanent --add-forward-ports=【port=xx】:【proto=tcp/udp】:【toport=xx】:【toaddr=ip
address】

将22端口的tcp转发到192.168.0.1的32端口

[root@nisa ~]# firewall-cmd --add-forward-port=port=22:proto=tcp:toport=32:toaddr=192.168.0.1
success

添加地址伪装

[root@nisa ~]# firewall-cmd --permanent --add-masquerade 
success

添加icmp阻塞

[root@nisa ~]# firewall-cmd --permanent --add-icmp-block=【有以下一些icmp报文类别】
destination-unreachable  parameter-problem        router-solicitation
echo-reply               redirect                 source-quench
echo-request             router-advertisement     time-exceeded

添加rich rules

[root@nisa ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.1" destination address="192.168.0.2" service name="ssh" log prefix="ssh" level="warning" limit value="1/m" reject'

在 –add-rich-rule= 后面的全部内容要用单引号或双引号全部括起来,各个小项的值也需要用双引号括起来

  • rule family:IP家族,可以使ipv4或ipv6
  • source address:源IP地址,也可以是网段
  • destination address:目标IP地址,也可以是网段
  • service name:服务名
  • log prefix:日志名
  • level:日志级别
  • limit value:日志写入限制,上述定义的是1分钟1次(value后面没有s)
  • reject:操作,也可以是accept,drop

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com