• 练习 26:网络:封包过滤配置,iptables
    • 这样做
    • 你会看到什么
    • 解释
    • 附加题

    练习 26:网络:封包过滤配置,iptables

    原文:Exercise 26. Networking: packet filter configuration, iptables

    译者:飞龙

    协议:CC BY-NC-SA 4.0

    自豪地采用谷歌翻译

    让我以引用维基百科上的iptables来开始:

    iptables是一个用户态应用程序,允许系统管理员配置由 Linux 内核防火墙(实现为不同的 Netfilter 模块)提供的表,以及它存储的链和规则。不同的内核模块和程序目前用于不同的协议;iptables适用于 IPv4,ip6tables适用于 IPv6,arptables适用于 ARP,ebtables适用于以太网帧。

    为了使用它,你必须了解以下概念:

    • LINKTYPE_LINUX_SLL - tcpdump伪链路层协议。
    • 以太网帧头部 - 以太网链路上的数据包称为以太网帧。帧以前缀和起始分隔符开始。接下来,每个以太网帧都有一个头部,其特征为源和目标 MAC 地址。帧的中间部分是载荷数据,包含帧中携带的其他协议(例如,互联网协议)的任何头部。该帧以 32 位循环冗余校验(CRC)结束,用于检测传输中数据的任何损坏。
    • IPv4 头部 - IP 封包包括头部部分和数据部分。IPv4 封包头部由 14 个字段组成,其中 13 个是必需的。第十四个字段是可选的,适当地命名为:options
    • TCP 段结构 - 传输控制协议接受来自数据流的数据,将其分割成块,并添加 TCP 头部来创建 TCP 段。TCP 段然后被封装成互联网协议(IP)数据报。TCP 段是“信息封包,TCP 用于与对方交换数据”。

    我会提醒你,让你获取一些指南:

    • 阅读相应的维基百科文章,直到你至少表面上理解了它(但是深入研究当然更好)。
      • 展开站点左侧的 IP 地址树节点,并通过它来以你的方式实现。
      • 展开 TCP 树节点并执行相同操作。
    • 阅读 Linux 网络概念介绍。这本指南很好,因为它甚至承认 互联网是为情欲而生的。

    比起 _Linux_Firewalls_Using_iptables">Peter Harrison 的优秀指南,我没办法更好地描述iptables了。如果你从未使用过它,请先阅读本指南。

    但是,我将会将理论付诸实践,并 在数据交换的一个非常简单的情况下,逐步展示出iptalbes内部的内容。第一件事情是主要概念:

    iptables - 用于在 Linux 内核中设置,维护和检查 IPv4 包过滤规则表的程序。可以定义几个不同的表。每个表包含多个内置链,并且还可以包含用户定义的链。
    ip6tables - 用于 IPv6 的相同东西。
    链 - 可以匹配一组数据包的规则列表。每个规则规定了,如何处理匹配的数据包。这被称为目标,它可能是相同表中的,用户定义的链的跳转。
    目标 - 防火墙规则为封包和目标指定了判别标准。如果数据包不匹配,就会检查的链中的下一个规则;如果它匹配,则下一个规则由目标的值指定,该值可以是用户定义链的名称或特殊值之一:

    ACCEPT - 让包通过。
    DROP - 将数据包丢弃。
    QUEUE - 将数据包传递给用户空间。
    RETURN - 停止遍历此链,并在上一个(调用)链中的下一个规则处恢复。如果达到了内置链的结尾,或者内置链中的一个带有RETURN的规则匹配它,链策略指定的目标决定了数据包的命运。

    现在让我们看看有什么默认的表和内置的链:

    表名 内置链 描述
    raw 该表主要用于配置与NOTRACK目标结合的连接跟踪的免除。它以较高的优先级在netfilter钩子中注册,因此在ip_conntrack或任何其他 IP 表之前调用。
    PREROUTING 用于经过任何网络接口到达的封包。
    OUTPUT 用于本地进程生成的封包。
    mangle 该表用于专门的数据包更改。
    PREROUTING 用于在路由之前更改传入的数据包。
    OUTPUT 用于在路由之前更改本地生成的数据包。
    INPUT 用于进入本机的数据包。
    FORWARD 用于经过本机的数据包。
    POSTROUTING 用于当数据包打算出去时,更改它们。
    nat 当遇到创建新连接的数据包时,将查看此表。
    PREROUTING 用于一旦数据包进来,就更改它们。
    OUTPUT 用于在路由之前更改本地生成的数据包。
    POSTROUTING 用于当数据包打算出去时,更改它们。
    filter 这是默认表(如果没有传入-t选项)。
    INPUT 用于发往本地套接字的数据包。
    FORWARD 用于经过本机的数据包。
    OUTPUT 用于本地生成的数据包。

    好的,我们准备看看它实际如何运作。我会从我的家用计算机,使用 TCP 协议和netcatvm1发送一个字符串Hello world!netcat就像cat一样,但是通过网络。起步:

    1. 我将另一个端口,80,转发到我运行 Linux 的家用 PC,所以我能象这样连接它:

    1. (My home PC) --> vm1:80

    2. 我将这个规则添加到iptables,来记录iptables内部的数据包发生了什么。

    1. sudo iptables -t raw -A PREROUTING -p tcp -m tcp --dport 80 -j TRACE
    2. sudo iptables -t raw -A INPUT -p tcp -m tcp --sport 80 -j TRACE

    这是我的vm1上的iptables规则集:

    1. root@vm1:/home/user1# for i in raw mangle nat filter ; do echo -e "\n-----" TABLE: $i '-----' ; iptables -t $i -L ; done
    2. ----- TABLE: raw -----
    3. Chain PREROUTING (policy ACCEPT) target prot opt source destination
    4. TRACE tcp -- anywhere anywhere tcp dpt:www
    5. Chain OUTPUT (policy ACCEPT) target prot opt source destination
    6. TRACE tcp -- anywhere anywhere tcp spt:www
    7. ----- TABLE: mangle -----
    8. Chain PREROUTING (policy ACCEPT) target prot opt source destination
    9. Chain INPUT (policy ACCEPT) target prot opt source destination
    10. Chain FORWARD (policy ACCEPT) target prot opt source destination
    11. Chain OUTPUT (policy ACCEPT) target prot opt source destination
    12. Chain POSTROUTING (policy ACCEPT) target prot opt source destination
    13. ----- TABLE: nat -----
    14. Chain PREROUTING (policy ACCEPT) target prot opt source destination
    15. Chain POSTROUTING (policy ACCEPT) target prot opt source destination
    16. Chain OUTPUT (policy ACCEPT) target prot opt source destination
    17. ----- TABLE: filter -----
    18. Chain INPUT (policy ACCEPT) target prot opt source destination
    19. Chain FORWARD (policy ACCEPT) target prot opt source destination
    20. Chain OUTPUT (policy ACCEPT) target prot opt source destination

    你可以看到,没有其它规则了。另一种查看iptables规则的方式,是使用iptables-save工具:

    1. root@vm1:/home/user1# iptables-save
    2. # Generated by iptables-save v1.4.8 on Fri Jul 13 08:09:04 2012
    3. #(1)
    4. *mangle
    5. #(2) (3) (4) (5)
    6. :PREROUTING ACCEPT [15662:802240]
    7. :INPUT ACCEPT [15662:802240]
    8. :FORWARD ACCEPT [0:0]
    9. :OUTPUT ACCEPT [12756:3671974]
    10. :POSTROUTING ACCEPT [12756:3671974]
    11. COMMIT
    12. # Completed on Fri Jul 13 08:09:04 2012
    13. # Generated by iptables-save v1.4.8 on Fri Jul 13 08:09:04 2012
    14. *nat
    15. :PREROUTING ACCEPT [18:792]
    16. :POSTROUTING ACCEPT [42:2660]
    17. :OUTPUT ACCEPT [42:2660]
    18. COMMIT
    19. # Completed on Fri Jul 13 08:09:04 2012
    20. # Generated by iptables-save v1.4.8 on Fri Jul 13 08:09:04 2012
    21. *raw
    22. :PREROUTING ACCEPT [15854:814892]
    23. :OUTPUT ACCEPT [12855:3682054]
    24. -A PREROUTING -p tcp -m tcp --dport 80 -j TRACE
    25. -A OUTPUT -p tcp -m tcp --sport 80 -j TRACE
    26. COMMIT
    27. # Completed on Fri Jul 13 08:09:04 2012
    28. # Generated by iptables-save v1.4.8 on Fri Jul 13 08:09:04 2012
    29. *filter
    30. :INPUT ACCEPT [35107:2459066]
    31. :FORWARD ACCEPT [0:0]
    32. :OUTPUT ACCEPT [26433:10670628]
    33. COMMIT
    34. # Completed on Fri Jul 13 08:09:04 2012

    iptables-save字段如下所示:

    字段 描述
    (1) 表名称
    (2) 链名称
    (3) 链策略
    (4) 封包计数
    (5) 字节计数

    3. 我启动nc来监听端口 80:

    1. nc -l 80

    4. 我向vm1发送字符串:

    1. echo 'Hello, world!' | nc localhost 80

    下面的是我的家用 PC 和vm1之间的交换:

    1. 08:00:05.655339 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [S], seq 4164179969, win 65535, options [mss 1460], length 0
    2. 08:00:05.655653 IP 10.0.2.15.80 > 10.0.2.2.51534: Flags [S.], seq 4149908960, ack 4164179970, win 5840, options [mss 1460], length 0
    3. 08:00:05.655773 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [.], ack 1, win 65535, length 0
    4. 08:00:05.655868 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [P.], seq 1:15, ack 1, win 65535, length 14
    5. 08:00:05.655978 IP 10.0.2.15.80 > 10.0.2.2.51534: Flags [.], ack 15, win 5840, length 0
    6. 08:00:10.037978 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [F.], seq 15, ack 1, win 65535, length 0
    7. 08:00:10.038287 IP 10.0.2.15.80 > 10.0.2.2.51534: Flags [F.], seq 1, ack 16, win 5840, length 0
    8. 08:00:10.038993 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [.], ack 2, win 65535, length 0

    让我们回忆,数据如何交换。为此,让我们拆开第一个封包。

    1. # (13) (15) (14) (16) (20) (17) (25)
    2. 08:00:05.655339 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [S], seq 4164179969, win 65535,
    3. # (8) (9)
    4. options [mss 1460], length 0
    5. # (1) (2) (3) (4) (5)
    6. # ____ ____ ____ ___________________ ____
    7. 0x0000: 0000 0001 0006 5254 0012 3502 0000 0800 ......RT..5.....
    8. # (6) (7) (8) (9)(10,11)(12) (13)
    9. # ____ ____ ____ ____ /\/\ ____ _________
    10. 0x0010: 4500 002c a006 0000 4006 c2b5 0a00 0202 E..,....@.......
    11. # (14) (15) (16) (17) (18)
    12. # _________ ____ ____ _________ __________
    13. 0x0020: 0a00 020f c94e 0050 f834 5801 0000 0000 .....N.P.4X.....
    14. # (19,20)(21) (22) (23) (24) (25)
    15. # /\/\ ____ ____ ____ ____ ____
    16. 0x0030: 6002 ffff 6641 0000 0204 05b4 0000 `...fA........

    我们封包中的字段和描述:

    DOD 模型层 OSI 模型层 位于 字段 描述
    链路 物理/数据链路 LINUX_SLL 头部 (1) 封包类型
    (2) ARPHRD_ 类型
    (3) 链路层 (MAC) 地址长度
    (4) 链路层 (MAC) 源地址
    (5) 协议类型 (IP)
    互联网 网络 IPv4 头部 (6) 版本,互联网头部长度,差分服务代码点,显式拥塞通知.
    (7) 总长度
    (8) 身份,主要用于源 IP 数据报的段的唯一性鉴定
    (9) 标志,段的偏移
    (10) 生存时间 (TTL)
    (11) 协议编号
    (12) 头部校验和
    (13) 源 IP 地址
    (14) 目标 IP 地址
    传输 传输 TCP 头部 (15) 源 TCP 端口
    (16) 目标 TCP 端口
    (17) TCP 初始序列号
    (18) ACK 编号字段 (空的,由于它是第一个封包)
    (19)
    (20) SYN TCP 标志
    (21) TCP 窗口大小
    (22) TCP 校验和
    (23) 紧急指针
    (24) 可选字段的开始
    (25) TCP 最大段大小 (最大传输单元 - 40 字节)

    让我们看看iptables中,这个封包发生了什么:

    1. #(1)(2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12)
    2. raw:PREROUTING:policy:2 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    3. # (13) (14) (15) (16) (17) (18) (19) (20)
    4. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=40966 PROTO=TCP SPT=51534 DPT=80
    5. # (21) (22) (23) (24) (25)(26) (27)
    6. SEQ=4164179969 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B4)
    7. mangle:PREROUTING:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    8. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=40966 PROTO=TCP SPT=51534 DPT=80
    9. SEQ=4164179969 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B4)
    10. nat:PREROUTING:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    11. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=40966 PROTO=TCP SPT=51534 DPT=80
    12. SEQ=4164179969 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B4)
    13. mangle:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    14. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=40966 PROTO=TCP SPT=51534 DPT=80
    15. SEQ=4164179969 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B4)
    16. filter:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    17. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=40966 PROTO=TCP SPT=51534 DPT=80
    18. SEQ=4164179969 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B4)

    iptables日志的字段的描述:

    字段 描述
    (1) 表名称
    (2) 链名称
    (3) 类型 (用于内建链的策略)
    (4) 规则编号
    (5) 输入接口
    (6) 输出接口 (空的,因为封包的目标是 vm1 自身)
    (7) MAC 地址
    (8) 目标 (vm1) MAC
    (9) 源 MAC
    (10) 协议类型:IP
    (11) 源 IP 地址
    (12) 目标 IP 地址
    (13) IP 封包长度,以字节为单位 (不包括链路层头部)
    (14) IP 服务类型
    (15) IP 优先级
    (16) IP 生存时间
    (17) IP 封包 ID
    (18) 协议类型:TCP
    (19) TCP 源端口
    (20) TCP 目标端口
    (21) TCP 序列号
    (22) TCP 应答编号
    (23) TCP 窗口大小
    (24) TCP 保留位
    (25) TCP SYN 标志已设置
    (25) TCP 紧急指针未设置
    (25) TCP 选项

    现在我将使用tcpdump输出和iptables日志,并排(更多的是逐段)向你显示这个交换。你的任务是逐行浏览这个交换,了解会发生什么。我建议你打印这个交换,并使用笔和纸进行处理它,你可以从特殊页面打印它。你需要回答的问题是:

    • 每个字段的意思是什么?拿着铅笔,将字段从tcpdump的踪迹连接到原始数据包的十六进制数据,再到iptables日志。
    • 数据包以什么顺序进行处理?首先是哪个表,最后是哪个,为什么?
    • 为什么只有第一个数据包通过nat表进行处理?

    这是输出,看看:

    1. 08:00:05.655339 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [S], seq 4164179969, win 65535, options [mss 1460], length 0
    2. 0x0000: 0000 0001 0006 5254 0012 3502 0000 0800 ......RT..5.....
    3. 0x0010: 4500 002c a006 0000 4006 c2b5 0a00 0202 E..,....@.......
    4. 0x0020: 0a00 020f c94e 0050 f834 5801 0000 0000 .....N.P.4X.....
    5. 0x0030: 6002 ffff 6641 0000 0204 05b4 0000 `...fA........
    6. `
    7. raw:PREROUTING:policy:2 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    8. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=40966 PROTO=TCP SPT=51534 DPT=80
    9. SEQ=4164179969 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B4)
    10. mangle:PREROUTING:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    11. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=40966 PROTO=TCP SPT=51534 DPT=80
    12. SEQ=4164179969 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B4)
    13. nat:PREROUTING:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    14. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=40966 PROTO=TCP SPT=51534 DPT=80
    15. SEQ=4164179969 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B4)
    16. mangle:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    17. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=40966 PROTO=TCP SPT=51534 DPT=80
    18. SEQ=4164179969 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B4)
    19. filter:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    20. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=40966 PROTO=TCP SPT=51534 DPT=80
    21. SEQ=4164179969 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B4)
    22. 08:00:05.655653 IP 10.0.2.15.80 > 10.0.2.2.51534: Flags [S.], seq 4149908960, ack 4164179970, win 5840, options [mss 1460], length 0
    23. 0x0000: 0004 0001 0006 0800 27d4 4568 0000 0800 ........'.Eh....
    24. 0x0010: 4500 002c 0000 4000 4006 22bc 0a00 020f E..,..@.@.".....
    25. 0x0020: 0a00 0202 0050 c94e f75a 95e0 f834 5802 .....P.N.Z...4X.
    26. 0x0030: 6012 16d0 c224 0000 0204 05b4 `....$......
    27. '
    28. raw:OUTPUT:policy:2 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    29. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=80 DPT=51534
    30. SEQ=4149908960 ACK=4164179970 WINDOW=5840 RES=0x00 ACK SYN URGP=0 OPT (020405B4) UID=0 GID=0
    31. mangle:OUTPUT:policy:1 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    32. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=80 DPT=51534
    33. SEQ=4149908960 ACK=4164179970 WINDOW=5840 RES=0x00 ACK SYN URGP=0 OPT (020405B4) UID=0 GID=0
    34. filter:OUTPUT:policy:1 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    35. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=80 DPT=51534
    36. SEQ=4149908960 ACK=4164179970 WINDOW=5840 RES=0x00 ACK SYN URGP=0 OPT (020405B4) UID=0 GID=0
    37. mangle:POSTROUTING:policy:1 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    38. LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=80 DPT=51534
    39. SEQ=4149908960 ACK=4164179970 WINDOW=5840 RES=0x00 ACK SYN URGP=0 OPT (020405B4) UID=0 GID=0
    40. 08:00:05.655773 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [.], ack 1, win 65535, length 0
    41. 0x0000: 0000 0001 0006 5254 0012 3502 0000 0800 ......RT..5.....
    42. 0x0010: 4500 0028 a007 0000 4006 c2b8 0a00 0202 E..(....@.......
    43. 0x0020: 0a00 020f c94e 0050 f834 5802 f75a 95e1 .....N.P.4X..Z..
    44. 0x0030: 5010 ffff f0b1 0000 0000 0000 0000 P.............
    45. raw:PREROUTING:policy:2 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    46. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40967 PROTO=TCP SPT=51534 DPT=80
    47. SEQ=4164179970 ACK=4149908961 WINDOW=65535 RES=0x00 ACK URGP=0
    48. mangle:PREROUTING:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    49. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40967 PROTO=TCP SPT=51534 DPT=80
    50. SEQ=4164179970 ACK=4149908961 WINDOW=65535 RES=0x00 ACK URGP=0
    51. mangle:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    52. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40967 PROTO=TCP SPT=51534 DPT=80
    53. SEQ=4164179970 ACK=4149908961 WINDOW=65535 RES=0x00 ACK URGP=0
    54. filter:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    55. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40967 PROTO=TCP SPT=51534 DPT=80
    56. SEQ=4164179970 ACK=4149908961 WINDOW=65535 RES=0x00 ACK URGP=0
    57. 08:00:05.655868 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [P.], seq 1:15, ack 1, win 65535, length 14
    58. 0x0000: 0000 0001 0006 5254 0012 3502 0000 0800 ......RT..5.....
    59. 0x0010: 4500 0036 a008 0000 4006 c2a9 0a00 0202 E..6....@.......
    60. 0x0020: 0a00 020f c94e 0050 f834 5802 f75a 95e1 .....N.P.4X..Z..
    61. 0x0030: 5018 ffff af45 0000 4865 6c6c 6f2c 2077 P....E..Hello,.w
    62. 0x0040: 6f72 6c64 210a orld!.
    63. raw:PREROUTING:policy:2 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    64. LEN=54 TOS=0x00 PREC=0x00 TTL=64 ID=40968 PROTO=TCP SPT=51534 DPT=80
    65. SEQ=4164179970 ACK=4149908961 WINDOW=65535 RES=0x00 ACK PSH URGP=0
    66. mangle:PREROUTING:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    67. LEN=54 TOS=0x00 PREC=0x00 TTL=64 ID=40968 PROTO=TCP SPT=51534 DPT=80
    68. SEQ=4164179970 ACK=4149908961 WINDOW=65535 RES=0x00 ACK PSH URGP=0
    69. mangle:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    70. LEN=54 TOS=0x00 PREC=0x00 TTL=64 ID=40968 PROTO=TCP SPT=51534 DPT=80
    71. SEQ=4164179970 ACK=4149908961 WINDOW=65535 RES=0x00 ACK PSH URGP=0
    72. filter:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    73. LEN=54 TOS=0x00 PREC=0x00 TTL=64 ID=40968 PROTO=TCP SPT=51534 DPT=80
    74. SEQ=4164179970 ACK=4149908961 WINDOW=65535 RES=0x00 ACK PSH URGP=0
    75. 08:00:05.655978 IP 10.0.2.15.80 > 10.0.2.2.51534: Flags [.], ack 15, win 5840, length 0
    76. 0x0000: 0004 0001 0006 0800 27d4 4568 0000 0800 ........'.Eh....
    77. 0x0010: 4500 0028 377c 4000 4006 eb43 0a00 020f E..(7|@.@..C....
    78. 0x0020: 0a00 0202 0050 c94e f75a 95e1 f834 5810 .....P.N.Z...4X.
    79. 0x0030: 5010 16d0 d9d3 0000 P.......
    80. '
    81. raw:OUTPUT:policy:2 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    82. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=14204 DF PROTO=TCP SPT=80 DPT=51534
    83. SEQ=4149908961 ACK=4164179984 WINDOW=5840 RES=0x00 ACK URGP=0
    84. mangle:OUTPUT:policy:1 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    85. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=14204 DF PROTO=TCP SPT=80 DPT=51534
    86. SEQ=4149908961 ACK=4164179984 WINDOW=5840 RES=0x00 ACK URGP=0
    87. filter:OUTPUT:policy:1 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    88. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=14204 DF PROTO=TCP SPT=80 DPT=51534
    89. SEQ=4149908961 ACK=4164179984 WINDOW=5840 RES=0x00 ACK URGP=0
    90. mangle:POSTROUTING:policy:1 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    91. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=14204 DF PROTO=TCP SPT=80 DPT=51534
    92. SEQ=4149908961 ACK=4164179984 WINDOW=5840 RES=0x00 ACK URGP=0
    93. 08:00:10.037978 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [F.], seq 15, ack 1, win 65535, length 0
    94. 0x0000: 0000 0001 0006 5254 0012 3502 0000 0800 ......RT..5.....
    95. 0x0010: 4500 0028 a00e 0000 4006 c2b1 0a00 0202 E..(....@.......
    96. 0x0020: 0a00 020f c94e 0050 f834 5810 f75a 95e1 .....N.P.4X..Z..
    97. 0x0030: 5011 ffff f0a2 0000 0000 0000 0000 P.............
    98. raw:PREROUTING:policy:2 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    99. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40974 PROTO=TCP SPT=51534 DPT=80
    100. SEQ=4164179984 ACK=4149908961 WINDOW=65535 RES=0x00 ACK FIN URGP=0
    101. mangle:PREROUTING:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    102. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40974 PROTO=TCP SPT=51534 DPT=80
    103. SEQ=4164179984 ACK=4149908961 WINDOW=65535 RES=0x00 ACK FIN URGP=0
    104. mangle:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    105. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40974 PROTO=TCP SPT=51534 DPT=80
    106. SEQ=4164179984 ACK=4149908961 WINDOW=65535 RES=0x00 ACK FIN URGP=0
    107. filter:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    108. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40974 PROTO=TCP SPT=51534 DPT=80
    109. SEQ=4164179984 ACK=4149908961 WINDOW=65535 RES=0x00 ACK FIN URGP=0
    110. 08:00:10.038287 IP 10.0.2.15.80 > 10.0.2.2.51534: Flags [F.], seq 1, ack 16, win 5840, length 0
    111. 0x0000: 0004 0001 0006 0800 27d4 4568 0000 0800 ........'.Eh....
    112. 0x0010: 4500 0028 377d 4000 4006 eb42 0a00 020f E..(7}@.@..B....
    113. 0x0020: 0a00 0202 0050 c94e f75a 95e1 f834 5811 .....P.N.Z...4X.
    114. 0x0030: 5011 16d0 d9d1 0000 P.......
    115. '
    116. raw:OUTPUT:policy:2 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    117. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=14205 DF PROTO=TCP SPT=80 DPT=51534
    118. SEQ=4149908961 ACK=4164179985 WINDOW=5840 RES=0x00 ACK FIN URGP=0 UID=0 GID=0
    119. mangle:OUTPUT:policy:1 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    120. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=14205 DF PROTO=TCP SPT=80 DPT=51534
    121. SEQ=4149908961 ACK=4164179985 WINDOW=5840 RES=0x00 ACK FIN URGP=0 UID=0 GID=0
    122. filter:OUTPUT:policy:1 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    123. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=14205 DF PROTO=TCP SPT=80 DPT=51534
    124. SEQ=4149908961 ACK=4164179985 WINDOW=5840 RES=0x00 ACK FIN URGP=0 UID=0 GID=0
    125. mangle:POSTROUTING:policy:1 IN= OUT=eth0 SRC=10.0.2.15 DST=10.0.2.2
    126. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=14205 DF PROTO=TCP SPT=80 DPT=51534
    127. SEQ=4149908961 ACK=4164179985 WINDOW=5840 RES=0x00 ACK FIN URGP=0 UID=0 GID=0
    128. 08:00:10.038993 IP 10.0.2.2.51534 > 10.0.2.15.80: Flags [.], ack 2, win 65535, length 0
    129. 0x0000: 0000 0001 0006 5254 0012 3502 0000 0800 ......RT..5.....
    130. 0x0010: 4500 0028 a00f 0000 4006 c2b0 0a00 0202 E..(....@.......
    131. 0x0020: 0a00 020f c94e 0050 f834 5811 f75a 95e2 .....N.P.4X..Z..
    132. 0x0030: 5010 ffff f0a1 0000 0000 0000 0000 P.............
    133. raw:PREROUTING:policy:2 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    134. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40975 PROTO=TCP SPT=51534 DPT=80
    135. SEQ=4164179985 ACK=4149908962 WINDOW=65535 RES=0x00 ACK URGP=0
    136. mangle:PREROUTING:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    137. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40975 PROTO=TCP SPT=51534 DPT=80
    138. SEQ=4164179985 ACK=4149908962 WINDOW=65535 RES=0x00 ACK URGP=0
    139. mangle:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    140. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40975 PROTO=TCP SPT=51534 DPT=80
    141. SEQ=4164179985 ACK=4149908962 WINDOW=65535 RES=0x00 ACK URGP=0
    142. filter:INPUT:policy:1 IN=eth0 OUT= MAC=08:00:27:d4:45:68:52:54:00:12:35:02:08:00 SRC=10.0.2.2 DST=10.0.2.15
    143. LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=40975 PROTO=TCP SPT=51534 DPT=80
    144. SEQ=4164179985 ACK=4149908962 WINDOW=65535 RES=0x00 ACK URGP=0

    这样做

    1. 1: sudo iptables-save
    2. 2: sudo iptables -t filter -A INPUT -i lo -j ACCEPT
    3. 3: sudo iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
    4. 4: sudo iptables -t filter -P INPUT DROP
    5. 5: sudo iptables -nt filter -L --line-numbers
    6. 6: ping -c 2 -W 1 10.0.2.2
    7. 7: sudo iptables -t filter -A INPUT --match state --state ESTABLISHED -j ACCEPT
    8. 8: sudo iptables -nt filter -L --line-numbers
    9. 9: ping -c 2 -W 1 10.0.2.2
    10. 10: sudo modprobe ipt_LOG
    11. 11: sudo iptables -nt raw -L --line-numbers
    12. 12: sudo iptables -t raw -A PREROUTING -p udp -m udp --dport 1024 -j TRACE
    13. 13: sudo iptables -t raw -A OUTPUT -p udp -m udp --sport 1024 -j TRACE
    14. 14: sudo tail -n0 -f /var/log/kern.log | cut -c52-300 &
    15. 15: nc -ulp 1024 &
    16. 16: echo 'Hello there!' | nc -u localhost 1000
    17. 17: <CTRL+C>
    18. 18: fg
    19. 19: <CTRL+C>
    20. 20: fg
    21. 21: <CTRL+C>

    你会看到什么

    1. user1@vm1:~$ sudo iptables-save
    2. # Generated by iptables-save v1.4.8 on Mon Jul 16 09:01:32 2012
    3. *mangle
    4. :PREROUTING ACCEPT [45783:3411367]
    5. :INPUT ACCEPT [45783:3411367]
    6. :FORWARD ACCEPT [0:0]
    7. :OUTPUT ACCEPT [30409:9552110]
    8. :POSTROUTING ACCEPT [30331:9543294]
    9. COMMIT
    10. # Completed on Mon Jul 16 09:01:32 2012
    11. # Generated by iptables-save v1.4.8 on Mon Jul 16 09:01:32 2012
    12. *nat
    13. :PREROUTING ACCEPT [24:1056]
    14. :POSTROUTING ACCEPT [755:41247]
    15. :OUTPUT ACCEPT [817:45207]
    16. COMMIT
    17. # Completed on Mon Jul 16 09:01:32 2012
    18. # Generated by iptables-save v1.4.8 on Mon Jul 16 09:01:32 2012
    19. *raw
    20. :PREROUTING ACCEPT [3171:197900]
    21. :OUTPUT ACCEPT [1991:1294054]
    22. -A PREROUTING -p udp -m udp --dport 80 -j TRACE
    23. -A OUTPUT -p udp -m udp --sport 80 -j TRACE
    24. COMMIT
    25. # Completed on Mon Jul 16 09:01:32 2012
    26. # Generated by iptables-save v1.4.8 on Mon Jul 16 09:01:32 2012
    27. *filter
    28. :INPUT ACCEPT [54:3564]
    29. :FORWARD ACCEPT [0:0]
    30. :OUTPUT ACCEPT [28:2540]
    31. COMMIT
    32. # Completed on Mon Jul 16 09:01:32 2012
    33. user1@vm1:~$ sudo iptables -t filter -A INPUT -i lo -j ACCEPT
    34. user1@vm1:~$ sudo iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
    35. user1@vm1:~$ sudo iptables -t filter -P INPUT DROP
    36. user1@vm1:~$ sudo iptables -nt filter -L --line-numbers
    37. Chain INPUT (policy DROP)
    38. num target prot opt source destination
    39. 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
    40. 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
    41. Chain FORWARD (policy ACCEPT)
    42. num target prot opt source destination
    43. Chain OUTPUT (policy ACCEPT)
    44. num target prot opt source destination
    45. user1@vm1:~$ ping -c 2 -W 1 10.0.2.2
    46. PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
    47. --- 10.0.2.2 ping statistics ---
    48. 2 packets transmitted, 0 received, 100% packet loss, time 1008ms
    49. user1@vm1:~$ sudo iptables -t filter -A INPUT --match state --state ESTABLISHED -j ACCEPT
    50. user1@vm1:~$ sudo iptables -nt filter -L --line-numbers
    51. Chain INPUT (policy DROP)
    52. num target prot opt source destination
    53. 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
    54. 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
    55. 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
    56. Chain FORWARD (policy ACCEPT)
    57. num target prot opt source destination
    58. Chain OUTPUT (policy ACCEPT)
    59. num target prot opt source destination
    60. user1@vm1:~$ ping -c 2 -W 1 10.0.2.2
    61. PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
    62. 64 bytes from 10.0.2.2: icmp_req=1 ttl=63 time=0.385 ms
    63. 64 bytes from 10.0.2.2: icmp_req=2 ttl=63 time=0.142 ms
    64. --- 10.0.2.2 ping statistics ---
    65. 2 packets transmitted, 2 received, 0% packet loss, time 999ms
    66. rtt min/avg/max/mdev = 0.142/0.263/0.385/0.122 ms
    67. user1@vm1:~$ sudo iptables -nt raw -L --line-numbers
    68. Chain PREROUTING (policy ACCEPT)
    69. num target prot opt source destination
    70. Chain OUTPUT (policy ACCEPT)
    71. num target prot opt source destination
    72. user1@vm1:~$ sudo iptables -t raw -A PREROUTING -p udp -m udp --dport 1024 -j TRACE
    73. user1@vm1:~$ sudo iptables -t raw -A OUTPUT -p udp -m udp --sport 1024 -j TRACE
    74. user1@vm1:~$ sudo iptables -nt raw -L --line-numbers
    75. Chain PREROUTING (policy ACCEPT)
    76. num target prot opt source destination
    77. 1 TRACE udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:1024
    78. Chain OUTPUT (policy ACCEPT)
    79. num target prot opt source destination
    80. 1 TRACE udp -- 0.0.0.0/0 0.0.0.0/0 udp spt:1024
    81. user1@vm1:~$ sudo tail -n0 -f /var/log/kern.log | cut -c52-300 &
    82. [1] 10249
    83. user1@vm1:~$ nc -ulp 1024 &
    84. [2] 10251
    85. user1@vm1:~$ echo 'Hello there!' | nc -u localhost 1024
    86. Hello there!
    87. raw:PREROUTING:policy:2 IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=41 TOS=0x00 PREC=0x00 TTL=64 ID=57898 DF PROTO=UDP SPT=50407 DPT=1024 LEN=21
    88. mangle:PREROUTING:policy:1 IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=41 TOS=0x00 PREC=0x00 TTL=64 ID=57898 DF PROTO=UDP SPT=50407 DPT=1024 LEN=21
    89. mangle:INPUT:policy:1 IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=41 TOS=0x00 PREC=0x00 TTL=64 ID=57898 DF PROTO=UDP SPT=50407 DPT=1024 LEN=21
    90. filter:INPUT:rule:1 IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=41 TOS=0x00 PREC=0x00 TTL=64 ID=57898 DF PROTO=UDP SPT=50407 DPT=1024 LEN=21
    91. ^C
    92. [2]+ Stopped nc -ulp 1024
    93. user1@vm1:~$ fg
    94. nc -ulp 1024
    95. ^C
    96. user1@vm1:~$ fg
    97. sudo tail -n0 -f /var/log/kern.log | cut -c52-300
    98. ^C
    99. user1@vm1:~$

    解释

    1. 列出所有表中的所有iptables规则。你看不到任何东西。
    2. 允许lo(环回)接口上的所有传入流量。
    3. 允许 TCP 端口 22 上的所有传入流量,这是ssh
    4. 将默认INPUT策略更改为DROP,禁止所有传入连接,除了 TCP 端口 22。如果在此丢失vm1的连接,则表示你做错了,在 VirtualBox 中重新启动并重试。
    5. 列出当前的过滤器规则。注意:你可以按号码删除规则,如下所示:sudo iptables -t filter -D INPUT 2。请注意策略与规则完全不一样。
    6. 尝试ping你的默认网关,失败了。为什么是这样,即使允许传出连接(Chain OUTPUT (policy ACCEPT))?传出的数据包被发送到网关,但是网关的回复不能进入。
    7. 添加一条规则,告诉iptables允许属于已建立连接的所有数据包,例如来自vm1的所有连接。
    8. 列出当前的过滤器规则。你可以看到我们的新规则。
    9. ping vm1的默认网关,这次成功了。
    10. 加载 Linux 内核模块,它允许使用包过滤日志功能。
    11. 添加规则,来记录所有发往vm1任何接口的 UDP 端口 1024 的传入数据包。
    12. 添加规则,来记录所有来自vm1任何接口的 UDP 端口 1024 的传出数据包。
    13. 列出raw表规则。
    14. 在后台启动tail,将打印写入/var/log/kern.log的所有新行。cut会在开头删除不必要的日志条目前缀。请注意后台进程如何写入终端。
    15. 以服务器模式启动nc,在vm1的所有接口上监听 UDP 端口 1024 。
    16. 以客户端模式启动nc,将字符串Hello there!发送到我们的服务器模式nctail打印出kern.log中的所有新行,你可以看到在 Linux 内核封包过滤器中,我们的单个 UDP 数据包从一个表到了另一个表。没有回复,所以只有一个数据包被发送和处理。
    17. 杀死客户端模式nc
    18. 将服务器模式nc带到前台。
    19. 杀死服务器模式nc
    20. sudo tail -n0 -f /var/log/kern.log | cut -c52-300 &带到前台。
    21. 杀死它。

    附加题

    这个练习本身已经很大了。只需要打印出日志,并使用铅笔浏览它,直到理解了每一行的每个字段都发生了什么。如果你卡住了,去问别人:http://nixsrv.com/llthw/ex26/log。