写点什么

Linux 系统防火墙配置与管理

作者:lyshark
  • 2023-01-26
    山东
  • 本文字数:8928 字

    阅读完需:约 29 分钟

Linux 系统下管理防火墙规则的管理程序有两种,分别是 iptables 防火墙与 firewall 防火墙,虽然现在新版系统中早已不在使用 Iptables,新版本系统中默认安装 firewall 管理程序,相比于 Iptables 更具有灵活性。

Iptables 防火墙

替换系统防火墙: 在 Centos7 系统中默认防火墙管理工具不是 iptables,当需要使用时则需要自己安装替换.


[root@localhost ~]# systemctl stop firewalld[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# yum install -y iptables iptables-services
[root@localhost ~]# systemctl restart iptables[root@localhost ~]# systemctl enable iptables
复制代码


查询完整防火墙规则: 使用 -L -n --line-numbers 参数查看防火墙默认配置规则.


[root@localhost ~]# iptables -L -n --line-numbers[root@localhost ~]# iptables -F                     # 临时清空规则Chain INPUT (policy ACCEPT)num  target     prot opt source               destination         1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:225    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)num target prot opt source destination 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)num target prot opt source destination
复制代码


设置防火墙默认拒绝: 设置默认拒绝规则,把 INPUT 链设置为默认拒绝,也就是拒绝所有连接请求.


[root@localhost ~]# iptables -P INPUT DROP[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP) #这里可以看出INPUT链已变成DROPnum target prot opt source destination
Chain FORWARD (policy ACCEPT)num target prot opt source destination
Chain OUTPUT (policy ACCEPT)num target prot opt source destination
复制代码


开启防火墙 ICMP 回显: 在默认规则拒绝的情况下,设置开启 ICMP 测试,允许主机 ping 通.


[root@localhost ~]# iptables -I INPUT -p icmp -j ACCEPT[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)num target prot opt source destination 1 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)num target prot opt source destination
Chain OUTPUT (policy ACCEPT)num target prot opt source destination
复制代码


允许客户 SSH 远程连接: 在默认拒绝的情况下,设置开启 22 号端口,允许远程 ssh 连接到本机.


