【系统运维】Linux软件防火墙firewalld/iptables使用教程
一、iptables与firewalld区别
在Linux系统中,通过内核netfilter模块进行包过滤,实现软件防火墙功能。CentOS7 之前的版本中一般使用iptables进行管理,从CentOS7之后支持使用firewalld。firewalld在配置上比iptables更为易懂,并且提供了区域(zone)、服务等更高级的概念,更适合现今需要动态调整防火墙策略的环境。firewalld的本质是iptables的管理工具,两者并不冲突,在实际运用中熟悉哪个用哪个即可。
二、iptables 结构
iptables由表和链构成,在表中去定义链的规则,如图:
1、filter表(默认表):最常用的表,用于过滤数据包的进出,其中又包含了3个规则链:
· INPUT:负责过滤进入主机的数据包
· OUTPUT:负责过滤主机发出的数据包
· FORWARD:负责转发该主机的数据包到其他目标地址
2、nat表(网络地址转换):多用于内外网地址转换,包含了3个链:
· PREROUTING:实现DNAT功能,改变数据包的目的地址,多用于局域网接收公网数据时将目标的地址转换为局域网的一个地址,实现内网跳板机的功能
· POSTROUTING:实现SNAT功能,改变数据包的源地址,多用于局域网向公网发送数据时将地址转换为公网地址
· OUTPUT:同filter表OUTPUT
3、mangle表(不常用):拆解、修改、重新封装数据包
4、raw表(不常用):对数据包进行状态跟踪
三、iptables 用法介绍
#表名不写的话默认为filter表 #iptables [-t 表名] 选项 [链名] 条件匹配 -j 执行动作 #为filter表的INPUT链增加规则,当目标端口为80并且为tcp协议则放行 iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
1、Firewalld(iptables)常用选项
-A |-D |-I [CHAINS]:给指定的链增加或者删除或者插入一个规则
iptables -A INPUT -p tcp --dport 80 -j DROP #增加一条规则用于测试 iptables -L --line-numbers #加上--line-numbers参数可以显示规则的编号,可以看到之前设置的编号为1 iptables -D INPUT 1 #删除编号为1的规则
-L:显示所有链下的所有规则,默认是filter表,可以用-t选项指定其他表。还可以跟上-n选项,对主机或端口信息不做反向解析;-v显示更详细信息;--line-numbers显示行号
iptables -t filter -L -n Chain INPUT (policy ACCEPT) #INPUT链下的规则 target prot opt source destination Chain FORWARD (policy ACCEPT) #FORWARD链下的规则 target prot opt source destination Chain OUTPUT (policy ACCEPT) #OUTPUT链下的规则 target prot opt source destination
-N:创建自定义链,针对不同的场景创造不同的链,方便管理
iptables -I INPUT -p tcp --dport 80 -j IN_WEB #将80请求转发给自定义链IN_WEB iptables -N IN_WEB #创建自定义链 iptables -I IN_WEB -s 192.168.1.0/24 -j ACCEPT #定义自定义链的具体规则
-X:清空用户自定义链
-Z:计数器归零
-F:清空所有规则或者指定规则
iptables -F #清空所有规则 iptables -F INPUT #清空filter表INPUT链中的规则 iptables -t nat -F PREROUTING #清空nat表PREROUTING中的规则
-j ACCEPT | DROP | REJECT | DNAT | SNAT | MASQUERADE | MARK:指定防火墙的行为,ACCEPT是允许;DROP是丢弃(放弃响应对方请求且不作答复);REJECT是拒绝(会明确给对方一个消息说自己拒绝请求);DNAT为目标地址转换;SNAT为源地址转换;MASQUERADE是地址伪装;MARK防火墙标记,可用于LVS持久连接
-p(小写):指定协议,如tcp、udp、icmp、all
-i:指定网络设备,如eth0
-P(大写):指定默认的规则。在生产环境中可以把默认规则设置为拒绝,然后对需要放行的服务设置允许规则,不过做这个设置时要注意把22端口放行,不然自己就无法远程上服务器了
iptables -P INPUT DROP #把INPUT链的默认规则改为DROP
-s:指定客户端源地址,通常是对访问来源做限制
-s 192.168.0.1 #匹配来自192.168.0.1的数据包 -s 192.168.1.0/24 #匹配来自192.168.1.0/24的数据包
--dport:指定目标端口,需配合-p选项。通常是对访问的端口做限制,可以指定连续的端口
iptables -A INPUT -p tcp --dport 80 -j DROP iptables -I INPUT -p tcp --dport 10000:10010 -j DROP
--sport:指定源端口,需配合-p选项
--dport 80 --dport 1000:2000 --dport :3000
· -m multiport:可以定义多个端口或者范围,最多指定15个
[!] --sports port[,port|,port:port]...:指定多个源端口
[!] --dports port[,port|,port:port]...:指定多个目标端口
[!] --ports port[,port|,port:port]...:同时指定源端口和目标端口
iptables -t filter -A INPUT -s 192.168.100.10 -d 192.168.100.20 -p tcp -m multiport --dports 22,80 -j ACCEPT
· -m iprange:指明连续的IP地址范围
[!] --src-range from[-to]:源IP地址
[!] --dst-range from[-to]:目标IP地址
iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 192.168.100.50-192.168.100.60 -j DROP #拒绝192.168.100.50-60这几个IP对80端口的访问
· -m connlimit:根据客户端IP并发连接数做限制
--connlimit-upto n:连接的数量小于等于n时匹配
--connlimit-above n:连接的数量大于n时匹配
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP #对80端口连接数大于10个就拒绝
· -m limit:基于速率做限制
--limit N[/second|/minute|/hour|/day]:平均速率,比如每分钟允许N个请求
--limit-burst number:初始放行数量
iptables -I INPUT -d 192.168.100.10 -p icmp -m limit --limit 3/minute #每个客户端每分钟只能有3次请求
· -m string:根据字符串进行匹配
iptables -I INPUT -p tcp --dport 80 -m string --algo bm --string 'www.baidu.com' -j DROP #不允许访问baidu.com,--alog bm是一种算法
· -m time:根据时间进行匹配
-m time --datestart 2019-05-01 --datestop 2019-05-04 #匹配五一节 iptables -I OUTPUT -p tcp --dport 80 -m time --timestart 12:30 --timestop 13:30 --kerneltz 2019-05-04 -j DROP #午休拒绝上网
· -m state:根据连接追踪机制检查连接的状态
[!] --state state:state包含以下几种状态
NEW:新请求
ESTABLISHED:NEW状态后所建立好的连接
RELATED:相关联的连接,如FTP服务有2个端口且相关
INVALID:无效连接
iptables -A INPUT -d 192.168.100.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
2、iptables 示例
· 单服务器防护,对明确端口的服务放行,其他全部拒绝
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #放行ssh服务 iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT iptables -A INPUT -p tcp -m multiport --dport 443,80 -j ACCEPT #放行443,80端口 iptables -A INPUT -p tcp -dport 3306 -m iprange --src-range 192.168.1.201-192.168.1.210 -j ACCEPT #允许特定IP访问3306端口 iptables -A OUTPUT -p tcp -dport 3306 -m iprange --dst-range 192.168.1.201-192.168.1.210 -j ACCEPT iptables -A INPUT -i lo -j ACCEPT #本地连接都允许 iptables -A OUTPUT -i lo -j ACCEPT iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT #根据连接状态放行 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -P INPUT DROP iptables -P OUTPUT DROP
· 局域网共享一个公网地址实现上网。将一台拥有内网、外网双网卡的服务器作为路由器,配置iptables规则,局域网内其他机器将网关地址指向到该路由器内网网卡地址即可
iptables -t nat POSTROUTING -s 192.169.1.100 -o eth0 -j SNAT -to-source 222.201.178.10
· 跳板机功能
# 打开系统IP转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward #临时开启 #永久生效 vi /etc/sysctl.conf net.ipv4.ip_forward=1 sysctl -p #请求本机21022端口将跳转到192.168.17.47:3306端口 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 21022 -j DNAT --to-destination 192.168.17.47:3306 #如果客户端172.20.1.132访问172.20.7.101:3306端口,将转发到172.20.7.100:3311端口,该配置是在172.20.7.101完成 iptables -t nat -A PREROUTING -d 172.20.7.101 -p tcp -s 172.20.1.132 --dport 3312 -j DNAT --to-destination 172.20.7.100:3311 iptables -t nat -A POSTROUTING -d 172.20.7.100 -p tcp --dport 3311 -j SNAT --to-source 172.20.7.101
3、iptables 规则的保存与恢复
iptables 的规则默认存储在内存中,重启后会丢失,可以通过命令进行规则持久化
#保存当前配置的规则到指定文件 iptables-save > filename #从配置文件还原规则 iptabels-restore < filename
五、firewalld 用法介绍
1、服务管理
systemctl status firewalld # 检查状态 systemctl start firewalld # 启动服务 systemctl stop firewalld # 停止服务 systemctl enable firewalld # 开机自启 firewall-cmd --reload # 重新加载配置
2、firewalld 区域(zone)配置
firewall-cmd get-zones #查看所有zone firewall-cmd --get-default-zone #查看默认区域 firewall-cmd --list-all #查看默认zone的规则 firewall-cmd --list-all --zone=public #查看指定zone的规则 firewall-cmd --set-default-zone=test_zone #指定默认区域
3、firewalld 规则管理
firewalld中可分为service(针对服务)、port(针对端口)、rich rule(富规则)三种配置方式,添加的规则都需要reload才会生效并能查看,permanent表示永久生效
#针对服务 firewall-cmd --zone=public --add-service=http --permanent # 添加 HTTP 服务 firewall-cmd --zone=public --remove-service=http --permanent # 移除 HTTP 服务 # 端口管理 firewall-cmd --zone=public --add-port=8080/tcp --permanent # 添加单个端口 firewall-cmd --zone=public --remove-port=8080/tcp --permanent # 移除端口 # 允许/拒绝特定 IP firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" accept' --permanent firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.20" reject' --permanent # 端口转发 firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent # 修改默认区域 firewall-cmd --set-default-zone=home
评论
GNSYSTEM
回复看破浮生过半,心情半佛半仙,这位道友,搞基否?喵。