跳至内容

实验 8: iptables

目标

完成本实验后,您将能够

  • 配置基本 IP 过滤规则
  • 配置 IP 转发

预计完成本实验所需时间:60 分钟

我总是使用 iptables 在我的 Linux 机器上。看看 - 即使你不想阻止黑客,你也可以做一些事情,比如阻止像*doubleclick.com*这样的广告网站和其他邪恶的家伙。或者你只是想做更多的日志记录?…Iptables 规则!

-- 小布什

iptables

iptables 是一个用于管理 Linux 内核的 IPv4 数据包过滤和 NAT 子系统的工具。该子系统被称为 netfilter。

iptables 命令行实用程序提供了管理该子系统的前端(用户空间)工具。它用于设置、维护和检查内核中 IP 数据包过滤规则表。可以定义多个不同的表。

下面描述了 iptables 讨论中使用的一些常见术语。

默认情况下,大多数 Linux 内核中定义了三个独立的表。任何时候都存在的表取决于内核配置选项以及哪些模块存在。这些表是

  • filter: 这是主要和默认表(如果没有传递 -t 选项)。它包含内置链

    • INPUT (用于传入机器本身的数据包)
    • FORWARD (用于通过机器路由的数据包)
    • OUTPUT (用于本地生成的数据包)。
  • nat: 当遇到创建新连接的数据包时,将查询此表。它包含以下三个内置链

    • PREROUTING (用于在数据包进入时立即更改数据包)
    • OUTPUT (用于在路由之前更改本地生成的数据包)
    • POSTROUTING (用于在数据包即将传出时更改数据包)
  • mangle: 此表用于专门的数据包更改。它有以下 5 个内置链

    • PREROUTING (用于在路由之前更改传入数据包)
    • OUTPUT (用于在路由之前更改本地生成的数据包)
    • INPUT (用于传入机器本身的数据包)
    • FORWARD (用于更改通过机器路由的数据包)
    • POSTROUTING (用于在数据包即将传出时更改数据包)

链是规则列表,可以匹配一组数据包。每个规则指定对匹配数据包执行的操作。每个表都包含多个内置链,还可以包含用户定义的链。

目标

防火墙规则指定数据包的条件和目标。如果数据包不匹配,则检查链中的下一条规则;如果匹配,则下一条规则由目标的值指定,目标的值可以是用户定义链的名称,也可以是特殊值 ACCEPT、DROP、QUEUE 或 RETURN 之一。

Usage: iptables -[ACD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

Commands:
Either long or short options are allowed.
  --append  -A chain Append to chain
  --check   -C chain Check for the existence of a rule
  --delete  -D chain Delete matching rule from chain
  --delete  -D chain rulenum
    Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]
    Insert in chain as rulenum (default 1=first)
  --replace -R chain rulenum
    Replace rule rulenum (1 = first) in chain
  --list    -L [chain [rulenum]]
    List the rules in a chain or all chains
  --list-rules -S [chain [rulenum]]
    Print the rules in a chain or all chains
  --flush   -F [chain] Delete all rules in  chain or all chains
  --zero    -Z [chain [rulenum]]
    Zero counters in chain or all chains
  --new     -N chain Create a new user-defined chain
  --delete-chain
    -X [chain] Delete a user-defined chain
  --policy  -P chain target
    Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
                Change chain name, (moving any references)

Options:
    --ipv4 -4 Nothing (line is ignored by ip6tables-restore)
    --ipv6 -6 Error (line is ignored by iptables-restore)
[!] --protocol -p proto protocol: by number or name, eg. `tcp'
[!] --source -s address[/mask][...]
        source specification
[!] --destination -d address[/mask][...]
        destination specification
[!] --in-interface -i input name[+]
        network interface name ([+] for wildcard)
 --jump -j target
    target for rule (may load target extension)
  --goto      -g chain
    jump to chain with no return
  --match -m match
    extended match (may load extension)
  --numeric -n numeric output of addresses and ports
[!] --out-interface -o output name[+]
    network interface name ([+] for wildcard)
  --table -t table table to manipulate (default: `filter')
  --verbose -v verbose mode
  --wait -w [seconds] maximum wait to acquire xtables lock before give up
  --line-numbers print line numbers when listing
  --exact -x expand numbers (display exact values)
