iptables 命令详解

iptables 是 Linux 中用于设置、维护和检查 IP 数据包过滤规则的命令。它是一个强大的工具,广泛用于网络防火墙、安全性和网络地址转换 (NAT) 等。

以下是 iptables 命令的主要选项及其详细说明。

1. 基本语法

bash 复制代码
iptables [选项] [链名称] [规则匹配条件] [动作]
  • [选项]:指定操作,如新增、删除、插入规则等。
  • [链名称] :指定 iptables 的链,如 INPUTOUTPUTFORWARDPREROUTING 等。
  • [规则匹配条件]:数据包过滤的条件,如源 IP 地址、目标端口等。
  • [动作] :匹配到的包执行的操作,如 ACCEPTDROPREJECT 等。

2. 链 (Chain)

iptables 主要有以下几种内置链:

  • INPUT:用于控制进入本地系统的数据包。
  • OUTPUT:用于控制本地系统发送的数据包。
  • FORWARD:用于控制通过本地系统的数据包(本机不是目的地时)。
  • PREROUTING:用于在包进入路由之前修改数据包,用于 NAT。
  • POSTROUTING:用于在包离开路由后修改数据包,用于 NAT。

3. 主要选项

3.1 链管理选项
  • -L:列出指定链中的所有规则。

    bash 复制代码
    iptables -L

    可以查看当前所有规则,也可以加上链名查看特定链的规则。

  • -N:创建新链。

    bash 复制代码
    iptables -N my_chain
  • -X:删除自定义链(前提是该链没有规则)。

    bash 复制代码
    iptables -X my_chain
  • -F:清空指定链中的所有规则。如果不指定链,则清空所有链的规则。

    bash 复制代码
    iptables -F
  • -Z:将链的计数器清零。

    bash 复制代码
    iptables -Z
3.2 规则管理选项
  • -A:在指定链的末尾追加一条规则。

    bash 复制代码
    iptables -A INPUT -s 192.168.1.100 -j ACCEPT

    允许来自 IP 地址 192.168.1.100 的连接。

  • -I:在指定链的指定位置插入一条规则(默认在首位)。

    bash 复制代码
    iptables -I INPUT 1 -s 192.168.1.100 -j ACCEPT

    INPUT 链的第一个位置插入一条规则,允许 192.168.1.100 的连接。

  • -D:删除指定链中的规则。可以通过规则编号或直接匹配规则来删除。

    bash 复制代码
    iptables -D INPUT 1

    删除 INPUT 链中的第一条规则。

  • -R:替换指定链中的某条规则。

    bash 复制代码
    iptables -R INPUT 1 -s 192.168.1.101 -j ACCEPT

    替换 INPUT 链的第一条规则,允许 192.168.1.101 的连接。

  • -P:设置默认策略(即当数据包不匹配任何规则时的默认动作)。

    bash 复制代码
    iptables -P INPUT DROP

    设置 INPUT 链的默认策略为丢弃所有不匹配的包。

3.3 匹配条件选项
  • -s--source:指定源 IP 地址。

    bash 复制代码
    iptables -A INPUT -s 192.168.1.100 -j ACCEPT

    匹配来自 192.168.1.100 的数据包。

  • -d--destination:指定目标 IP 地址。

    bash 复制代码
    iptables -A OUTPUT -d 192.168.1.200 -j ACCEPT

    匹配发往 192.168.1.200 的数据包。

  • -p--protocol :指定协议类型(如 tcpudpicmp)。

    bash 复制代码
    iptables -A INPUT -p tcp -j ACCEPT

    匹配 TCP 协议的数据包。

  • --sport :指定源端口号(仅适用于 tcpudp 协议)。

    bash 复制代码
    iptables -A INPUT -p tcp --sport 22 -j ACCEPT

    允许来自端口 22 的 TCP 包(通常是 SSH)。

  • --dport:指定目标端口号。

    bash 复制代码
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT

    允许访问本机 80 端口(HTTP)。

  • -i--in-interface:指定进入的网络接口。

    bash 复制代码
    iptables -A INPUT -i eth0 -j ACCEPT

    允许所有从接口 eth0 进来的包。

  • -o--out-interface:指定离开的网络接口。

    bash 复制代码
    iptables -A OUTPUT -o eth0 -j ACCEPT

    允许所有从接口 eth0 发出的包。

  • -m state --state:使用连接跟踪模块,匹配数据包的连接状态。

    bash 复制代码
    iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT

    允许新连接和已建立的连接的数据包。

  • -m limit:限制数据包匹配速率。

    bash 复制代码
    iptables -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:记录日志,但不阻止数据包的继续处理。

    示例:

    bash 复制代码
    iptables -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:从自定义链返回到上一个链。

    示例:

    bash 复制代码
    iptables -N my_chain
    iptables -A my_chain -j RETURN
3.5 NAT 相关选项
  • -t nat:选择 NAT 表进行操作。NAT 表用于网络地址转换,常见的用途是端口映射、源 IP 地址转换等。

    • PREROUTING:在数据包被路由之前应用规则。
    • POSTROUTING:在数据包被路由之后应用规则。
    • OUTPUT:在本地生成的数据包上应用 NAT 规则。

    示例:端口转发(将 80 端口的访问转发到 8080 端口)

    bash 复制代码
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
3.6 保存与恢复规则
  • 保存规则

    bash 复制代码
    iptables-save > /etc/iptables/rules.v4
  • 恢复规则

    bash 复制代码
    iptables-restore < /etc/iptables/rules.v4

4. 常用的综合示例

  1. 允许 SSH 访问(TCP 22 端口):

    bash 复制代码
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  2. 允许 HTTP/HTTPS 访问

    bash 复制代码
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  3. 拒绝所有其他流量

    bash 复制代码
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT

通过这些规则,iptables 可以被用来控制网络流量,保障服务器和网络的安全。

相关推荐
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush44 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5204 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩4 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言