iptables 介绍

iptables basics

Introduction#

iptables 是一个配置 Linux 防火墙的工具,是 netfilter 项目的一部分。
Linux Kernel 3.13 及以上版本中, nftables 将作为后继者取代 iptables 以成为更强大易用的防火墙工具

Basic Concepts#

工作方式#

  1. iptables 作为防火墙, 一般是有 两种策略, 可以通过配置规则来决定是拒绝请求、转发请求或者改写请求数据。

  2. iptables 包含 table, chain, rule, target 等概念
    iptables 的有机组预定义好的 table, 每个 table 包含若干个预定义好的 chain, 每条 chain 都由 0 ~ N 个 rule 组成,
    每个 rule 包含多个匹配条件,条件匹配后有个 target 作为最终的目标(action)

    • 几组预定义的 table,

      • filter: 用于存放与防火墙相关配置的表,也是默认表
      • nat: 用于 NAT 操作
      • mangle: 用于对特定 packet 的数据修改
      • raw: 用来配置规则,消除对特定 packet 的信息记录
      • security: 用于 强制访问配置 的,如 SELinux 使用的规则
        最常用的是 natfilter 这两个 table
    • 预定义的 chain:

      • INPUT: 处理输入数据包
      • FORWARD: 处理转发数据包
      • OUTPUT: 处理输出数据包
      • PREROUTING: 用于目标地址转换 (DNAT)
      • POSTROUTING: 用于源地址转换 (SNAT)
    • 预定义的 target:

      • ACCEPT: 接收数据包
      • DROP: 丢弃数据包
      • REDIRECT: 重定向、映射、透明代理
      • SNAT: 源地址转换
      • DNAT: 目标地址转换
      • MASQUERADE: IP 伪装(NAT)
      • LOG: 日志记录
    • 每个 rule 包含 predicate 条件和匹配该条件的 target (可以认为是 action),
      匹配对应的 predicate 则执行对应的 target 动作,否则,忽略该条 rule,开始对下一条 rule 匹配。
      如果匹配到 chain 的结尾,则返回到 跳转到跳转前的 chain

    • filter 表包含的 chain 为: INPUT, FORWARD, OUTPUT

    • nat 包含的 chain 为: PREROUTING, FORWARD, POSTROUTING

    • mangle 包含的 chain 为: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

Examples#

各种常用场景的使用: 封 ip、协议、端口,限制连接数、请求数、并发数等,转发端口、ip、协议控制,改写数据包内容

  1. 日常操作命令

    Copy
    # iptables -L -n -v # 展示 filter 表中的所有 chain 的规则, -n 以精确的 ip、数字替代名字, -v 展示详细信息 # iptables -t nat -L # 展示 nat 表中的所有 chain 的规则 # iptables -F # 清空 filter 中所有 chain 的 rules # iptables -t nat -F # 清空 nat 表中所有 chain 的 rules # iptables -t nat -F FORWARD # 清空 nat 表中的 FORWARD chain 中所有 rules # iptables -S [chain] # 列出 filter 表中的指明的 chain 中的所有 rules,如果 [chain] 不填,则列出对应 table 下所有 chain 的 rules # iptables -z [chain [rulenum]] # 清空 filter 表中 [chain] 中的某个 rule [rulenum], 如果 [chain] 或者 [rulenum] 不指定 # iptables -A chain rule-specification # 将 rule-specification 插入到 filter 表中的 chain 中
  2. 禁止访问本地 loop 地址, 如禁止访问本地 127.0.0.1 地址:

    Copy
    # iptables -A INPUT -i lo -d 127.0.0.1 -j DROP
  3. 禁止访问某个 ip 、某个网段、某个网址:

    Copy
    # iptables -A OUTPUT -d 192.168.1.1 -j DROP # 禁止访问 192.168.1.1 这个 ip # iptables -A OUTPUT -d 192.168.1.0/24 -j DROP # 禁止访问 192.168.1.0/24 这个网段
  4. 禁止访问某个 ip 的某种协议:

    Copy
    # iptables -A OUTPUT -i eth0 -d 54.222.178.154 -p tcp -j DROP # 禁止我们的 internal 服务器
  5. 开放本机端口:

    Copy
    # iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启本机 tcp 80 端口 # iptables -A INPUT -p icmp --icmp-type 8 -J ACCEPT # 允许被 ping 通 # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接能让数据进来
  6. 配置 ip 白名单:

    Copy
    # iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许 192.168.1.0/24 网段的机器访问当前机器 # iptables -A INPUT -p tcp -s 192.168.2.1 --dport 3306 # 允许 ip 为 192.168.2.1 的机器访问本机 3306 端口 (mysql 标准端口)
  7. 启动 nat 转发:

    Copy
    # iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 54.222.178.154 # 让 192.168.1.0/24 网段机器可以通过 54.222.178.154 访问网络
  8. 端口映射:

    Copy
    # iptables -t nat -A PREROUTING -d 127.0.0.1 -p tcp --dport 2222 -j DNAT --to-dest 54.222.178.154:22 # 访问本地 2222 端口会被转发到 internal 机器的 22 端口 (ssh 转发)
  9. 防止 tcp syn flooding attack:

    Copy
    # iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
  10. 字符串匹配

Copy
# iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset # tcp 包中一旦出现 "test" 数据,则 重置该 tcp 连接

References#

  1. iptables - ArchLinux wiki
  2. iptables traverse
  3. iptables - WikiPedia
  4. Netfilter Packet Flow
  5. Iptables Tutorial
  6. iptables 详解
  7. 防火墙与 NAT - 鸟哥的私房菜
  8. iptables 设定入门
posted @   Yxh_blogs  阅读(120)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示
CONTENTS