[!] --fragment -f match second or further fragments only
  --modprobe=<command> try to insert modules using this command
  --set-counters -c PKTS BYTES set the counter during insert/append
[!] --version -V print package version.

练习 1

iptables 基础

本练习将教你一些 iptables 基础知识。特别是,您将学习如何查看或列出 iptables 规则、创建基本过滤规则、删除规则、创建/删除自定义链等等。

事不宜迟,让我们直接开始使用 iptables

要查看当前规则

  1. 以超级用户身份登录后,列出过滤器表中的所有规则。输入

    [root@serverXY root]# iptables -L
    
  2. 要查看更详细的输出,请输入

    [root@serverXY root]# iptables -L -v
    
  3. 仅显示 INPUT 链下的规则。输入

    [root@serverXY root]# iptables -v  -L INPUT
    
  4. 显示 mangle 表下的所有规则。输入

    [root@serverXY root]#  iptables  -L  -t   mangle
    
  5. 显示 nat 表下的所有规则。输入

    [root@serverXY root]# iptables -L -t nat
    

要刷新所有当前规则

  1. 清除(或删除)当前可能加载的所有规则。输入

    [root@serverXY root]# iptables --flush
    

要创建您自己的链

  1. 创建您自己的自定义链并将其命名为“mychain”。输入

    [root@serverXY root]# iptables  -N  mychain
    
  2. 列出您在上面创建的链下的规则。输入

    [root@serverXY root]# iptables  -L mychain
    
    Chain mychain (0 references)
    
    target     prot opt source               destination
    

要删除链

  1. 首先尝试删除内置的 INPUT 链。输入

    [root@serverXY root]# iptables -X INPUT
    

    问题

    您的输出是什么?

  2. 接下来尝试删除您在上面创建的链。输入

    [root@serverXY root]# iptables -X mychain
    
  3. 尝试再次列出您刚刚删除的链中的规则。输入

    [root@serverXY root]# iptables -L  mychain
    

练习 2

基本数据包过滤

本练习将教您如何创建更高级的数据包过滤规则。特别是,您将阻止来自您的合作伙伴系统的所有 ICMP 数据包类型。

要过滤 ICMP 数据包类型

  1. 在开始之前,请确保您可以 ping 您的合作伙伴系统,并且您的合作伙伴系统也可以成功 ping 您。输入

    [root@serverXY root]# ping -c 2 serverPR
    
    <SNIP>
    
    --- serverPR ping statistics ---
    
    2 packets transmitted, 2 received, 0% packet loss, time 1005ms
    
    ...............................................
    
  2. 刷新您所有现有的规则。输入

    [root@serverXY root]# iptables -F
    
  3. 创建一个规则来阻止所有传出的 icmp 类型数据包到任何目的地。输入

    [root@serverXY root]# iptables  -A  OUTPUT  -o  eth0 -p  icmp  -j  DROP
    

    用通俗易懂的语言来说,前面的命令可以解释为:“将一条规则附加到过滤器表中的 OUTPUT 链。让这条规则丢弃通过 eth0 接口传出的所有 ICMP 类型数据包

  4. 通过尝试 ping serverPR 来测试您上面规则的效果。输入

    [root@serverXY root]# ping -c 2 serverPR
    
    PING serverPR (10.0.5.8) 56(84) bytes of data.
    
    ping: sendmsg: Operation not permitted
    
    ping: sendmsg: Operation not permitted
    
  5. 查看您刚刚创建的规则。输入

    [root@serverXY root]# iptables  -vL OUTPUT
    
    Chain OUTPUT (policy ACCEPT 21221 packets, 2742K bytes)
    
    pkts bytes target     prot   opt    in         out         source             destination
    
    93  7812 DROP     icmp    --  any         eth0    anywhere          anywhere
    
  6. 刷新所有规则,并从两个系统中再次尝试 ping 命令。

    问题

    成功还是失败?

  7. 现在创建另一个规则,该规则将丢弃来自特定不需要的 IP 地址(例如 172.16.0.44 )的 icmp 数据包。输入

    [root@serverXY root]# iptables -A INPUT -i eth0 -p icmp --source 172.16.0.44 -j DROP
    

    您会用通俗易懂的语言来理解上面的命令:“将一条规则附加到过滤器表中的 INPUT 链。让这条规则丢弃所有源地址为 172.16.0.44 的 ICMP 类型数据包

  8. 要测试此规则的效果,您可以让实验室中任何其他人(没有分配 172.16.0.44 IP 地址)尝试 ping 您。成功还是失败?

  9. 不要刷新您表中的所有规则。仅删除您上面创建的规则。为此,您需要知道规则号。要找出规则号,请输入

    [root@serverXY root]# iptables -vL  INPUT --line-numbers
    
    Chain INPUT (policy ACCEPT 31287 packets, 9103K bytes)
    
    num   pkts  bytes   target        prot opt     in     out       source               destination
    
    1        486   40824  DROP       icmp --    eth0   any     serverPR             anywhere
    

    上面的示例输出中已突出显示包含规则号的列。

  10. 使用与您要删除的规则匹配的行号,您可以通过运行以下命令删除 INPUT 链中的特定规则(行号 1)

    [root@serverXY root]# iptables -D INPUT 1
    

