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 可以被用来控制网络流量,保障服务器和网络的安全。

相关推荐
groundhappy2 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕2 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫3 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生4 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.115 小时前
linux基础IO
linux·运维·服务器
BelongPanda7 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯7 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_777998347 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器
yunwei377 小时前
eBPF 教程:检查 exec 后真正安装的可执行镜像
linux·开源
笑锝没心没肺8 小时前
yum update 报错:GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
linux·运维·服务器