iptables
是什么
Linux 系统中用于管理和操作网络包过滤规则的工具,是 Linux 内核中的 Netfilter 框架的用户态接口。它的主要作用是配置防火墙、网络地址转换(NAT)和流量控制规则,从而实现对进出网络的数据包进行监控和管理。
基本概念
- 三个主要的chains
- input:处理所有进入主机的流量
- output:处理所有主机发出的流量
- forward:处理所有经过主机发出的流量
- tables
- filter:根据数据包的IP地址、端口等信息来决定接受还是丢弃数据包,多用于防火墙规则配置
- nat:用于网络地址转换的转换规则,当包进入协议栈时,nat中的规则决定是否修改以及如何修改数据包的源、目的IP地址以及端口号信息,以及改变包被路由时的行为
- mangle:用于修改数据包的包头
- raw:允许用户根据
connection tracking表配置规则,比如忽略connection tracking中的有效信息
这里是 iptables 的基本流程:
- 包接收: 当一个包到达 Linux 系统时,系统会将其传递给
iptables。 - 规则匹配:
iptables将包与所有定义的规则进行比较。如果该包与某个规则相符,则会执行相应的动作。 - 动作执行: 根据规则的类型,
iptables可以执行以下动作用:ACCEPT:允许该包通过本机网络。DROP:拒绝该包,并将其丢弃。REJECT:将该包传回源IP(通常是接口的原始 IP)。LOG:记录相关信息并继续运行包。
- 规则链:
iptables有两个主要的规则链:INPUT和OUTPUT。其中,INPUT规则负责处理到达本机网络的包,而OUTPUT规则则负责从本机网络发出包。
常见参数
-A append,表示追加规则,追加到规则表的末尾
-I insert,表示插入到链的指定位置,默认为最前面
-D delete,表示删除
-R replace,表示替换
-X 选项可以快速删除不再需要的规则,这个命令可以应用于任何链,包括 INPUT, OUTPUT, FORWARD
-Z 重制计数器
-t表示选择表,摩恩为filter表
- 设置协议
-p 指定协议,如tcp、udp、icmp、all等
- 设置端口
—sport 指定源端口
—dport 指定目标端口
- 设置IP
-s 或 —source指定源IP
-d 或 —destination指定目标IP
- 设置网卡
-i或—in-interface 指定进入的网络接口
-o或—out-interface 指定离开的网络接口
- 设置匹配条件
-m state 用于匹配连接状态,如NEW、ESTABLISHED、RELATED、INVALID
-m time 根据时间段匹配流量
- 限流
—limit 限制每分钟的最大连接数
—limit-burst 触发限制前允许的处罚突发流量
- others
-f 或 —fragment匹配数据包片段
—tcp-flags 匹配TCP标志,如SYN、ACK
example
# 清空现有规则和自定义链
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
# 默认策略:拒绝所有入站和转发流量,允许所有出站流量
# -P 的缩写来自 English 的 "default"(默认),它表示为指定的链设定为默认行为
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许 loopback 接口 (127.0.0.1) 的流量
# 指定接口类型
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许已经建立或相关的连接继续通信
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许内网 IP (192.168.0.0/16) 的 SSH、HTTP 和 HTTPS 访问
iptables -A INPUT -s 192.168.0.0/16 -p tcp -m multiport --dports 22,80,443 -m conntrack --ctstate NEW -j ACCEPT
# 禁止外部 ping 请求
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# 限制外部 HTTP 连接速率,最多10个新连接/秒,允许最多50个突发连接
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit 10/sec --limit-burst 50 -j ACCEPT
# 允许与外部数据库服务器通信 (MySQL)
iptables -A OUTPUT -p tcp --dport 3306 -m conntrack --ctstate NEW -j ACCEPT
# 记录所有被拒绝的入站请求
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
# 拒绝所有其他未匹配的入站流量
iptables -A INPUT -j REJECT