iptables
是 Linux 中用于设置、维护和检查 IP 数据包过滤规则的命令。它是一个强大的工具,广泛用于网络防火墙、安全性和网络地址转换 (NAT) 等。
以下是 iptables
命令的主要选项及其详细说明。
1. 基本语法
bash
iptables [选项] [链名称] [规则匹配条件] [动作]
[选项]
:指定操作,如新增、删除、插入规则等。[链名称]
:指定iptables
的链,如INPUT
、OUTPUT
、FORWARD
、PREROUTING
等。[规则匹配条件]
:数据包过滤的条件,如源 IP 地址、目标端口等。[动作]
:匹配到的包执行的操作,如ACCEPT
、DROP
、REJECT
等。
2. 链 (Chain
)
iptables
主要有以下几种内置链:
INPUT
:用于控制进入本地系统的数据包。OUTPUT
:用于控制本地系统发送的数据包。FORWARD
:用于控制通过本地系统的数据包(本机不是目的地时)。PREROUTING
:用于在包进入路由之前修改数据包,用于 NAT。POSTROUTING
:用于在包离开路由后修改数据包,用于 NAT。
3. 主要选项
3.1 链管理选项
-
-L
:列出指定链中的所有规则。bashiptables -L
可以查看当前所有规则,也可以加上链名查看特定链的规则。
-
-N
:创建新链。bashiptables -N my_chain
-
-X
:删除自定义链(前提是该链没有规则)。bashiptables -X my_chain
-
-F
:清空指定链中的所有规则。如果不指定链,则清空所有链的规则。bashiptables -F
-
-Z
:将链的计数器清零。bashiptables -Z
3.2 规则管理选项
-
-A
:在指定链的末尾追加一条规则。bashiptables -A INPUT -s 192.168.1.100 -j ACCEPT
允许来自 IP 地址
192.168.1.100
的连接。 -
-I
:在指定链的指定位置插入一条规则(默认在首位)。bashiptables -I INPUT 1 -s 192.168.1.100 -j ACCEPT
在
INPUT
链的第一个位置插入一条规则,允许192.168.1.100
的连接。 -
-D
:删除指定链中的规则。可以通过规则编号或直接匹配规则来删除。bashiptables -D INPUT 1
删除
INPUT
链中的第一条规则。 -
-R
:替换指定链中的某条规则。bashiptables -R INPUT 1 -s 192.168.1.101 -j ACCEPT
替换
INPUT
链的第一条规则,允许192.168.1.101
的连接。 -
-P
:设置默认策略(即当数据包不匹配任何规则时的默认动作)。bashiptables -P INPUT DROP
设置
INPUT
链的默认策略为丢弃所有不匹配的包。
3.3 匹配条件选项
-
-s
,--source
:指定源 IP 地址。bashiptables -A INPUT -s 192.168.1.100 -j ACCEPT
匹配来自
192.168.1.100
的数据包。 -
-d
,--destination
:指定目标 IP 地址。bashiptables -A OUTPUT -d 192.168.1.200 -j ACCEPT
匹配发往
192.168.1.200
的数据包。 -
-p
,--protocol
:指定协议类型(如tcp
、udp
、icmp
)。bashiptables -A INPUT -p tcp -j ACCEPT
匹配 TCP 协议的数据包。
-
--sport
:指定源端口号(仅适用于tcp
或udp
协议)。bashiptables -A INPUT -p tcp --sport 22 -j ACCEPT
允许来自端口
22
的 TCP 包(通常是 SSH)。 -
--dport
:指定目标端口号。bashiptables -A INPUT -p tcp --dport 80 -j ACCEPT
允许访问本机
80
端口(HTTP)。 -
-i
,--in-interface
:指定进入的网络接口。bashiptables -A INPUT -i eth0 -j ACCEPT
允许所有从接口
eth0
进来的包。 -
-o
,--out-interface
:指定离开的网络接口。bashiptables -A OUTPUT -o eth0 -j ACCEPT
允许所有从接口
eth0
发出的包。 -
-m state --state
:使用连接跟踪模块,匹配数据包的连接状态。bashiptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
允许新连接和已建立的连接的数据包。
-
-m limit
:限制数据包匹配速率。bashiptables -A INPUT -p icmp -m limit --limit 1/second -j ACCEPT
限制每秒最多接受 1 个 ICMP 数据包(防止 ICMP 洪水攻击)。
3.4 动作选项
-
-j
,--jump
:指定匹配条件满足时跳转到的动作 或目标链。ACCEPT
:允许数据包通过。DROP
:丢弃数据包,不作任何响应。REJECT
:拒绝数据包,并返回错误信息 (比如icmp-port-unreachable
)。LOG
:记录日志,但不阻止数据包的继续处理。
示例:
bashiptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP Access: " iptables -A INPUT -p tcp --dport 80 -j DROP
-
RETURN
:从自定义链返回到上一个链。示例:
bashiptables -N my_chain iptables -A my_chain -j RETURN
3.5 NAT 相关选项
-
-t nat
:选择 NAT 表进行操作。NAT 表用于网络地址转换,常见的用途是端口映射、源 IP 地址转换等。PREROUTING
:在数据包被路由之前应用规则。POSTROUTING
:在数据包被路由之后应用规则。OUTPUT
:在本地生成的数据包上应用 NAT 规则。
示例:端口转发(将
80
端口的访问转发到8080
端口)bashiptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
3.6 保存与恢复规则
-
保存规则:
bashiptables-save > /etc/iptables/rules.v4
-
恢复规则:
bashiptables-restore < /etc/iptables/rules.v4
4. 常用的综合示例
-
允许 SSH 访问(TCP 22 端口):
bashiptables -A INPUT -p tcp --dport 22 -j ACCEPT
-
允许 HTTP/HTTPS 访问:
bashiptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
-
拒绝所有其他流量:
bashiptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT
通过这些规则,iptables
可以被用来控制网络流量,保障服务器和网络的安全。