要过滤其他类型的流量

在本练习中,您将学习如何过滤 tcp 类型的流量。

流行的 ftp 协议是基于 TCP 的服务。这意味着它通过 TCP 类型的数据包传输。

在以下步骤中,我们将探索针对和过滤来自给定 IP 地址的 FTP 类型流量。

  1. 启动您在之前的某个实验室中配置并启用的 ftp 服务器。输入

    [root@serverXY root]# *service vsftpd restart*
    
    Shutting down vsftpd: [  OK  ]
    
    Starting vsftpd for vsftpd: [  OK  ]
    
  2. 请您的合作伙伴尝试以匿名用户身份登录您的 ftp 服务器。确保您的合作伙伴能够从 serverPR 成功登录 - 在您继续执行下一步之前执行此操作。

  3. 当您的合作伙伴仍然登录时,创建一个规则来禁用来自 serverPR 的所有 ftp 类型流量。输入

    [root@serverXY root]# iptables -A INPUT -i  eth0 -s 172.16.0.z  -p tcp  --dport 21 -j DROP*
    

    用通俗易懂的语言来说,上面的规则/命令可以解释为:“将一条规则附加到过滤器表中的 INPUT 链。让这条规则丢弃所有源地址为 172.16.0.z 且目标端口为我们本地系统上的端口 21 的数据包。

  4. 一旦您执行了上面的命令,netfilter 堆栈就会立即将其生效。要查看这一点,请您的合作伙伴尝试任何 ftp 命令,同时仍然登录到您的 ftp 服务器 - 例如 ls。成功还是失败?

    实验室任务

    成功还是失败?

    如果失败,请您的合作伙伴尝试断开连接,并尝试从头开始登录,然后再次检查是否成功。

  5. 请其他不是您合作伙伴的人尝试以匿名身份登录您的 ftp 服务器。您也可以请 hq.example.org 的某个人尝试连接到您的 ftp 站点。

    问题

    成功还是失败?

  6. 在 serverXY 上启用并启动您的 Web 服务器。

  7. 确保其他人可以使用浏览器访问您的网站。创建一个规则来阻止来自 hq.example.org 到您本地机器的 http 流量。

练习 3

基本数据包转发

在本练习中,您将学习如何设置基本数据包转发规则。

您设置的规则将允许您的系统充当您合作伙伴系统的路由器。

您的系统将路由来自您合作伙伴系统的任何流量到互联网或到您自己的默认网关。这就是所谓的 IP 伪装或 NAT(网络地址转换)。

为了详细说明,IP 伪装和 NAT 实际上略有不同,通常用于完成不同的任务。在以下练习中,我们不会过多地关注这些具体差异。

本练习将假设以下内容,因此请根据您的特定设置进行调整

