Iptables与Firewalld

Iptables防火墙

介绍

iptables和netfilter是一套Linux防火墙工具,共同合作完成系统防护工作。iptables 是一个包过滤防火墙,可以对包进行封装、过滤、重定向或者网络地址转换、地址伪装、透明代理、访问控制、连接跟踪等功能,iptables是一个免费开源的软件,工作在用户空间;底层是netfilter,工作在内核空间,是内核的一部分。iptables 在用户空间的插入、修改、删除等操作最终都会作用到netfilter,netfilter 触发相应的回调函数(hook 机制)执行相应的防护动作。

分类

iptables根据保护范围可分为主机防火墙(Filter)和网络防火墙(Nat)

四表(table)五链(chain)

四表:

  • Filter:iptables默认表;负责过滤数据包;内核模块iptable_filter
  • Nat:负责网络地址转换;内核模块iptable_nat
  • Mangle:负责修改数据包头部信息;内核模块iptables_mangle
  • Raw:负责对数据包进行状态跟踪;内核模块iptables_raw

五链:

  • INPUT:负责处理进来的数据包
  • OUTPUT:负责处理出去的数据包
  • FORWARD:负责转发数据包
  • PREROUTING:负责目标地址转换
  • POSTROUTING:负责源地址转换

表链关系

Filter:INPUT、FORWARD、OUTPUT

Nat:PREROUTING、POSTROUTING、OUTPUT

Mangle:INPUT、FORWARD、OUTPUT、PREROUTING、POSTROUTING、OUTPUT

Raw:PREROUTING、OUTPUT

表应用顺序

Raw>>>Mangle>>>Nat>>>Filter

链应用顺序

  • 入站数据

如访问自身Web服务流量。先经过PREROUTING链处理(是否修改数据包地址),再进行路由选择,接着经过INPUT链(是否允许通过)到达程序

  • 转发数据

如经过网关的流量。先经过PREROUTING链处理,再路由选择,接着经过FORWARD链(是否转发或丢弃),然后经过POSTROUTING链(是否修改数据包地址)

  • 出站数据

如自身访问外部的流量。先经过OUTPUT链处理,接着经过POSTROUTING链

规则

管理员预先设定的条件,iptables根据定义的条件来处理数据包

命令

iptable  -t  表名   选项   链名   匹配条件   -j 动作

表:即四表

选项