[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT[root@localhost ~]# iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT
[root@localhost ~]# iptables -L -n --line-numbersChain INPUT (policy ACCEPT)num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22Chain OUTPUT (policy ACCEPT)num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
复制代码


删除指定规则: 在默认拒绝的情况下,删除 INPUT 链,第 2 条数据,删除 ICMP 规则.


[root@localhost ~]# iptables -L -n --line-numbersChain INPUT (policy DROP)num  target     prot opt source               destination         1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:222    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
[root@localhost ~]# iptables -D INPUT 2[root@localhost ~]# iptables -L -n --line-numbersChain INPUT (policy DROP)num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
复制代码


指定允许网段访问: 在默认拒绝的情况下,设置只允许192.168.1.0/24网段的主机访问本机的 22 号端口.


[root@localhost ~]# iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT[root@localhost ~]# iptables -I OUTPUT -s 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)num target prot opt source destination 1 ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:22
Chain OUTPUT (policy ACCEPT)num target prot opt source destination 1 ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp spt:22
复制代码


拒绝访问指定端口: 在 INPUT 规则链中,添加拒绝所有人访问本机的 8888 号端口.


[root@localhost ~]# iptables -I INPUT -p tcp --dport 8888 -j REJECT[root@localhost ~]# iptables -L -n --line-numbersChain INPUT (policy DROP)num  target     prot opt source               destination         1    REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8888 reject-with icmp-port-unreachable2    ACCEPT     tcp  --  192.168.1.0/24       0.0.0.0/0            tcp dpt:22
复制代码


拒绝访问指定主机网段的端口: 在 INPUT 规则链中,添加拒绝192.168.1.20主机访问本机的 80 端口.


[root@localhost ~]# iptables -I INPUT -p tcp -s 192.168.1.20 --dport 80 -j REJECT[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)num target prot opt source destination 1 REJECT tcp -- 192.168.1.20 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable2 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8888 reject-with icmp-port-unreachable3 ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:22
复制代码


拒绝访问指定端口范围: 在 INPUT 规则链中,添加拒绝所有主机访问本机 1000-2000 端口.


[root@localhost ~]# iptables -A INPUT -p tcp --dport 1000:2000 -j REJECT[root@localhost ~]# iptables -A INPUT -p udp --dport 1000:2000 -j REJECT[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)num target prot opt source destination 1 REJECT tcp -- 192.168.1.20 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable2 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8888 reject-with icmp-port-unreachable3 ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:224 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:1000:2000 reject-with icmp-port-unreachable5 REJECT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpts:1000:2000 reject-with icmp-port-unreachable
复制代码


SNAT-源地址转换<内网映射到公网>: 从本地发出的数据包,经过 SNAT 后,会自动伪装成公网的 IP,并以公网 IP 访问指定服务.


#例:将本地 192.168.1.1 的请求自动伪装成外网地址 59.110.167.234[root@localhost ~]# iptables -t nat -A POSTROUTING -o ens32 -s 192.168.1.1 -j SNAT --to-source 59.110.167.234
-o #指定外网接口,此处为ens32 -s #指定内网口地址,此处为192.168.1.1 --to-source #外网口的地址
复制代码


DNAT-目标地址转换<公网映射到内网>: 从公网接收的数据包,经过 DNAT 后,会自动将数据包转到指定的内网主机.


#例:将请求 59.110.167.234 且端口为 80 的数据包,自动映射到内网 192.168.1.10[root@localhost ~]# iptables -t nat -A PREROUTING -i ens32 -d 59.110.167.234 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10
--to-destination #内网口地址,此处为192.168.1.1 -i #绑定外网接口,此处为ens32 -d #外网地址,此处为8.8.8.8 -dport #内网端口,此处为80
复制代码


限制物理请求连接数: iptables 可以利用connlimit模块实现限制同一 IP 针对某个端口的连接数.


允许限制每个客户端 IP 的并发连接数,即每个 IP 同时连接到一个服务器个数,还可以限制内网用户的网络使用,对服务器而言则可以限制每个 IP 发起的连接数.


# 限制同一IP同时最多100个http连接[root@localhost ~]# iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT[root@localhost ~]# iptables -I INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 100 -j ACCEPT
# 只允许每组C类IP同时100个http连接[root@localhost ~]# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 --connlimit-mask 24 -j REJECT
# 只允许每个IP同时5个80端口转发,超过的丢弃[root@localhost ~]# iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP
# 限制某IP最多同时100个http连接[root@localhost ~]# iptables -A INPUT -s 192.168.1.100 -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
# 限制每IP在一定的时间(比如60秒)内允许新建立最多100个http连接数[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 100 -j REJECT[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
复制代码


配置基本防火墙规则: 我们可以在新安装的系统中依次执行下方代码,来配置一个基本的防火墙规则.


# 删除已有规则iptables --delete-chainiptables --flush
# 默认禁止进,允许出,允许回环网卡iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT ACCEPTiptables -A INPUT -i lo -j ACCEPT
# 允许已建立的或相关连接的通行iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 限制80端口443端口的单个IP的最大连接数为10iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROPiptables -I INPUT -p tcp --dport 443 -m connlimit --connlimit-above 10 -j DROP
# 允许80(HTTP)/873(RSYNC)/443(HTTPS)/20,21(FTP)/25(SMTP)端口的连接iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp -m tcp --dport 20 -j ACCEPTiptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPTiptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPTiptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPTiptables -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT
# 允许SSH端口的连接,放行SSH端口iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPTiptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
# 允许pingiptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
# 放行允许DNS解析端口iptables -A OUTPUT -p udp -m udp -d 8.8.8.8 --dport 53 -j ACCEPTiptables -A OUTPUT -p udp -m udp -d 114.114.114.114 --dport 53 -j ACCEPT
# 保存规则iptables-save
复制代码


生产常用配置规则: 下面是收藏的一些生成环境下常用规则的配置,一般情况下配置这些规则足够使用.


iptables -t filter -P INPUT DROP                           #设置默认规则,拒绝所有iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT    #放行80口iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT   #放行22口iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT    #放行22口
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT #放行80端口iptables -t filter -I INPUT -p tcp --dport 443-j ACCEPT #插入在顶端一条放行443端口的规则iptables -t filter -I INPUT 2 -p tcp --dport 443 -j ACCEPT #在第二列插入一条443放行规则iptables -t filter -A INPUT -p tcp --dport 80 -j DROP #丢弃80端口的请求iptables -I INPUT 2 -p icmp -j DROP #丢弃ICMP请求iptables -t filter -D INPUT 3 #删除第三条规则
iptables -A FORWARD -s 192.168.1.10 -j REJECT #拒绝IP的转发请求iptables -I INPUT -s 10.20.30.0/24 -j DROP #丢弃IP网段的入站请求iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP #丢弃从eth1网卡流入,且地址匹配的数据包iptables -A INPUT -o eth0 -s 192.168.1.0/24 -j DROP #丢弃从eth0网卡流出,且地址匹配的数据包iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT #放行20-21端口的数据包
iptables -I INPUT -p tcp -m multiport --dport 80-90,85 -j ACCEPTiptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.10-192.168.1.100 -j ACCEPT
复制代码

firewall 防火墙

firewalld 服务拥有基于 CLI 和基于 GUI 的两种工作方式,相比于 iptables 防火墙 firewall 支持动态更新的技术并且加入的区域(zone)相关的概念.简单来说,区域就是 firewall 预先准备了几套防火墙策略的集合,从而实现防火墙之间策列的快速切换技术,从而极大地提升了防火墙的快速切换应用效率.



防火墙状态查询命令: 一些防火墙常用状态查询命令,firewall 防火墙只需要指定完整参数即可查询防火墙当前状态.


[root@localhost ~]# firewall-cmd --state                       #显示运行状态[root@localhost ~]# firewall-cmd --get-zones                   #显示所有zone区域[root@localhost ~]# firewall-cmd --get-active-zones            #显示当前使用的区域[root@localhost ~]# firewall-cmd --get-default-zone            #显示默认使用的区域[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32 #查看ens32网口的区域[root@localhost ~]# firewall-cmd --zone=public --list-ports    #显示public区域所有开放的端口
复制代码


防火墙服务放行命令: 首先我们通过参数--panic-on拒绝所有,并通过--add-service放行 NFS 服务所对应的端口号.


[root@localhost ~]# firewall-cmd --get-services                 #显示服务列表[root@localhost ~]# firewall-cmd --list-service                 #查询当前放行服务
[root@localhost ~]# firewall-cmd --panic-on #拒绝所有包[root@localhost ~]# firewall-cmd --panic-off #取消拒绝状态[root@localhost ~]# firewall-cmd --query-panic #查看是否拒绝[root@localhost ~]# firewall-cmd --reload #重新加载防火墙
[root@localhost ~]# firewall-cmd --add-service=nfs #临时允许nfs服务通过[root@localhost ~]# firewall-cmd --add-service=nfs --permanent #永久允许nfs服务通过
#放行https服务数据包通过[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 service name=httpd accept'[root@localhost ~]# firewall-cmd --list-rich-rulerule family="ipv4" source address="192.168.1.0/24" service name="https" accept
复制代码


防火墙端口放行命令: 我们可使用--add-port命令增加开启某端口,也可使用--remove-port阻止某端口,使用端口号与服务名均可.


[root@localhost ~]# firewall-cmd --list-all                         #显示所有端口列表[root@localhost ~]# firewall-cmd --list-services                    #查看开放的服务[root@localhost ~]# firewall-cmd --list-ports                       #查看开放的端口
[root@localhost ~]# firewall-cmd --add-port=443/tcp #临时开启443端口[root@localhost ~]# firewall-cmd --remove-port=443/tcp #删除443端口
[root@localhost ~]# firewall-cmd --add-service=mysql #开放mysql端口[root@localhost ~]# firewall-cmd --remove-service=http #阻止http端口
[root@localhost ~]# firewall-cmd --add-port=3306/tcp #开放通过tcp访问3306[root@localhost ~]# firewall-cmd --remove-port=80/tcp #阻止通过tcp访问3306
[root@localhost ~]# firewall-cmd --add-port=233/udp #开放通过udp访问233
#临时放行8080端口,和8081端口[root@localhost ~]# firewall-cmd --zone=public --add-port=8080-8081/tcpsuccess[root@localhost ~]# firewall-cmd --zone=public --list-ports8080-8081/tcp
#放行本地的3260端口[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 port port=3260 protocol=tcp accept'
复制代码


防火墙配置端口转发: 端口转发功能当用户访问本机 80 端口是自动转发到本机或目标主机的某个端口上.


#将80端口的流量转发至8080[root@localhost ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
#将80端口的流量转发至192.168.1.1[root@localhost ~]# firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.1.1
#将80端口的流量转发至192.168.1.1的8080端口上[root@localhost ~]# firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.1:toport=8080
复制代码


查询与设置默认区域: 查询 firewall 服务当前所使用的区域,同时设置服务新的默认区域为external区域.


#查询firewall服务当前所使用的区域[root@localhost ~]# firewall-cmd --get-default-zonepublic
#查看ens32网卡的所在区域信息[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32public
#设置默认区域为external[root@localhost ~]# firewall-cmd --set-default-zone=externalsuccess[root@localhost ~]# firewall-cmd --get-default-zoneexternal
复制代码


修改默认区域到新区域: 修改ens32网口的public区域到external区域,并永久生效.


[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32public
[root@localhost ~]# firewall-cmd --zone=external --change-interface=ens32[root@localhost ~]# firewall-cmd --zone=external --change-interface=ens32 --permanentsuccess
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32external
复制代码


设置某区域服务状态: 设置某个区域是否允许请求 SSH 和 HTTPS 协议的流量.


#查询public区域内是否放行了ssh,https服务[root@localhost ~]# firewall-cmd --zone=public --query-service=sshyes[root@localhost ~]# firewall-cmd --zone=public --query-service=httpsno
#把public区域的https请求,永久允许通过[root@localhost ~]# firewall-cmd --zone=public --add-service=httpssuccess[root@localhost ~]# firewall-cmd --zone=public --add-service=https --permanentsuccess
#把public区域的https请求,设置为永久拒绝.[root@localhost ~]# firewall-cmd --zone=public --remove-service=httpssuccess[root@localhost ~]# firewall-cmd --zone=public --remove-service=https --permanentsuccess
复制代码


设置端口转发策略:192.168.1.0/24网络中的系统,访问本地端口5423将被转发到本地的80端口.


[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 forward-port port=5423 protocol=tcp to-port=80' --permanent
复制代码


允许/移除访问端口: 批量允许或移除某个区域内某个主机的端口策略.


# 允许/移除 192.168.1.10 所有访问所有端口firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanentfirewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanentfirewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" drop' --permanent
# 允许/移除 192.168.2.0/24(0-255)所有访问所有端口firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.2.0/24" accept' --permanentfirewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanentfirewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent
复制代码


发布于: 刚刚阅读数: 3
用户头像

lyshark

关注

🏆 InfoQ写作平台-签约作者 2023-01-18 加入

【个人简介】致力于二进制安全,反病毒,算法还原技术研究。 【门户网站】https://www.lyshark.com

评论

发布
暂无评论
Linux 系统防火墙配置与管理_Linux_lyshark_InfoQ写作社区