ServerXY

i. 您的系统有两个网卡 - eth0 和 eth1。

ii. 第一个接口 eth0 将被视为外部接口(或面向互联网)

iii. 第二个接口 eth1 将被视为内部接口(或面向 LAN)

iv. 接口 eth0 的 IP 地址为 172.16.0.z

v. 接口 eth1 的 IP 地址为 10.0.0.z,网络掩码为 255.0.0.0

vi. 您已成功完成“实验室 2”,并理解其中的基本概念。

ServerPR

以下假设是针对您合作伙伴的系统做出的。

i. 它只有一个网卡 - eth0

ii. eth0 的 IP 地址为 10.0.0.y,网络掩码为 255.0.0.0

iii. serverPR 的默认路由器或网关为 10.0.0.z(即 serverXY 的 eth1 的 IP 地址)

iv. 您已成功完成“实验室 2”,并理解其中的基本概念。

将您的网络布线以看起来像下面所示的设置

我们通常用于 serverXY 和 serverPR 的图标已在上面替换为路由器的图标。

要创建转发规则

  1. 确保您的网络与上面所示的物理布线一致。

  2. 为所有接口分配其相应的 IP 地址、网络掩码和网关设置。

  3. 刷新您当前加载的所有 iptables 规则。

    注意

    刷新表并不总是必要的或强制性的。您可能已经注意到,在迄今完成的一些练习的开头,我们已经指定您刷新现有表。这样做是为了确保您从一个干净的状态开始,并且您的表中没有隐藏任何错误的规则,这些规则可能会导致某些操作无法正常工作。通常情况下,您可以在同一时间加载数百条规则,以执行不同的功能。

  4. 请您合作伙伴在 serverPR 上尝试 ping 172.16.0.100 (hq.example.org),这应该会失败,因为您现在充当 serverPR 的默认网关,并且您尚未在您的系统上启用任何路由。

  5. 在 serverXY 上以 root 用户身份输入

    [root@serverXY root]# *iptables --table  nat  -A  POSTROUTING -o eth0  -j  MASQUERADE*
    
  6. 现在再次重复步骤 4。

    问题

    您成功了吗?

  7. 以上操作应该会失败。您还需要在运行的内核中启用数据包转发。输入

    [root@serverXY root]#  *echo 1   >   /proc/sys/net/ipv4/ip_forward*
    
  8. 为了使上述更改在重启之间对内核保持永久性,请在“/etc/sysctl.conf”文件中创建以下条目

    net.ipv4.ip_forward = 0
    

要保存 iptables 规则

到目前为止,您创建的所有 iptables 规则和链都是短暂的或非永久性的。这意味着,如果您需要在任何时候重启系统,您所做的所有规则和更改都会丢失。

为了防止这种情况,您需要一种机制来将临时运行时 iptables 规则写入或保存到系统,以便它们在系统重启时始终可用。

  1. 使用 iptables-save 命令将您所有的更改保存到 /etc/sysconfig/iptables 文件。输入

    [root@serverXY root]# *iptables-save   >   /etc/sysconfig/iptables*
    

    提示

    您在使用 iptables 时,只能通过您的想象力来限制自己。在本实验室中,我们只是触及了皮毛。希望我们已经触及了足够多的内容,让您的想象力尽情发挥。

额外分数

以下是探索 iptables 的一些其他方法

问题和任务

  1. 需要什么选项才能获得此命令iptables -L -t nat的更详细版本?

  2. 显示 OUTPUT 链下的规则的命令是什么?

  3. ftp 服务“通常”监听哪个端口?

  4. 创建名为“mynat-chain”的链(在 nat 表下)的命令是什么?

  5. 在线搜索并列出一些更易于使用的工具或应用程序的名称,这些工具或应用程序可用于管理基于 Linux 的系统上的防火墙子系统。

  6. 创建一个 iptables 规则来阻止来自 hq.example.org 到您本地机器的 http 流量。Web 服务器监听哪个众所周知的端口?写下实现此目的的完整命令?将您上面写下的命令转换为其通俗易懂的等效命令。

作者:Wale Soyinka