-P 设置默认策略:iptables -P INPUT (DROP
-L 查看规则链
-F 清空规则链
-I 在规则链的前面加入新规则
-A 在规则链的末尾加入新规则
-D 删除某一条规则
-R 替换某条规则

匹配条件

-s IP/MASK 匹配源地址
-d IP/MASK 匹配目标地址
-i 网卡名 匹配从指定网卡流入的数据
-o 网卡名 匹配从指定网卡流出的数据
-p 匹配协议,如TCP、UDP、ICMP
--dport 端口号 匹配目标端口号
--sport 端口号 匹配来源端口号

动作

ACCEPT 放行数据包,进行完此处理动作后,不再对比其它规则,直接跳往下一个规则链
REJECT 拦截数据包,并传送数据包通知对方可以传送的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。

DROP

丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。 这个功能可以用来实作通透式porxy 或用来保护 web 服务器。
MASQUERADE 改写数据包来源 IP为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨号连接时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。
LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其规则
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则
DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼
MIRROR 镜像数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包送回,进行完此处理动作后,将会中断过滤程序
QUEUE 中断过滤程序,将数据包放入队列,交给其它程序处理
RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤
MARK 将数据包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则

配置

#安装iptables
[root@wenzi ~]#yum -y install iptables-services
[root@wenzi ~]#rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service
/usr/libexec/initscripts/legacy-actions/ip6tables
/usr/libexec/initscripts/legacy-actions/ip6tables/panic
/usr/libexec/initscripts/legacy-actions/ip6tables/save
/usr/libexec/initscripts/legacy-actions/iptables
/usr/libexec/initscripts/legacy-actions/iptables/panic
/usr/libexec/initscripts/legacy-actions/iptables/save
/usr/libexec/iptables
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init

[root@m01 ~]# rpm -ql iptables 
/usr/sbin/iptables           
/usr/sbin/iptables-save      
/usr/sbin/iptables-restore

iptables配置文件:/etc/sysconfig/iptables

iptables服务配置文件:/usr/lib/systemd/system/iptables.service

iptables命令:/usr/sbin/iptables

iptables规则:/usr/sbin/iptables-save

恢复:/usr/sbin/iptables-restore

FIrewalld防火墙

内核模块:netfilter

RHEL6中是iptables,RHEL7中是firewalld

区域zone

介绍

过滤规则的集合。每个zone单独对应一个xml配置文件,位于/usr/lib/firewalld/services目录。自定义zone需要新建 zone名.xml文件,然后向其中添加规则。每个zone都有一个默认的处理行为,包括default、ACCEPT、REJECT、DROP

类型

firewalld 将网卡对应到不同的区域zone;最终一个区域的安全程度取决于管理员在此区域中设置的规则;可以根据网络规模,使用一个或多个区域,但是任何一个活跃区域至少需要关联源地址或接口

trusted(信任区域) 允许所有网络流量连接,即使没有开放任何服务,那么使用此 zone 的流量照样通过
public(公共区域) 默认的 zone,部分公开,不信任网络中其他计算机,只放行特定服务
external(外部区域) 允许与 ssh 预定义的服务传入流量,其余均拒绝。默认将通过此区域转发的 IPv4 传出流量进行地址伪装,可用于为路由器启用了伪装功能的外部网络
home(家庭区域) 允许与 ssh、ipp-client、mdns、samba-client 或 dhcpv6-client 预定义的服务传入流量,其余均拒绝
internal(内部区域) 默认值时与 home 区域相同
work(工作区域) 允许与 ssh、ipp-client、dhcpv6-client 预定义的服务传入流量,其余均拒绝
dmz(隔离区域也称为非军事区域) 允许与 ssh 预定义的服务传入流量,其余均拒绝
block(限制区域) 任何流入的包都被拒绝,返回 icmp-host-prohibited 报文(ipv4)或 icmp6-adm-prohibited 报文(ipv6)。只允许由该系统初始化的网络连接
drop(丢弃区域) 任何流入的包都被丢弃,不做任何响应,只允许流出的数据包

常用的firewall-cmd命令选项

  • firewall-config    使用图形界面
  • --reload    重新加载配置,修改 firewalld 配置后需执行此命令
  • --get-default-zone    显示当前默认区域
  • --set-default-zone=    设置默认区域,= 后面跟区域
  • --get-active-zones    显示当前正在使用的区域及其对应的网卡接口
  • --get-zones    显示所有可用的区域
  • --get-zone-of-interface=    显示指定接口绑定的区域,= 后面跟网口
  • --zone= --add-interface=    为指定接口绑定区域
  • --zone= --change-interface=    为指定的区域更改绑定的网络接口
  • --zone= --remove-interface=    为指定的区域删除绑定的网络接口
  • --get-zone-of-source=[/]    显示指定源地址绑定的区域
  • --zone= --add-source=[/]    为指定源地址绑定区域
  • --zone= --change-source=[/]    为指定的区域更改绑定的源地址
  • --zone= --remove-source=[/]    为指定的区域删除绑定的源地址
  • --list-all-zones    显示所有区域及其规则
  • --zone= --list-all    显示所有指定区域的所有规则,省略 --zone= 时表示仅对默认区域操作
  • --zone= --list-services    显示指定区域内允许访问的所有服务
  • --zone= --add-service=    为指定区域设置允许访问的某项服务
  • --zone= --remove-service=    删除指定区域已设置的允许访问的某项服务
  • --zone= --list-ports    显示指定区域内允许访问的所有端口号
  • --zone= --add-port=[端口号]/[协议名]    为指定区域设置允许访问的某个或某段端口号(包括协议名)
  • --zone= --remove-port=[端口号]/[协议名]    删除指定区域已设置的允许访问的端口号(包括协议名)
  • --zone= --list-icmp-blocks    显示指定区域内拒绝访问的所有 ICMP 类型
  • --zone= --add-icmp-block=    为指定区域设置拒绝访问的某项 ICMP 类型
  • --zone= --remove-icmp-block=    删除指定区域已设置的拒绝访问的某项 ICMP 类型
  • firewall-cmd --get-icmptypes    显示所有 ICMP 类型

实验

web服务器 192.168.29.141     客户端 192.168.29.1

#检查firewalld是否开启
[root@wenzi ~]#systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2023-07-09 04:22:46 CST; 6s ago
     Docs: man:firewalld(1)
 Main PID: 1483 (firewalld)
    Tasks: 2 (limit: 4840)
   Memory: 30.0M
   CGroup: /system.slice/firewalld.service
           └─1483 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
#安装httpd
[root@wenzi ~]#yum -y install httpd
[root@wenzi ~]#systemctl start httpd.service 
[root@wenzi ~]#systemctl status httpd.service 
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2023-07-09 04:25:00 CST; 36s ago
     Docs: man:httpd.service(8)
 Main PID: 2076 (httpd)
   Status: "Running, listening on: port 80"
    Tasks: 213 (limit: 4840)
   Memory: 33.5M
   CGroup: /system.slice/httpd.service
           ├─2076 /usr/sbin/httpd -DFOREGROUND
           ├─2078 /usr/sbin/httpd -DFOREGROUND
           ├─2079 /usr/sbin/httpd -DFOREGROUND
           ├─2080 /usr/sbin/httpd -DFOREGROUND
           └─2081 /usr/sbin/httpd -DFOREGROUND

#查看当前默认区域
[root@wenzi ~]#firewall-cmd --get-default-zone 
public
#查看所有可用区域
[root@wenzi ~]#firewall-cmd --get-zones 
block dmz drop external home internal public trusted work
#查看当前正在使用的区域及对应的网卡接口
[root@wenzi ~]#firewall-cmd --get-active-zones 
public
  interfaces: ens160

使用客户端访问web服务,无法访问主页

方式一、将使用的区域设定为trusted

[root@wenzi ~]#firewall-cmd --set-default-zone=trusted 
success
[root@wenzi ~]#firewall-cmd --reload 
success
[root@wenzi ~]#firewall-cmd --get-active-zones 
trusted
  interfaces: ens160

客户端再次访问,访问成功 

方式二、放行80端口

#查看已放行端口
[root@wenzi ~]#firewall-cmd --list-ports 

#查看public中规则
[root@wenzi ~]#firewall-cmd --zone=public --list-all 
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
#放行80端口
[root@wenzi ~]#firewall-cmd --zone=public --add-port=80/tcp --permanent 
success
[root@wenzi ~]#firewall-cmd --reload 
success
[root@wenzi ~]#firewall-cmd --zone=public --list-all 
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 80/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

客户端再次访问,访问成功

三、放行http服务

[root@wenzi ~]#firewall-cmd --zone=public --add-service=http --permanent 
success
[root@wenzi ~]#firewall-cmd --reload 
success
[root@wenzi ~]#firewall-cmd --zone=public --list-all 
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client http ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

客户端再次访问,访问成功

猜你喜欢

转载自blog.csdn.net/qq_40875048/article/details/131564607
今日推荐