1. 命令简介
ip6tables 是 Linux 系统上用于配置 IPv6 数据包过滤规则的用户空间命令行工具。它是 Netfilter 项目的一部分,与用于 IPv4 的 iptables 工具相对应。
ip6tables 允许系统管理员定义规则链(chains),以检查、修改、转发、丢弃或接受流经系统的 IPv6 网络数据包,从而实现基于 IPv6 的防火墙、网络地址转换(NAT)和包过滤功能。
2. 语法格式
plaintext
ip6tables [-t table] command [chain] [match-condition] -j target [target-options]基本结构说明:
[-t table]: 指定要操作的表,如 filter、nat、mangle、raw。默认为 filter 表。command: 对规则链执行的操作,如 -A (追加)、-I (插入)、-D (删除)、-L (列出) 等。[chain]: 指定要操作的规则链,如 INPUT、OUTPUT、FORWARD,或用户自定义链。[match-condition]: 定义规则匹配数据包的条件,如源 / 目标地址、协议、端口、网络接口等。-j target: 指定当数据包匹配规则时要执行的动作(目标),如 ACCEPT、DROP、REJECT、LOG 等。[target-options]: 某些目标(如 LOG、REJECT)的额外选项。
3. 常用选项及说明
表选择选项
表格
| 选项 | 说明 |
|---|---|
| -t, --table <table> | 指定要操作的表。可选值:filter (默认), nat, mangle, raw, security。 |
命令选项(对链或规则的操作)
表格
| 选项 | 说明 |
|---|---|
| -A, --append <chain> <rule-specification> | 在指定链的末尾追加一条新规则。 |
| -I, --insert <chain> [rulenum] <rule-specification> | 在指定链的指定位置(默认为第 1 条)插入一条新规则。 |
| -D, --delete <chain> <rule-specification> 或 -D, --delete <chain> rulenum | 从指定链中删除一条匹配的规则或指定序号的规则。 |
| -R, --replace <chain> rulenum <rule-specification> | 替换指定链中指定序号的一条规则。 |
| -L, --list [chain] | 列出指定链(或所有链)中的所有规则。常与 -n (数字输出)、-v (详细信息)、--line-numbers (显示行号) 结合使用。 |
| -F, --flush [chain] | 清空指定链(或所有链)中的所有规则。 |
| -Z, --zero [chain] | 将指定链(或所有链)中所有规则的包计数器和字节计数器清零。 |
| -N, --new-chain <chain> | 创建一个新的用户自定义链。 |
| -X, --delete-chain [chain] | 删除指定的用户自定义链(必须为空且未被引用)。 |
| -P, --policy <chain> <target> | 设置指定链的默认策略(target),如 ACCEPT, DROP。 |
| -E, --rename-chain <old-chain> <new-chain> | 重命名一个用户自定义链。 |
匹配条件选项
表格
| 选项 | 说明 |
|---|---|
| -p, --protocol <protocol> | 匹配指定的协议。如 tcp, udp, icmpv6, esp, ah, all (默认)。 |
| -s, --source <address>[/mask] | 匹配数据包的源 IPv6 地址。 |
| -d, --destination <address>[/mask] | 匹配数据包的目标 IPv6 地址。 |
| -i, --in-interface <name> | 匹配数据包进入的网络接口名称。 |
| -o, --out-interface <name> | 匹配数据包离开的网络接口名称。 |
| -m, --match <match> | 指定扩展匹配模块,如 state (连接状态), multiport (多端口), limit (速率限制) 等。 |
| --sport, --source-port <port>[:<port>] | 匹配 TCP/UDP 数据包的源端口(需配合 -p tcp 或 -p udp 使用)。 |
| --dport, --destination-port <port>[:<port>] | 匹配 TCP/UDP 数据包的目标端口(需配合 -p tcp 或 -p udp 使用)。 |
| --icmpv6-type <type>[/code] | 匹配指定类型的 ICMPv6 数据包(需配合 -p icmpv6 使用)。 |
目标选项(动作)
表格
| 选项 | 说明 |
|---|---|
| -j, --jump <target> | 指定匹配规则后要执行的动作。常见值:ACCEPT: 接受数据包。DROP: 丢弃数据包,无响应。REJECT: 拒绝数据包,并返回错误响应(如 --reject-with icmp6-port-unreachable)。LOG: 记录数据包信息到系统日志。RETURN: 从当前链返回上一级调用链。<user-chain>: 跳转到用户自定义链。 |
| -g, --goto <chain> | 跳转到指定链,处理完成后不返回原链。 |
其他常用选项
表格
| 选项 | 说明 |
|---|---|
| -n, --numeric | 以数字形式显示地址和端口(不进行 DNS 解析和服务名查找)。 |
| -v, --verbose | 显示详细信息,如数据包和字节计数、接口等。 |
| --line-numbers | 与 -L 一起使用时,显示规则在链中的序号。 |
| -c, --set-counters <packets> <bytes> | 在创建或替换规则时,初始化该规则的包计数器和字节计数器。 |
4. 示例用法
示例 1:查看现有规则
以数字形式并显示行号,列出 filter 表的所有规则。
bash
运行
ip6tables -L -n --line-numbers示例 2:允许来自特定 IPv6 地址范围的 SSH 连接
在 INPUT 链的开头插入一条规则,允许源地址为 2001:db8::/32 的网络通过 TCP 协议访问本机的 22 端口。
bash
运行
ip6tables -I INPUT -s 2001:db8::/32 -p tcp --dport 22 -j ACCEPT示例 3:丢弃所有发往本机的 ICMPv6 回显请求(Ping)
在 INPUT 链追加一条规则,丢弃类型为 128 (Echo Request) 的 ICMPv6 数据包。
bash
运行
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP示例 4:设置默认策略并记录被拒绝的包
先将 INPUT 链的默认策略设为 DROP,然后在链尾添加规则,记录所有被拒绝进入的数据包到系统日志(前缀为 "IPv6-Dropped:"),最后再丢弃。
bash
运行
ip6tables -P INPUT DROP ip6tables -A INPUT -j LOG --log-prefix "IPv6-Dropped: " --log-level 4 ip6tables -A INPUT -j DROP5. 注意事项
- 规则顺序至关重要:ip6tables 从上到下按顺序匹配规则。第一条匹配的规则将决定数据包的命运。请仔细规划规则的插入 (-I) 和追加 (-A) 位置。
- 配置非持久化:通过命令行添加的规则在系统重启后会失效。要使规则永久生效,需要使用发行版特定的方法保存配置(例如,在 Debian/Ubuntu 上使用 ip6tables-save 和 ip6tables-restore,或使用 netfilter-persistent 等工具)。
- 谨慎设置默认策略:将默认策略(如 INPUT、FORWARD)设置为 DROP 前,务必确保已添加允许管理员远程访问(如 SSH)的规则,否则可能导致无法远程管理服务器。
- IPv6 的特殊性:IPv6 的邻居发现(ND)、路由通告(RA)等核心功能依赖 ICMPv6。过于严格的防火墙规则可能会破坏 IPv6 网络的基本连通性。在丢弃 ICMPv6 流量时需格外小心。
- 权限要求:配置 ip6tables 规则通常需要 root 权限(使用 sudo)。
获取更多Linux学习资料请关注“阿成学长工具包”,对话框中输入2647获取