netfilter、iptables、firewalld的关系:

iptables服务和firewalld服务都不是真正的防火墙,只是用来定义防火墙规则功能的管理工具,将定义好的规则交由内核中的netfilter(网络过滤器来读取)从而实现真正的防火墙功能。

关系如图:(iptables/firewalld管理工具都是通过iptables命令来管理防火墙netfilter)
在这里插入图片描述

在centos7以上的版本中使用firewalld服务替代了iptables服务,但是依然可以使用iptables来管理防火墙netfilter,为了避免冲突使用iptables之前需要先关闭firewalld

关闭firewalld:

[root@linux ~]# systemctl stop firewalld.service 

禁止开机启动firewalld:

[root@linux ~]# systemctl disable firewalld.service 

安装iptables服务管理工具:

[root@linux ~]# yum -y install iptables-services

设置开机启动iptables:

[root@linux ~]# systemctl enable iptables.service 

启动iptables:

[root@linux ~]# systemctl start iptables.service 

netfilter 5表5链:

filter 表用于过滤数据包,有INPUT丶FORWARD丶OUTPUT三个链
nat 表用于网络地址转换,有PREROUTING丶OUTPUT丶POSTROUTING三个链
mangle 表用于给数据包做标记
raw 表可以实现不追踪某些数据包
security 表在centos7中才出现,用于强制访问控制(MAC)的网络规则

最常用的5链:INPUT丶FORWARD丶OUTPUT、PREROUTING丶POSTROUTING

iptables数据包的传输过程:

在这里插入图片描述

1.当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
2.如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
3.如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

查看iptables规则:

[root@linux ~]# iptables -nvL

查看iptables规则配置文件:

[root@linux ~]# cat /etc/sysconfig/iptables

清空iptables规则:

[root@linux ~]# iptables -F

*清空后使用 iptables -nvL会看到规则已经被清空,但 /etc/sysconfig/iptables文件中规则配置还在,需要执行 service iptables save 才能使配置文件生效

计数器清零:

[root@linux ~]# iptables -Z

*iptables -nvL的输出信息中,第一列代表数据包的数量,第二列代表数据大小,在有需要时,可以使用 -Z参数清零从新计算

filter表的应用:

iptables添加防火墙规则:

[root@linux ~]# iptables -A INPUT -p tcp -s 192.168.1.100  --sport 80 -d 192.168.1.200 --dport 80 -j DROP

可根据实际需求自由选择参数设置规则:

-A :append (在现有规则后面补充/添加一条)
-I:insert (在规则最前面插入一条)
INPUT:指定链
-p:protocol 指定请求的协议(tcp、udp、icmp等)
-s:source 源地址
–sport :原地址的端口(如不指定,则默认所有端口)
-d:目标地址
–dport:目标地址的端口
-i:指定网卡名
-j:控制类型(ACCEPT:允许通过,LOG:记录日志信息,然后传给下一条规则继续匹配,
REJECT:拒绝通过,必要时会给出提示,DROP:直接丢弃,不给出任何回应)
-P:给指定的链设置默认策略:iptables -P INPUT (DROP|ACCEPT)
-i:网卡名称(匹配从这块网卡流入的数据,一般用于NAT表)
-o:网卡名称(匹配从这块网卡流出的数据,一般用于NAT表)

iptables删除一条规则:-D参数

1.将添加规则的语句中的-A改为-D即可

2.根据规则表行号删除:

[root@linux ~]# iptables -L INPUT --line-numbers  #列出INPUT链的所有规则和行号

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere            
3    ACCEPT     all  --  anywhere             anywhere            
4    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
5    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
6    DROP       tcp  --  192.168.1.100        192.168.1.200        tcp spt:http dpt:http

删除指定行即可:

[root@linux ~]# iptables -D INPUT 6

