安全防护:
对外:防火墙 #包过滤
对内:SELinux
审计:堡垒机、跳板机
防火墙简介
防火墙的核心作用是作为过滤器,对网络数据包进行过滤和处理。它分为内核态和用户态,内核态的模块被称为防火墙函数,负责数据包的转发决策,包括允许、阻拦或修改数据包的行为,从而实现访问控制和安全防护。
防火墙机制
- 阻拦传输 - 白名单 #非开放性服务:ssh、telnet、mysql
- 允许传输 - 黑名单 #开放性服务:apache、ftp
防火墙实现功能
- 保护易受攻击的服务。
- 控制内外网之间网络系统的访问。
- 集中管理内网安全性,降低管理成本。
- 提高网络保密性和私有性。
- 记录网络使用状态,为安全规划和网络维护提供依据。
netfilter/iptables 相关
- netfilter 是内核态模块,位于 Linux 内核中的包过滤功能体系。iptables 是用户态工具,位于 /sbin/iptables,用于管理防火墙规则,管理员通过 iptables 给 netfilter 变更规则实现防火墙作用。
- 不同内核版本对应不同的防火墙工具:
- kernel 2.0.x:ipfw、ipfwadmin。
- kernel 2.2.x:ipchains、ipchains。
- kernel 2.4.x:netfilter、iptables。
- kernel 3.13.x:nftables、nftables>iptables。
- 用户空间:iptables & nftables & firewalld(应用程序)。
- 内核空间:nftables & netfilter。
- nftables 和 netfilter的作用
真正的防火墙函数主要包括nftables 和netfilter。旧版本使用netfilter,新版本使用nftables ,它们是内核中用于过滤数据包的核心函数。其中,nftables相比netfilter更具灵活性,允许用户自定义表和链名称,但实际执行过滤功能的还是依赖于内核中的这些底层函数
防火墙编写要求
- 要可以根据语句一大白话的方式描述出防火墙规则,并能根据需求写出防火墙规则语句
规则表和规则链
问题 防火墙的4表5链是指什么?答案如下
规则表
- raw 表:确定是否对数据包进行状态跟踪。
- mangle 表:为数据包设置标记。
- nat 表:修改数据包中的源、目标 IP 地址或端口。(常用)
- filter 表:确定是否放行数据包(过滤)(默认使用表)(常用)。
规则链
PREROUTING链 #路由转发前
INPUT链 #入站
FORWARD链 #路由转发
OUTPUT链 #出站
POSTROUTING链 #路由转发后
规则表和规则链顺序
-
规则表之间顺序:raw—>mangle—>nat—>filter。
-
规则链之间顺序
- 入站:PREROUTING—>INPUT。
- 出站:OUTPUT—>POSTROUTING。
- 转发:PREROUTING—>FORWARD—>POSTROUTING。
-
规则链内匹配顺序:按自上而下顺序依次检查,匹配即停止(LOG 策略例外),若找不到相匹配规则,则按该链的默认策略处理。
数据走向图
命令格式介绍
语法构成
防火墙规则编写: 表 》 链 》策略
命令:iptables | ip6tables
格式:
-t 表名 指定规则表
-A 链名 #追加一条规则
-I 链名 #插入一条规则(可以是首行,也可以是指定行) -I INPUT 5
-D 链名 #删除一条规则,删除指定行的规则
-F 链名 #清空当前生效的防火墙规则,不指定链名时,清空当前表中所有链的规则,指定链名时,清空当前表中指定链的规则。
注意事项
- 不指定表名时,默认指 filter 表。
- 不指定链名时,默认指表内的所有链。
- 除非设置链的默认策略,否则必须指定匹配条件。
- 选项、链名、策略使用大写字母,其余均为小写。
保存和恢复 iptables 规则
- (危险操作)保存规则:service iptables save,保存在 /etc/sysconfig/iptables 文件中的规则会在服务启动或重新启动时(包括机器被重新引导时)被应用,注意 save 保存是覆盖式保存。
- 导出(备份)规则:iptables - save 工具,可结合输出重定向将缓存中的防火墙规则保存到指定文件。
- 导入(还原)规则:iptables - restore 工具,可结合输入重定向将指定文件内的规则重新加载到缓存中。iptables 服务脚本位置:/etc/init.d/iptables(c6),/lib/systemd/system/iptables 规则文件位置:/etc/sysconfig/iptables(要安装iptables-services)。
#使用案例
yum -y install iptables-services
systemctl restart iptables
iptables -L --line-numbers
mount /dev/sr0 /mnt
rpm -ivh --force /mnt/Packages/iptables-services-1.4.21-28.el7.x86_64.rpm #强制升级防火墙命令
vim /etc/sysconfig/iptables
service iptables save
iptables-save > /root/ips.txt
数据包的常见控制类型(策略)
-j 对条件数据包的执行策略
- ACCEPT:允许通过。
- DROP:直接丢弃,不给出任何回应。
- REJECT:拒绝通过,必要时会给出提示。
- LOG:记录日志信息,然后传给下一条规则继续匹配。(不常用)
- SNAT:源地址转换,将符合条件的数据包的源地址进行修改(–to - source ip)。
- MASQUERADE:将数据包的源地址修改为本机的动态公网 IP。(不常用)
- DNAT:目标地址转换,将符合条件的数据包的目标地址进行修改(–to - destination ip:port)。
- REDIRECT:将符合条件的请求转发到本机的指定端口上(–to - ports port)。
规则操作
表 - 链 - 规则
添加规则
- 例如:iptables -t filter -A INPUT -p tcp -j ACCEPT。
- 例如:iptables -I INPUT -p udp -j ACCEPT。
- 例如:iptables -I INPUT 2 -p icmp -j ACCEPT。
- 第三个的描述:在filter 表的input链上第二行插入一条规则,对数据包的协议类型做匹配,判断是否是icmp协议。若符合条件则放行规则而放行数据包
查看规则
-
-L #list列出
-n #数字化显示
–line-numbers #显示行号,规则的行号
-v #内容详细程度:查看规则时,显示规则的序号。
- 例如:iptables -nvL INPUT --line - numbers。
删除、清空规则
-
-D:删除链内指定序号(或内容)的一条规则。
-
-F:清空所有的规则(内存中的缓存规则)。
-
-X
:清空自定义链上的规则。
- 例如:iptables -D INPUT 3。
- 例如:iptables -n -L INPUT。
设置默认策略
- -P(大)为指定的链设置默认规则
- 例如:iptables -t filter -P FORWARD DROP。
- 例如:iptables -P OUTPUT ACCEPT。
条件匹配
-
通用匹配(单选项匹配)
:可直接使用,不依赖于其他条件或扩展,包括网络协议、IP 地址、网络接口等条件。
- 协议匹配:-p(小)协议名。
- 地址匹配:-s 源地址、-d 目的地址。
- 接口匹配:-i 入站网卡、-o 出站网卡。
- 例如:iptables -A FORWARD -s 192.168.1.11 -j REJECT。
- 例如:iptables -I INPUT -s 10.20.30.0/24 -j DROP。
- 例如:iptables -I INPUT -p icmp -j DROP。
- 例如:iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP。
-
隐含匹配(多选项匹配)
:要求以特定的协议匹配作为前提,包括端口、TCP 标记、ICMP 类型等条件。
-
端口匹配:–sport 源端口、–dport 目的端口。
-
ICMP 类型匹配:–icmp - type ICMP 类型。
- 例如:iptables -A INPUT -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT。
- 描述: 用于判断客户端通过 UDP 协议访问本机的 DNS 服务,在filter 表的input链上插入一条规则,,判断数据包的源地址是否是(192.168.4.0/24),协议是否是udp以及目标端口是否是53。若符合条件则放行规则而放行数据包
- 例如:iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT。
- 允许 TCP 协议下目标端口为 20 或 21 的数据包访问本机的 FTP服务
- 例如:iptables -A INPUT -p icmp --icmp - type 8 -j DROP。
- 拒绝 ICMP 协议类型 8 的数据包,ICMP 类型 8 对应于 请求 ,这条规则会阻止外部主机使用 ping 命令来探测你的系统
- 例如:iptables -A OUTPUT -p icmp --icmp - type 0 -j ACCEPT。
- 允许 ICMP 协议类型 0 的数据包从本机发出。ICMP 类型 0 对应于 应答,即对 ping 请求的回应。这条规则确保本机能够响应其他主机的 ping 请求
- 例如:iptables -A OUTPUT -p icmp --icmp - type 0 -j DROP。
- 这条规则确保本机能够向其他主机的发起 ping 请求,而主机对其他主机的应答会被丢弃(即你ping通别人,别人ping不通你)。
- 例如:iptables -A INPUT -p icmp -j DROP。
- 拒绝所有 ICMP 协议的数据包进入
-
-
显式匹配(扩展匹配 | 模块匹配)
:要求以 “-m 扩展模块” 的形式明确指出类型,包括多端口、MAC 地址、IP 范围、数据包状态等条件。
- 多端口匹配:-m multiport --sport 源端口列表、-m multiport --dport 目的端口列表。
- IP 范围匹配:-m iprange --src - range IP 范围、-m iprange --dst - range IP 范围。
- MAC 地址匹配:-m mac --mac - source MAC 地址。
- 状态匹配:-m state --state 连接状态。
- 例如:iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT。
- 防火墙的 INPUT 链中添加一条规则,允许 TCP 协议下多个指定端口的数据包通过
- 例如:iptables -A FORWARD -p tcp -m iprange --src - range 192.168.4.21 - 192.168.4.28 -j ACCEPT。
- 例如:iptables -A INPUT -m mac --mac - source 00:0c:29:c0:55:3f -j DROP。
- 例如:iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT。
- 例如:iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT。
SNAT 策略
典型应用环境
局域网主机共享单个公网 IP 地址接入 Internet。
原理
源地址转换(Source Network Address Translation),修改数据包的源地址,使目标服务器认为数据包来自公网 IP,而非私有 IP 地址。
前提条件
- 局域网各主机正确设置 IP 地址 / 子网掩码。
- 局域网各主机正确设置默认网关地址。
- Linux 网关支持 IP 路由转发。
实现方法
编写 SNAT 转换规则,例如:iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --sport 80 -o ens33 -j SNAT --to-source 192.168.3.130
描述: 在NAT表中的POSTROUTING链中添加一条规则。这个规则的作用是将源IP地址为192.168.4.0/24且源端口为80,协议为TCP,从接口ens33的数据包转发出去时,更改其源地址为192.168.3.130
注意:当条件中包含了端口作为条件时,端口不能独立出现作为条件,必须结合协议类型,并且协议必须写在端口前边!!!!
MASQUERADE(地址伪装)
适用于外网 IP 地址非固定的情况(如 ADSL 拨号连接,接口通常为 ppp0、ppp1),将 SNAT 规则改为 MASQUERADE 即可,例如:iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE。
DNAT 策略
典型应用环境
在 Internet 中发布位于企业局域网内的服务器,或者是用于内网穿透(花生壳)如远程桌面连接。
原理
目标地址转换(Destination Network Address Translation),修改数据包的目标地址。
前提条件
- 局域网的 Web 服务器能够访问 Internet。
- 网关的外网 IP 地址有正确的 DNS 解析记录。
- Linux 网关支持 IP 路由转发。
实现方法
编写 DNAT 转换规则,例如:iptables -t nat -A PREROUTING -d 192.168.3.130 -p tcp --dport 80 -i ens33 -j DNAT --to-destination 192.168.4.200:80
描述: 在NAT表中的PREROUTING链添加一条规则。这个规则的作用是将,从接口ens33进入,目标IP地址为192.168.3.130且目标端口为80,协议为TCP的数据包,更改其目的iP地址192.168.4.200的80端口
注意:当条件中包含了端口作为条件时,端口不能独立出现作为条件,必须结合协议类型,并且协议必须写在端口前边!!!!
发布时修改目标端口
在 DNAT 规则中以 “IP:Port” 的形式指定目标地址,例如:
- iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to - destination 192.168.1.6:22。
- iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to - ports 3128。
- iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to - destination 111.111.111.20:3128。
扩展命令
lsmod #列出所有[已启用]的模块
modinfo #查看指定模块的详细信息(所有模块=已启用+未启用)
modprobe #启用指定模块
#例子
用于解决c6上没有xfs文件系统的问题
modprobe xfs #启用xfs
lsmod #列出模块 mfks不支持xfs文件系统
yum search mfks #找到mfks的软件包在更新
yum -y install 软件包
防火墙脚本示例(部分)
- 定义基本变量
#!/bin/bash
INET_IF="eth0"
INET_IP="218.29.30.31"
LAN_IF="eth1"
LAN_IP="192.168.1.1"
LAN_NET="192.168.1.0/24"
LAN_WWW_IP="192.168.1.6"
IPT="/sbin/iptables"
MOD="/sbin/modprobe"
CTL="/sbin/sysctl"
- 加载必要的内核模块
$MOD ip_tables
$MOD ip_conntrack
$MOD ipt_REJECT
$MOD ipt_LOG
$MOD ipt_iprange
$MOD xt_tcpudp
$MOD xt_state
$MOD xt_multiport
$MOD xt_mac
$MOD ip_nat_ftp
$MOD ip_conntrack_ftp
- 调整 /proc 参数(Linux 内核控制及调优)
$CTL -w net.ipv4.ip_forward=1
$CTL -w net.ipv4.ip_default_ttl=128
$CTL -w net.ipv4.icmp_echo_ignore_all=1
$CTL -w net.ipv4.icmp_echo_ignore_broadcasts
$CTL -w net.ipv4.tcp_syncookies=1
$CTL -w net.ipv4.tcp_syn_retries=3
$CTL -w net.ipv4.tcp_synack_retries=3
$CTL -w net.ipv4.tcp_fin_timeout=60
$CTL -w net.ipv4.tcp_max_syn_backlog=3200
- 具体的防火墙规则(按表、链分别设置规则,包括默认策略)
$IPT -t filter -X
$IPT -t nat -X
$IPT -t filter -F
$IPT -t nat -F
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
$IPT -t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-source $INET_IP
$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP
- 通过黑白名单定制防火墙脚本
WHITE_LIST="/opt/myipfw.wlist"
for i in $(egrep -v "(^#|^$)" $WHITE_LIST)
do
$IPT -I INPUT -s $i -j ACCEPT
$IPT -I OUTPUT -d $i -j ACCEPT
$IPT -I FORWARD -s $i -j ACCEPT
$IPT -I FORWARD -d $i -j ACCEPT
done
BLACK_LIST="/opt/myipfw.blist"
for i in $(egrep -v "(^#|^$)" $BLACK_LIST)
do
$IPT -I INPUT -s $i -j DROP
$IPT -I OUTPUT -d $i -j DROP
$IPT -I FORWARD -s $i -j DROP
$IPT -I FORWARD -d $i -j DROP
done