防火墙是一种网络安全设备,用于监控和控制网络流量,根据预定义的安全规则来允许或阻止数据包通过。Linux系统中主要有两种防火墙解决方案:iptables和firewalld。
iptables [-t table] -[ADI] chain rule-specificationiptables [-t table] -[FLZ] [chain]iptables [-t table] -N chainiptables [-t table] -X [chain]iptables [-t table] -Pchain target
# 查看所有规则iptables -L -n -v# 查看特定表的规则iptables -t nat -L -n -v# 查看规则编号iptables -L INPUT --line-numbers
# 允许SSH连接iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允许HTTP和HTTPSiptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPT# 允许特定IP访问iptables -A INPUT -s 192.168.1.100 -j ACCEPT# 允许本地回环iptables -A INPUT -i lo -j ACCEPT# 允许已建立的连接iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 删除特定规则iptables -D INPUT -p tcp --dport 80 -j ACCEPT# 按行号删除iptables -D INPUT 3# 清空所有规则iptables -Fiptables -Xiptables -Z
# 设置默认拒绝策略iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT ACCEPT
# 端口范围iptables -A INPUT -p tcp --dport 3000:3010 -j ACCEPT# 多端口iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
# 只在工作时间允许访问iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT
# 限制并发连接数iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT# 限制连接速率iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min --limit-burst 10 -j ACCEPT
# SNAT(源地址转换)iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE# DNAT(目标地址转换)iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
# 保存规则service iptables save# 或者手动保存iptables-save > /etc/sysconfig/iptables# 恢复规则iptables-restore < /etc/sysconfig/iptables
# 安装iptables-persistentapt-get install iptables-persistent# 保存规则netfilter-persistent save# 恢复规则netfilter-persistent reload
预定义的服务配置,包含端口、协议等信息。
提供更复杂的规则配置语法。
# 启动firewalldsystemctl start firewalld# 停止firewalldsystemctl stop firewalld# 重启firewalldsystemctl restart firewalld# 查看状态systemctl status firewalldfirewall-cmd --state
# 查看默认区域firewall-cmd --get-default-zone# 设置默认区域firewall-cmd --set-default-zone=public# 查看活动区域firewall-cmd --get-active-zones# 查看所有区域firewall-cmd --get-zones# 查看区域信息firewall-cmd --zone=public --list-all
# 查看可用服务firewall-cmd --get-services# 查看已开放的服务firewall-cmd --list-services# 添加服务firewall-cmd --add-service=httpfirewall-cmd --add-service=https# 删除服务firewall-cmd --remove-service=http# 永久添加服务firewall-cmd --permanent --add-service=http
# 添加端口firewall-cmd --add-port=8080/tcp# 删除端口firewall-cmd --remove-port=8080/tcp# 查看开放端口firewall-cmd --list-ports# 永久添加端口firewall-cmd --permanent --add-port=8080/tcp
# 创建自定义服务配置文件cat > /etc/firewalld/services/myapp.xml << EOF<?xml version="1.0" encoding="utf-8"?><service> <short>MyApp</short> <description>My Application Service</description> <port protocol="tcp" port="8080"/> <port protocol="tcp" port="8443"/></service>EOF# 重新加载配置firewall-cmd --reload# 添加自定义服务firewall-cmd --add-service=myapp
# 允许特定IP访问特定端口firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept'# 限制连接速率firewall-cmd --add-rich-rule='rule service name="ssh" limit value="10/m" accept'# 阻止特定IPfirewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.200" drop'# 端口转发firewall-cmd --add-rich-rule='rule family="ipv4" forward-port port="80" protocol="tcp" to-port="8080"'
# 将接口绑定到区域firewall-cmd --zone=internal --add-interface=eth1# 查看接口绑定firewall-cmd --get-zone-of-interface=eth1# 更改接口区域firewall-cmd --zone=public --change-interface=eth1
# 启用IP伪装firewall-cmd --add-masquerade# 端口转发firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100# 查看转发规则firewall-cmd --list-forward-ports
#!/bin/bash# Web服务器防火墙配置脚本# 清空现有规则iptables -Fiptables -Xiptables -Z# 设置默认策略iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT ACCEPT# 允许本地回环iptables -A INPUT -i lo -j ACCEPT# 允许已建立的连接iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 允许SSH(限制连接数)iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECTiptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允许HTTP和HTTPSiptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPT# 允许FTPiptables -A INPUT -p tcp --dport 21 -j ACCEPTiptables -A INPUT -p tcp --dport 20 -j ACCEPT# 允许DNSiptables -A INPUT -p udp --dport 53 -j ACCEPT# 保存规则service iptables save
#!/bin/bash# Web服务器防火墙配置脚本# 设置默认区域firewall-cmd --set-default-zone=public# 添加服务firewall-cmd --permanent --add-service=httpfirewall-cmd --permanent --add-service=httpsfirewall-cmd --permanent --add-service=sshfirewall-cmd --permanent --add-service=ftp# 限制SSH连接firewall-cmd --permanent --add-rich-rule='rule service name="ssh" limit value="3/m" accept'# 重新加载配置firewall-cmd --reload
#!/bin/bash# 数据库服务器防火墙配置# 清空现有规则iptables -Fiptables -Xiptables -Z# 设置默认策略iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT ACCEPT# 允许本地回环iptables -A INPUT -i lo -j ACCEPT# 允许已建立的连接iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 允许SSH(仅限管理网段)iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT# 允许MySQL(仅限应用服务器)iptables -A INPUT -s 192.168.1.100 -p tcp --dport 3306 -j ACCEPTiptables -A INPUT -s 192.168.1.101 -p tcp --dport 3306 -j ACCEPT# 保存规则service iptables save
#!/bin/bash# 数据库服务器防火墙配置# 创建数据库区域firewall-cmd --permanent --new-zone=database# 设置默认区域firewall-cmd --set-default-zone=database# 添加SSH服务(限制源IP)firewall-cmd --permanent --zone=database --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'# 添加MySQL服务(限制源IP)firewall-cmd --permanent --zone=database --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="mysql" accept'firewall-cmd --permanent --zone=database --add-rich-rule='rule family="ipv4" source address="192.168.