iptables防火墙语法 表 用以对功能进行分组,最常用的有:
filter表 默认表,负责过滤数据包(常用
nat表 负责网络地址转换
mangle表 用以修改数据包头(不常用
raw表 决定是否对数据包进行状态跟踪(不常用
security表 最不常用的表,与selinux相关,用于MAC(强制访问控制)网络规则
这几张表的处理顺序是: raw→mangle→nat→filter→security
链
规则的有序集合,数据包在经过netfilter时,会进入对应的链进行检查
input 处理入栈请求的包
output 处理出栈包
forward 处理转发数据包,实现不同网段间通信
preorouting 在包做路由选择之前应用的规则
postrouting 在包做路由选择之后应用的规则
iptables语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 iptables [-t 表名] 命令选项 [链名] [匹配条件] [-j 动作] 1.表名-t 指定要操作的表filter nat mangle raw,默认为filter 2.命令选项 对链或规则如何操作添加、删除、查看 3.链名 指定要操作的链,如INPUT、OUTPUT、FORWARD 4.匹配条件 定义数据包特征,如IP 端口 协议等 5.动作-j 匹配后对数据包的处理,如允许 拒绝 记录日志 -N 链名 创建自定义链,用于复杂组织的规则(不常用 -X 链名 删除自定义链(需要先清空链中规则)(不常用 -L 链名 列出链中所有规则 -F 链名 清空链中的所有规则 -Z 链名 重置链的计数器 -A 链名 向链的末尾添加一条规则 -I 链名 [序号] 向链的开头或指定序号插入一条规则(序号默认为1 -D 链名 [序号] 从链中删除一条规则(按序号或完整规则内容 -P 链名 [动作] 设置链的默认策略(ACCEPT/DROP),对未匹配规则的数据包生效 1.链管理 (1)查看规则 iptables -L [chain] iptables -L -n --line-numbers -vx (2)清空规则 iptables -F [chain] iptables -F -t nat (3)链操作 iptables -N custom_chain iptables -X custom_chain iptables -E old_name new_name (4)默认策略设置 iptables -P INPUT DROP (5)清空计数器 iptables -Z [chain] 2.规则管理 (1)添加规则 iptables -A INPUT -p tcp --dport 22 -j ACCEPT ipbtales -I INPUT 1 -p tcp --dport 80 -j ACCEPT iptables -I INPUT -p tcp --dport 443 -j ACCEPT (2)删除规则 iptables -D INPUT 2 iptables -D INPUT -p tcp --dport 80 -j ACCEPT (3)替换规则(不常用 iptables -R INPUT 2 -p tcp --dport 443 -j ACCEPT -p 协议-p tcp -p udp -p icmp -p all -s 源地址 -s 10.0.0.1 -s 192.168.1.0/24 -d 目标地址 -d 8.8.8.8 -d 192.168.10.0/24 -i 入栈接口 -i eth0 -o 出栈接口 -o eth1 --dport 目标端口(范围) --dport 22 --sport 源端口(范围) --sport 1024:65535 iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --sport 1024:65535 -j ACCEPT iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN -j DROP iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p udp --dport 67:68 -j ACCEPT iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT iptables -A INPUT -p tcp -m multiport --sports 22,23,25 -j ACCEPT 3.状态匹配(最常用 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state INVALID -j DROP 4.限制匹配 (1)限制连接速率 iptables -A INPUT -p tcp --dport 80 -m limit 25/minute --limit-brust 100 -j ACCEPT iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT (2)限制连接数 iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP (3)限制同一IP新建连接数 iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT 6.IP范围和时间匹配 (1)IP范围 iptables -A INPUT -m iprange --src-range 192.168.10.1-192.168.10.128 -j DROP iptables -A INPUT -m iprange --dst-range 10.0.0.1-10.0.0.10 -j DROP (2)时间控制 iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Web,Thu,Fri -j ACCEPT iptables -A INPUT -p tcp --dport 80 -m time --timestart 08:00 --timestop 20:00 -j ACCEPT 7.字符串和长度匹配 (1)字符串匹配 iptables -A FORWARD -m string --string "malware.com" --algo bm -j DROP ipatbles -A FORWARD -m string --string "cmd.exe" --algo bm -j DROP (2)包长度匹配 iptables -A INPUT -p tcp --dport 80 -m length --length 0:100 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -m length --length 1000: -j LOG 8.MAC地址匹配 (1)MAC地址过滤 iptables -A INPUT -m mac --mac-source 00:1A:2B:3C:4D:5E -j ACCEPT iptables -A INPUT -m mac --mac-source 00:1A:2B:3C:4D:5E -j DROP
动作类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1.终止类动作(终止规则匹配,立即决定数据包 ACCEPT: 允许数据包通过,继续后续处理 DROP: 丢弃数据包,不返回任何响应 REJECT: 拒绝数据包 2.跳转类动作(跳转到其他链继续处理,常用于自定义链 RETURN: 当数据包进入自定义链后,若匹配到某条RETURN的规则,会停止匹配,回到调用它的默认链,比如INPUT、OUPUT 3.记录类动作(记录日志,继续匹配后续规则 LOG 记录数据包到内核日志,比如调试或监控被拒绝的流量(--log-prefix "DROP:" ) 4.网络地址转换 SNAT: 修改数据包的源IP地址,使数据包从内网发送到公网时,源地址被替换为网关的公网IP,从而实现内网设备通过共享IP访问外部网络 DNAT: 修改数据包的目标IP地址,使外部发送到公网IP的流量被转发到内网的指定设备(端口映射) MASQUERADE: 动态源地址转换啊啊 REDIRECT: 数据包重定向到本地端口 5.标记类动作 MARK: 数据包标记,用于后续操作 CONNMARK: 连接标记,使用mangle表操作 TOS: 服务类型标记,使用mangle表操作 6.特殊处理动作 NOTRACK: 连接跟踪豁免 TTL: 生存时间修改
iptables日志参数
1 2 3 4 --log-prefix <前缀> 日志前缀,用以在日志中识别 --log-level <级别> 日志级别0~7 7为debug 4为warning --log-ip-options 记录IP头部的选项 --log-tcp-flags 记录TCP的标志位
iptables持久化 在linux中,iptables规则默认会在重启后丢失
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 iptables -A INPUT -p tcp --dport 80 -j REJECT apt -y install iptables-persistent netfilter-persistent save systemctl enable netfilter-persistent --now iptables -A INPUT -p tcp --dport 80 -j REJECT iptables-save > /etc/sysconfig/iptables yum -y install iptables-services systemctl disable firewalld --now systemctl enable iptables --now iptables-save > /etc/iptables/rules.v4 iptables-restore < /etc/iptables/rules.v4
iptables最佳实践-filter表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 默认策略设为,对INPUT和FORWARD链默认拒绝所有流量,仅开放明确需要的服务 1.入栈和转发默认策略 iptables -P INPUT DROP iptables -p FORWARD DROP 2.出栈策略 iptables -P OUTPUT ACCEPT 先具体后通用,filter表按照规则顺序匹配,优先放置具体规则,再放置通用规则 1.允许回环接口 iptables -A INPUT -i lo -j ACCEPT 2.允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 比如,当从本机访问一个网站时,发起了一个请求,那网站返回的数据包就是established状态,如果没有这条规则,对方返回的数据包就会被防火墙默认阻止,导致通信失败 1.允许访问http和https iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT 2.允许192.168.10.0/24内网访问ssh iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 22 -j ACCEPT 3.允许特定IP访问数据库端口 iptables -A INPUT -p tcp -s 10.0.0.10 --dport 3306 -j ACCEPT 4.限制ICMP流量 默认禁止外部ping主机,或限制频率防止ICMP洪水攻击 iptables -A INPUT -p icmp --icmp-type echo-request -j DROP iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/min -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j DROP echo "net.ipv4.icmp_echo_ignore_add = 1" >> /etc/sysctl.d/99-icmp.conf
filter表-OUTPUT链操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 建议从"默认允许" 逐步收紧为"默认拒绝 + 明确允许" 1.基础场景,默认允许 (1)允许dns解析 iptables -A OUTPUT -p udp --dport 53 -j ACCEPT (2)允许https(更新软件、api调用 iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT (3)允许对已建立的连接的响应 iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT (4)收紧策略 iptables -P OUTPUT DROP 2.严格场景,默认拒绝 iptables -P OUTPUT DROP (1)允许回环接口 iptables -A OUTPUT -o lo -j ACCEPT (2)允许已建立的连接 iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT (3)允许访问特定外部服务(ntp iptables -A OUTPUT -p udp --dport 123 -j ACCEPT (4)允许ssh其他机器 iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
filter表-FORWARD链操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 仅当本机作为路由器/网关时(3层设备)需要配置,控制不同网络间的流量转发 linux内核默认不允许流量转发,如果要开启流量转发功能,需要配置对应的内核参数: echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/99-forward.confecho "net.ipv6.conf.all.forward = 1" >> /etc/sysctl.d/99-forward.confsysctl -p 示例: 允许内网192.168.1.0/24通过本机转发到公网 1.默认拒绝所有转发流量 iptables -P FORWARD DROP 2.允许内网到公网的转发 iptables -A FORWARD -i eth1 -o eth0 -s 192.168.1.0/24 -j ACCEPT 3.允许公网对上述连接的响应转发回内网 iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT 4.允许外网IP 203.0.113.10 访问内网服务器192.168.1.10 iptables -A FORWARD -s 203.0.113.10 -d 192.168.1.10 -p tcp --dport 22 -j ACCEPT
iptables NAT表最佳实践 nat表包含四条链:PREROUTING、INPUT、OUTPUT、POSTROUTING
POSTROUTING链操作-SNAT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 POSTROUTING链 1.基本SNAT用法 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1-203.0.113.30 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1-203.0.113.30:10000-30000 2.MASQUERADE(动态公网IP) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE --to-ports 1024-65535
PREROUTING链操作-DNAT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 iptables -t nat -A PREROUTING -d 203.0.133.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80 iptables -t nat -A PREROUTING -d 203.0.133.1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80 iptables -t nat -A PREROUTING -d 203.0.133.1 -p tcp --dport 8080-8090 -j DNAT --to-destination 192.168.1.10:8000-8010 iptables -t nat -A PREROUTING -d 203.0.133.1 -p udp --dport 53 -j DNAT --to-destination 192.168.1.53:53 iptables -t nat -A PREROUTING -d 203.0.133.1 -p tcp --dport 80 -m statistic --mode random --probability 0.5 -j DNAT --to-destination 192.168.1.10:80 iptables -t nat -A PREROUTING -d 203.0.133.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.11:80
OUTPUT链操作 用以处理本地产生的数据包
本地进程→OUTPUT链→路由决策→POSTROUTING链→网卡
1 2 3 4 5 6 7 8 9 10 处理所有流经与产生的流量 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.50 (1)不同服务使用不同出口IP(不常用 iptables -t nat -A OUTPUT -m owner --uid-owner nginx -o eth0 -j SNAT --to-source 203.0.113.1 iptables -t nat -A OUTPUT -m owner --uid-owner mysql -o eth0 -j SNAT --to-source 203.0.113.2 iptables -t nat -A OUTPUT -m owner --uid-owner redis -o eth0 -j SNAT --to-source 203.0.113.3
raw、mangle、security表介绍 这三个表都是很少用的表
raw表介绍 raw表是一个特殊表,主要用于连接跟踪conntrack的控制。它的主要特点是与conntrack紧密相关
在数据包进入conntrack之前,对数据包进行的处理,在整个iptables处理流程中,处于最优先的位置 ,其核心特性是绕过内核的链接跟踪机制,因此在需要高性能、低延迟的场景中被广泛使用
注:一旦设置了NOTRACK,就无法使用-m state或-m conntrack来匹配包,只能使用基于端口和ip的过滤规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 iptables -t raw -A PREROUTING -p -udp --dport 53 -j NOTRACK iptables -t raw -A OUTPUT -p udp --sport 53 -j NETRACK (1)性能优化 conntrack需要消耗CPU和内存来维护连接状态表 对于非常高流量的服务器,大量连接可能会导致conntrack表被填满,引发性能问题甚至丢包 (2)避免干扰 某些特殊协议或应用可能不希望被NAT或状态检测干扰,跳过跟踪可以确保这些数据包被原样转发 (3)处理异常 在复杂网络环境下,conntrack可能会错误标记连接状态,导致数据包被错误丢弃 iptables -t raw -A PREROUTING -s 192.168.1.100 -j NOTRACK iptables -t raw -L -n -vx
mangle表介绍 mangle的核心作用是修改数据包的IP头和数据包的一些标志位
可以利用这种标志位对数据包进行过滤或策略路由
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 mangle拥有五个内置链,覆盖了数据包处理的所有阶段(可以在任何阶段改数据包 一般会在PREROUTING改 数据包标记(MARK/CONNMARK)是mangle表最常用的功能,给数据包或连接打标签,然后在其他表中基于这个标签进行不同处理 用法: MARK: 标记单个数据包 -j MARK --set-mark <value> iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1 1.策略路由 基于标记,使用ip rule命令将数据包路由到不同的路由表 (1)mangle标记数据包 iptables -t mangle -A PREROUTING -s 192.168.1.100 -j MARK --set-mark 100 (2)对标记100的数据包使用路由表100 ip rule add fwmark 100 table 100 在路由表100中添加默认路由 ip route add default via 192.168.100.100 table 100 2.修改服务类型 TOS (1)修改ip头重的TOS字段,影响数据包在网络中被处理的优先级 iptables -t mangle -A PREROUTING -p tcp --dport 22 -j TOS --set-tos 0x10 (2)使用tc工具根据标记来分配带宽 iptables -t mangle -A PREROUTING -p udp --dport 5060 -j MARK --set-mark 1 iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 2 3.使用CONNMARK标记整个FTP连接 (1)标记FTP控制连接 iptables -t mangle -A PREROUTING -p tcp --dport 21 -j CONNMARK --set-mark 1 iptables -t mangle -A PREROUTING -p connmark --mark 1 -j CONNMARK --restore-mark 4.修改TTL来隐藏系统 (1)将所有发出包的TTL统一设置为64 iptables -t mangle -A OUTPUT -j TTL --ttl-set 64
security表 Security表是selinux与网络过滤框架的一部分,用于事实基于安全上下文的强制访问控制
selinux不仅控制文件访问,也可以控制网络访问,比如可以规定httpd_t进程只能连接到http_port_t端口
security表就是selinux在网络数据包过滤层面实现其安全策略的钩子点,其核心作用就是:在数据包经过网络栈时,根据相关的安全上下文来允许或拒绝数据包,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 应用场景: 1.精细化进程网络控制 场景:即使一个进程以root运行,selinux也可以阻止它绑定到任意端口,比如默认情况下apache httpd_t只能绑定到被标记为http_port_t的端口80 443 8080 当apache尝试发送一个数据包OUTPUT,security表会检查进程安全上下文,是否被允许连接到目标端口上下文 2.保护系统服务 阻止非特权用户连接到mysql数据库端口 即使攻击者绕过了filter表的防火墙规则,仍然需要通过selinux在security表上实施的上下文检查 很少需要手动调整selinux安全上下文的规则,通常由selinux自动管理 iptables对手动修改security表的规则支持不佳,推荐使用nftables 1.selinux网络控制规则 (1)为ssh连接设置安全上下文 iptables -t security -A INPUT -p tcp --dport 22 -j SECMARK --selctx system_u:object_r:ssh_server_packet_t:s0 (2)为http连接设置安全上下文 iptables -t security -A INPUT -p tcp --dport 80 -j SECMARK --selctx system_u:object_r:http_server_packet_t:s0 (3)为https连接设置安全上下文 iptables -t security -A INPUT -p tcp --dport 443 -j SECMARK --selctx system_u:object_r:https_server_packet_t:s0 2.查看selinux审计日志 cat /var/log/audit/audit.logausearch -m avc -ts recent