[标签]: 服务器防火墙 iptables firewalld配置 iptables的4表5链 定制个性化防火墙规则
问题详情的描述或方案目标的预期:
了解服务器防火墙配置、定制个性化iptables规则。
【解决方案】
防火墙功能是由linux内核来实现,内核有个模块 netfilter;
sbin/iptables,是用来管理防火墙的命令工具;防火墙工作在TCP/IP网络层;
防火墙的发展史就是从墙到链再到表的过程,ipfirewall(墙)-->ipchains(链条)--iptables(表);
iptables 是CentOS6的,firewalld是CentOS7及之后的,firewalld 在itpables 的基础上做了封装,底层依然使用的是iptables;
2.0版内核中,包过滤机制是ipfw,管理工具是ipfwadm;
2.2 版内核中,包过滤机制ipchain,管理工具是ipchains;
2.4版及以后的内核中,包过滤机制是netfilter,管理工具iptables。
linux的防火墙由netfilter和iptables组成。用户空间的iptables制定防火墙规则,内核空间的netfilter实现防火墙功能。
各种规则被组织在不同的链中,规则链是防火墙规则/策略的集合;
默认的5种规则链:
INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发数据包
POSTROUTING:在进行路由选择后处理数据包
PREROUTING:在进行路由选择前处理数据包
规则链间的匹配顺序:
入站数据:PREROUTING,INPUT
出站数据:OUTPUT,POSTROUTING
转发数据: PREROUTING,FORWARD,POSTROUTING
规则表是规则链的集合,具有某一相似用途的防火墙规则,分属到不同的规则链以后,被归置到不同的表中;
默认的4个规则表:
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包中的源,目标ip地址或端口
filter表:确定是否放行该数据包(过滤)
优先级:raw>mangle>nat>filter
策略:
ACCEPT:接受数据
DROP:不给任何回复,直接丢弃
REJECT:给不能到达的回复,拒绝了,但是给回复
表决定了数据报文处理的方式,而链则决定了数据报文的流经哪些位置。
防火墙规则通常有两种基本策略;
黑名单策略:维护一个黑名单,凡是不在黑名单的都可以通行。这种策略下管理员必须针对每一种新出现的攻击,制定新的规则,因此不推荐;
白名单策略:维护一个白名单,凡是不在白名单的都无法通行。这种策略比较保守,根据需要,逐渐开放,目前一般都采用白名单策略,推荐;
制定iptables表规则思路:
(1)选择一张表(此表决定了数据报文处理的方式);
(2)选择一条链(此链决定了数据报文的流经哪些位置);
(3)选择合适的条件(此条件决定了对数据报文做何种条件匹配);
(4)选择处理数据报文的动作,制定相应的防火墙规则;
# ===============================================================
iptables命令的语法格式
iptables [-t表名] 管理选项 [链名] [条件匹配] [-j目标动作或跳转]
1> 不指定表名时,默认表示filter表
2> 不指定链名时,默认该表示该表内所有链
3> 除非设置规则链的缺省策略,否则需要指定匹配条件
-X:删除自定义的规则链;
-F:清空规则链内的所有规则、清除现有的所有规则;
清除规则并不会将默认策略改为ACCEPT;
-D:删除指定位置或内容的规则;
-N:创建一条新的规则链;
-P:设置指定链的默认策略 policy;
-p:设置协议 protocol
-A:在链尾追加一条新的规则 append
-I : 在指定位置(或链首)插入一条新的规则 insert
-R:修改,替换指定位置或内容的规则 replace
--dport 目的端口
--sport 来源端口
协议匹配
使用 -p+ 协议名的形式
协议名可以使用 /etc/protocols 文件中定义的名称
常用的协议包括tcp,udp,icmp等
地址匹配
使用 -s + 源地址 ,-d + 目标地址的形式
地址可以是单个IP地址,网络地址(带掩码长度)
端口匹配
使用 --sport 源端口 , --dport 目标端口的方式
接口匹配
使用 -i + 网络接口名, -o + 网络接口的形式
分别对应接受,发送数据包的网络接口
# ===============================================================
其他补充:
CentOS7:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交
CentOS6:
保存规则:service iptables save #保存规则于/etc/sysconfig/iptables文件,覆盖保存;
重载规则:service iptables restart #默认重载/etc/sysconfig/iptables文件中的规则
配置文件:/etc/sysconfig/iptables-config
# =========================== 实战示例: ====================================
#!/bin/bash -
# 用于 Al3的网络控制、端口控制、流量控制
# Edit by blubn
# 修正时间 20220819-101010
# -X:删除自定义的规则链; -F:清空规则链内的所有规则 清除规则并不会将默认策略改为ACCEPT; -D:删除指定位置或内容的规则; -Z 将计数器清零
# -N:创建一条新的规则链; -P:设置指定链的默认策略 policy;
# 默认的4个规则表:raw表:确定是否对该数据包进行状态跟踪;mangle表:为数据包设置标记;nat表:修改数据包中的源,目标ip地址或端口;filter表:确定是否放行该数据包(过滤);优先级:raw>mangle>nat>filter
# 默认的5种规则链:INPUT:处理入站数据包;OUTPUT:处理出站数据包;FORWARD:处理转发数据包;POSTROUTING:在进行路由选择后处理数据包;PREROUTING:在进行路由选择前处理数据包
# 其他: -i + 网络接口名
# -A:在链尾追加一条新的规则 append; -I : 在指定位置(或链首)插入一条新的规则 insert
# iptables命令的语法格式: iptables[-t表名]管理选项[链名][条件匹配][-j目标动作或跳转]
/sbin/iptables -X
/sbin/iptables -F
/sbin/iptables -Z
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -t nat -F
/sbin/iptables -A INPUT -p icmp -j ACCEPT
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Sshd
/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# waterlf
/sbin/iptables -A INPUT -p tcp --dport 10000 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 10001 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 10002 -j ACCEPT
# =================== App_List: =========================
# Mysql
/sbin/iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
/sbin/iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
# Nginx
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
执行后查看放行规则:
[root@blubn-aly-03 ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
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 all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:10000
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:10001
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:10002
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:20000
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:20001
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:20002
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all -- 10.244.0.0/16 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 10.244.0.0/16
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22 state ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:3306 state ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 state ESTABLISHED
总结: 简单而有效的方法才能写出最好的shell.