注意:
1.在添加规则后,会立即生效,但添加的内容还未写进配置文件 /etc/sysconfig/iptables中,重启iptables服务就会失效,如需永久生效,在做完变更后,执行 service iptables save即可

2.在删除规则时,需注意规则是否写入配置文件中,如没有,直接删除即可,如写入了配置文件中,删除后需执行 service iptables save 才能避免在重启iptables服务后恢复删除了的规则

案例补充:
禁止别人ping本机:

iptables -I INPUT -p icmp --icmp-type 8 -j DROP

脚本:

#! /bin/bash
ipt="/usr/sbin/iptables"
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT	
$ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT  

*禁止所有 INPUT网络包,只打开80、21端口和192.168.133.0网段的22端口

NAT表的应用: (Network AddressTranslation网络地址转换)

数据包在局域网中的传输步骤:

  1. 先经过NAT表的PREROUTING 链

  2. 路由判断是否是发送给本机的包,如不是则转发出去(前提是要开启路由转发)

  3. 再经过Filter表的FORWARD 链

  4. 通过NAT表的POSTROUTING 链发出去

NAT的重点在于上面流程的第 1/4 步骤,也就是 NAT表的两条重要的链:PREROUTING 与POSTROUTING。 这两条链重要功能在于修改IP,而这两条链修改的IP又是不一样的,POSTROUTING在修改来源IP,PREROUTING则在修改目标IP 。由于修改的 IP 不一样,所以就称为来源NAT (Source NAT, SNAT) 及目标 NAT (Destination NAT, DNAT)。

SNAT:源地址转换,能够让多个内网用户通过一个外网地址上网
DNAT:目标地址转换,能够让外网用户访问局域网的内网地址

应用案例:

A机器有两块网卡,分别是外网网卡eth1(192.168.234.130)和内网网卡eth2(192.168.0.10),B机器有一块内网网卡eth2(192.168.0.20),A与B机器可以通过内网进行通信。

需求一(SNAT):让B机器能连接外网
1.在A机器上打开路由转发:echo “1”>/proc/sys/net/ipv4/ip_forward
2.在A机器上添加nat表规则: iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE
3.在B机器上设置网关 route add default gw 192.168.0.10即可

#该操作相当于将A机器当做路由器,转发局域网到外网中的数据包

需求二(DNAT):C机器只能和A通信,让C机器可以直接连通B机器的22端口
1.在A机器上打开路由转发echo “1”>/ proc/sys/net/ipv4/ip_forward
2.在A机器上添加nat表规则:iptables -t nat -A PREROUTING -d 192.168.234.130 -p tcp --dport 1122 -j DNAT --to 192.168.0.20:22
3.在A机器上添加nat表规则:iptables -t nat -A POSTROUTING -s 192.168.0.20 -j SNAT --to 192.168.234.130
4.在B机器上设置网关 route add default gw 192.168.0.10即可

#A、B可以看做两台虚拟机,C为Windows主机,C能与A通信,却不能与B通信,通过A做端口映射,C访问A机器的1122端口时就转向B机器的22端口

iptables规则备份和恢复:

备份:(将规则保存到指定文件)

[root@linux ~]# iptables-save > /tmp/ipt.bak

恢复:

[root@linux ~]# iptables-restore < /tmp/ipt.bak 

firewalld:

禁用iptables:

[root@linux ~]# systemctl stop iptables.service 

[root@linux ~]# systemctl disable iptables.service 
Removed symlink /etc/systemd/system/basic.target.wants/iptables.service.

启用firewalld并设置开机启动:

[root@linux ~]# systemctl start firewalld.service 

[root@linux ~]# systemctl enable firewalld.service 
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.

firewalld有9个zone,每个zone可以看作一个规则集,每个规则集的内容都不同,默认的zone是public

查看所有zone:

