linux防火墙详解(iptables、firewalld)
一、防火墙防火墙基本概念
-
防火墙技术根据管理员设定的规则来控制数据包的进出。主要保护内网安全
-
Linux的防火墙分为两种,iptables和firewall
-
iptables静态防火墙
- 早期的Linux默认使用iptables防火墙,配置文件在/etc/sysconfig/iptables。主要工作在网络层
- 该防火墙只能过滤互联网的数据包,无法对内网到内网进行过滤
- iptables只有命令模式
- iptables默认允许,通过添加拒绝来限制
- iptables修改规则后刷新才能生效。无法守护进程
-
firewall动态防火墙
- 取代了iptabels防火墙,配置文件在/usr/lib/firewalld和/etc/firewalld主要工作在网络层
- 不仅可以过滤互联网数据包,也可以过滤内网数据包
- firewalld支持命令和图形化配置
- firewalld默认为拒绝所有
- firewalld可以动态更新策略,(允许更新策略而不破环现有会话)
-
注意:iptables和firewalld不是真正的防火墙,是指用来定义防火墙规则功能的“防火墙管理工具/程序”,将定义好的规则交给内核的netfiler即网络过滤器来读取,从而实现防火墙的功能。
![img]()
- 在配置防火墙时,不建议两种配置方法结合使用(建议只使用其中的一种)
二、iptables讲解
-
iptables配置防火墙依靠四个部分实现:表、规则链、规则(匹配条件)、控制类组成;该防火墙使用链式规则
-
iptables的四表
-
raw表
raw表常用于控制数据包的状态跟踪。它允许管理员决定是否对某个数据包是否进行状态跟踪,从而优化性能或者防止特定的攻击。
-
mangle表
修改数据包内容;可以做流量整形、对数据包设置标记(包含所有规则链)
-
nat表
负责地址转换功能;修改数据包中的源目IP地址或端口(包含IN、OU、PR、PO三个规则链)
-
filter表
负责过滤数据包(防火墙核心功能);对数据包时允许放行还是不允许放行(包含IN、OU、FO三个规则链)
-
-
iptables的五规则链
-
什么是规则链
由很多规则组成一个规则链,规则从上到下匹配。匹配到则再不向下匹配,并且执行相应控制动作。如果都无匹配到,则执行该规则链的默认控制类型。
-
规则链类型
INPUT 处理入站的数据包(处理目标是本机的数据包)
OUTPUT 处理出站的数据包(处理源是本机的数据包,一般不在此链上做规则)
PREROUTING 在进行路由选择前处理数据包(一般用来做NAT Server)
POSTROUTING 在进行路由选择后处理数据包(一般用来做源NAT)
FORWARD 处理转发的数据包(处理经过本机的数据包)
![img]()
![img]()
-
-
iptables控制类型
ACCEPT 允许数据包通过
DROP 丢弃数据包(不给对方回应,一般工作时用这个)
REJCET 拒绝数据包通过(会给对方回应,对方知道自己被拒绝)
SNAT 修改数据包的源地址
DNAT 修改数据包的目的地址
MASQUERADE 伪装程一个非固定的公网IP地址
LOG 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
-
iptables命令配置
-
配置防火墙服务
#查看防火墙的服务 chkconfig --list | grep iptables #永久关闭防火墙 chkconfig iptables off #永久开启防火墙 chkconfig iptables on -
systemctl基本命令
#查看防火墙的状态 systemctl status iptables.service #停止防火墙 systemctl stop iptables.service #启动防火墙 systemctl start iptables.service #重启防火墙 systemctl restart iptables.service #重载防火墙等价于restart systemctl reload iptables.service #禁止开机启动防火墙 systemctl disable iptables.service #开机启动防火墙 systemctl enable iptables.service -
service基本命令
#查看防火墙状态 service iptables status #启动防火墙 service iptables start #停止防火墙 service iptables stop #重启防火墙 service iptables restart #尝试重启防火墙 service iptables try-restart #重载防火墙 service iptables reload #强制重载防火墙 service iptables force-reload -
查看iptable各表的内容
# iptables -t mangle --list # iptables -t raw --list # iptables -t nat --list # iptables -t filter --list or # iptables --list 注意:如果不指定-t选项,就只会显示默认的filter表以下例子表明在filter表的input链, forward链, output链中存在规则:
root@server ~]# iptables --list -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 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 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-proh Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-proh Chain OUTPUT (policy ACCEPT) target prot opt source destinationtarget – 前面提到的target的特殊值
prot – 协议:tcp, udp, icmp等
source – 数据包的源IP地址
destination – 数据包的目标IP地址 -
清空所有iptables规则
iptabels --flushnat规则需要再次手动清理
iptables -t NAT -F
-
-
iptables描述规则的基本参数
- -p 协议(protocol)
- 指规则协议,如tcp、udp、icmp,可以用all来代替所有
- 如果不指定-p,默认为所有。
- -s 源地址(source)
- 指定数据包的源地址
- 参数可以使用IP、网络地址、主机名
- 例如:-s 192.168.1.101指定IP地址
- 例如:-s 192.168.1.10/24指定网络地址
- 如果不指定-s参数,就代表所有地址
- -d 目的地址(destination)
- 指定目的地址
- 参数和 -s相同
- -j 执行目标(jump to target)
-j代表”jump to target”-j指定了当与规则(Rule)匹配时如何处理数据包- 可能的值是
ACCEPT,DROP,QUEUE,RETURN - 还可以指定其他链(Chain)作为目标
- -i 输入接口(input interface)
-i指定了要处理来自哪个接口的数据包- 这些数据包即将进入
INPUT,FORWARD,PREROUTE链 - 例如:
-i eth0指定了要处理经由eth0进入的数据包 - 如果不指定
-i参数,那么将处理进入所有接口的数据包 - 如果出现!
-i eth0,那么将处理所有经由eth0以外的接口进入的数据包 - 如果出现
-i eth+,那么将处理所有经由eth开头的接口进入的数据包 - 还可以使用
–in-interface参数
- -o 输出(out interface)
- -o指定了数据包由哪个接口输出
- 这些数据包即将进入
FORWARD,OUTPUT,POSTROUTING链 - 如果不指定
-o选项,那么系统上的所有接口都可以作为输出接口
-m state: 启用状态匹配模块(state matching module)–-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED
- –-sport 源端口(source port)针对 -p tcp 或者 -p udp
- 缺省情况下,将匹配所有端口
- 可以指定端口号或者端口名称,例如
–sport 22与–sport ssh。 /etc/services文件描述了上述映射关系。- 从性能上讲,使用端口号更好
- 使用冒号可以匹配端口范围,如
–sport 22:100 - 还可以使用
–source-port
- --dport 目的端口(destination port)针对-p tcp 或者 -p udp
- 参数和-spot类似
- --icmp-type ICMP类型 针对-p icmp
–icmp-type 0表示Echo Reply–icmp-type 8表示Echo
- -p 协议(protocol)
-
配置案例
-
仅允许SSH服务
iptables -F ##清空所有iptables规则 iptables -A INPUT -i eth0 -p tcp -dport 22 -j ACCEPT iptables -A INPUT -j DROP -
屏蔽指定ip
BLOCK_THIS_IP="x.x.x.x" iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
-
三、firewalld讲解
-
firewalld概念
firewalld是服务名,firewall-cmd(命令行)和firewall-config(图形化)是配置文件的名称。
-
firewalld区域的概念
- Trust 信任区 :允许所有流量通过
- Public 公共区 :仅接受ssh、dhcpv6-client服务连接(默认区域)
- External 外部区域:仅允许接收ssh服务连接(默认通过此区域转发的IPv4流量将会进行地址伪装)
- Home 家庭区域:仅接受ssh、msdns、ipp-client、samba-client、dhcpv6-client服务网络连接
- Internal 内部区域:同home区域
- work 工作区 :仅接受ssh、ipp-client、dhcpv6-client服务连接
- Dmz 隔离区(非军事区) 仅接受ssh服务连接
- Block 限制区域 :拒绝所有传入的流量
- drop 丢弃区:丢弃所有传入的流量
-
firewalld两种配置方法
-
临时配置(runtime 当前生效表)
立即生效,重启后失效
不会中断现有的连接
无法修改服务配置
-
永久配置(permanent 永久生效表)
不立即生效,重启后生效,或者立即同步后生效
会中断现有连接
可以修改服务配置
-
-
firewall-cmd命令行基础配置
-
如何实现配置永久生效
--permanent 表示此配置加入到永久生效(默认临时生效)
或者在配置结束后执行此命令 firewall-cmd --runtime-to-permanent将临时更改为永久
永久配置完成后需要立即同步 firewall-cmd --reload 立即同步永久配置
-
查看默认区域并且进行更改
firewall-cmd --get-zones 查询可用的区域
[root@server ~]# firewall-cmd --get-zones block dmz drop external home internal public trusted workfirewall-cmd --get-default-zone 查询目前默认的区域
[root@server ~]# firewall-cmd --get-default-zone publicfirewall-cmd --get-active-zone 显示当前正在使用的区域和网卡名称
[root@server ~]# firewall-cmd --get-active-zones public interfaces: eth0 eth1firewall-cmd --set-default-zone=trusted 设置默认区域为trusted区域
[root@server ~]# firewall-cmd --set-default-zone=trusted success -
将网卡/子网与区域进行绑定(允许/拒绝此子网通过)
firewall-cmd --zone=drop --add-source=192.168.20.0/24 #子网绑定 firewall-cmd --zone=drop --change-interface=eth2 #接口绑定 -
配置允许/拒绝的协议/端口号
firewall-cmd --list-all 显示当前区域的端口号、网卡、服务等信息 --list-all-zones 显示所有区域的 firewall-cmd --get-services 列举出来当前所有被允许的协议 firewall-cmd --zone=public --add-service http ##允许http --remove-service ssh ##拒绝ssh --add-port=123/tcp ##允许tcp端口的123 --remove-port=123/tcp ##拒绝tcp端口的123 -
配置目的nat(使用firewalld)
-
开启ip转发,P 转发是 NAT 的基础,它允许 Linux 内核将数据包从一个网络接口转发到另一个网络接口。
临时开启:
echo 1 > /proc/sys/net/ipv4/ip_forward永久开启:
sudo nano /etc/sysctl.conf net.ipv4.ip_forward = 1 sudo sysctl -p -
firewalld配置
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.10.10:toport=8080 --permanent- port=80 :外部访问的端口。
- proto=tcp :协议类型。
- toaddr=192.168.10.10 :目标服务器的 IP 地址
- toport=8080 :目标服务器的端口
-
重新加载防火墙即可实现
-
-



浙公网安备 33010602011771号