[root@linux ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

查看默认zone:

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

设置默认的zone:

[root@linux ~]# firewall-cmd --set-default-zone=work
success
[root@linux ~]# firewall-cmd --get-default-zone 
work

查看指定网卡的zone:

[root@linux ~]# firewall-cmd --get-zone-of-interface=ens33
public

对于没有zone的网卡,可以手动添加:

[root@linux ~]# firewall-cmd --get-zone-of-interface=lo
no zone
[root@linux ~]# firewall-cmd --zone=public --add-interface=lo
success
[root@linux ~]# firewall-cmd --get-zone-of-interface=lo
public

更改指定网卡的zone:

[root@linux ~]# firewall-cmd --zone=work --change-interface=lo
success
[root@linux ~]# firewall-cmd --get-zone-of-interface=lo
work

删除指定网卡的zone:

[root@linux ~]# firewall-cmd --zone=work --remove-interface=lo
success
[root@linux ~]# firewall-cmd --get-zone-of-interface=lo
no zone

查看所有网卡所在的zone:

[root@linux ~]# firewall-cmd --get-active-zones 
public
  interfaces: ens33

查看所有zone包含的service:

[root@linux ~]# firewall-cmd --get-services

查看当前zone中的service:

[root@linux ~]# firewall-cmd --list-services 
ssh dhcpv6-client

查看指定zone中的service:

[root@linux ~]# firewall-cmd --zone=work --list-services 

添加service到当前zone:

[root@linux ~]# firewall-cmd --add-service=http --permanent 
[root@linux ~]# firewall-cmd --list-services 
ssh dhcpv6-client http

添加service到指定zone:

[root@linux ~]# firewall-cmd --zone=work --add-service=http --permanent 
success
[root@linux ~]# firewall-cmd --zone=work --list-services 
ssh dhcpv6-client

查看zone的配置文件:

[root@linux ~]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <service name="http"/>   #刚添加的http已显示
</zone>

#在给zone添加service时,不加 -permanent 参数添加的service存在内存中,重启服务失效,如需永久有些,加上 -permanent 参数新增的service才会写入配置文件

zone配置模板路径:

[root@linux zones]# ls /usr/lib/firewalld/zones
block.xml  dmz.xml  drop.xml  external.xml  home.xml  internal.xml  public.xml  trusted.xml  work.xml

service配置模板路径:

cd /usr/lib/firewalld/services/

#该目录下的每个文件都包含了对应的每个服务的名称、协议、端口号

案例:

需求:自定义ftp服务端口为2121,work zone下面放行ftp

1.拷贝service配置模板到 /etc/firewalld/services/目录下:

[root@linux ~]# cp /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services/

2.更改配置模板中端口号port为2121:

[root@linux ~]# cat /etc/firewalld/services/ftp.xml 
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>FTP</short>
  <description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
  <port protocol="tcp" port="2121"/>
  <module name="nf_conntrack_ftp"/>
</service>

3.拷贝work模板到 /etc/firewalld/zones/目录下:

[root@linux ~]# cp /usr/lib/firewalld/zones/work.xml /etc/firewalld/zones/

4.添加ftp服务:

[root@linux ~]# vi /etc/firewalld/zones/work.xml 
[root@linux ~]# cat !$
cat /etc/firewalld/zones/work.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Work</short>
  <description>For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <service name="ftp"/>
</zone>

5.重新加载:

[root@linux ~]# firewall-cmd --reload 
success

6.查看work zone 的service:

[root@linux ~]# firewall-cmd --zone=work --list-services 
ssh dhcpv6-client ftp    

关闭selinux:

查看selinux状态:

[root@linux ~]# getenforce 
Enforcing

临时关闭:

[root@linux ~]# setenforce 0
[root@linux ~]# getenforce 
Permissive

永久关闭selinux:(禁止开机启动)
1.编辑配置文件:/etc/selinux/config

[root@linux ~]# vi /etc/selinux/config 

2.修改SELINUX配置项的值为disabled

SELINUX=disabled

重启后即可生效

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