LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 647|回复: 1

讨论:用LOG选项检测iptables,查看报文流入流出过程

[复制链接]
发表于 2005-1-8 21:33:14 | 显示全部楼层 |阅读模式
为了能够更灵活的配置 iptables,做的真正的一通百通,我觉得有必要搞清楚 iptables 到底是怎样工作的,数据报文的流入、流出的路线到底是怎样的。

我在阅读了《Linux 系统安全──开发源码安全工具管理员指南》(Scott Mann, Ellen L. Mitchell, Mitchell Krell 著,电子工业出版社) 中关于 ipchains/iptables 的内容后,我考虑 报文的流入流出的实际路线应该是:
LAN ---> eth0(PREROUTING) ---> 路由算法 ---> eth0(FORWARD) ---> eth0(POSTROUTING) ---> ppp0(PREROUTING) ---> ppp0(FORWARD) ---> ppp0(POSTROUTING: NAT) ---> Internet

LAN <--- eth0(POSTROUTING) <--- eth0(FORWARD) <--- eth0(PREROUTING) <--- ppp0(POSTROUTING) <--- ppp0(FORWARD) <--- 路由算法 <--- ppp0(PREROUTING) <--- Internet

不知道这种理解对不对?是不是针对每一个网络接口都有完整的表、链规则?

可见《Linux 系统安全》第16章,p338-339 及图 16.3(这本书还不错,相对比较全面,但要得到系统安全的整体概念,还得下一番功夫)。

所以,写了如下一个测试脚本:

  1. #!/bin/bash

  2. iptables -F

  3. /sbin/modprobe ipt_MASQUERADE
  4. /sbin/modprobe iptable_nat
  5. /sbin/modprobe ipt_LOG
  6. /sbin/modprobe ip_conntrack

  7. # iptables -P INPUT -j ACCEPT
  8. # iptables -P FORWARD -j ACCEPT
  9. # iptables -P OUTPUT -j ACCEPT

  10. iptables -t nat -A PREROUTING -i eth0 -j LOG --log-level 0 --log-prefix "PREROUTING_i_eth0: "
  11. # iptables -t nat -A PREROUTING -o eth0 -j LOG --log-prefix "PREROUTING_o_eth0: "
  12. iptables -A FORWARD -i eth0 -j LOG --log-level 0 --log-prefix "FORWARD_i_eth0: "
  13. iptables -A FORWARD -o eth0 -j LOG --log-level 0 --log-prefix "FORWARD_o_eth0: "
  14. # iptables -t nat -A POSTROUTING -i eth0 -j LOG --log-prefix "POSTROUTING_i_eth0: "
  15. iptables -t nat -A POSTROUTING -o eth0 -j LOG --log-level 0 --log-prefix "POSTROUTING_o_eth0: "

  16. iptables -t nat -A PREROUTING -i ppp0 -j LOG --log-level 0 --log-prefix "PREROUTING_i_ppp0: "
  17. # iptables -t nat -A PREROUTING -o ppp0 -j LOG --log-prefix "PREROUTING_0_ppp0: "
  18. iptables -A FORWARD -i ppp0 -j LOG --log-level 0 --log-prefix "FORWARD_i_ppp0: "
  19. iptables -A FORWARD -o ppp0 -j LOG --log-level 0 --log-prefix "FORWARD_o_ppp0: "
  20. # iptables -t nat -A POSTROUTING -i ppp0 -j LOG --log-prefix "POSTROUTING_i_ppp0: "
  21. iptables -t nat -A POSTROUTING -o ppp0 -j LOG --log-level 0 --log-prefix "POSTROUTING_o_ppp0: "
  22. iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
  23. echo 1 > /proc/sys/net/ipv4/ip_forward

  24. iptables -A INPUT -j ACCEPT
  25. iptables -A FORWARD -j ACCEPT
  26. iptables -A OUTPUT -j ACCEPT
复制代码


# ifconfig ppp0
222.240.23.233

这是 ADSL 拨号后得到的 IP 地址,内网网关的地址为192.168.0.11,另外一台主机地址是192.168.0.4。

www.mysql.com 这个外部地址来测试一下:
# dig www.mysql.com
;; ANSWER SECTION:
www.mysql.com.          556     IN      A       213.115.162.82
www.mysql.com.          556     IN      A       213.136.52.82

# traceroute 213.115.162.82
1  61.187.71.252 (61.187.71.252)  26.063 ms  24.450 ms  25.588 ms
2  61.187.70.97 (61.187.70.97)  23.910 ms  22.972 ms  23.912 ms
3  61.187.134.242 (61.187.134.242)  24.142 ms  22.800 ms  23.979 ms
4  61.187.255.133 (61.187.255.133)  31.931 ms  32.563 ms  31.903 ms
5  202.97.40.161 (202.97.40.161)  40.001 ms  41.432 ms  39.916 ms
6  202.97.33.138 (202.97.33.138)  39.940 ms  39.980 ms  40.220 ms
7  * 202.97.51.178 (202.97.51.178)  261.180 ms *
8  202.97.49.5 (202.97.49.5)  684.622 ms  676.840 ms *
9  208.50.13.245 (208.50.13.245)  763.250 ms  718.232 ms  710.337 ms
10  so6-0-0-2488M.ar1.ARN1.gblx.net (67.17.67.250)  432.132 ms  430.524 ms  430.165 ms
11  64.215.185.82 (64.215.185.82)  900.472 ms  924.091 ms  906.315 ms
12  pos11-0.cr2.sto1.se.bredband.com (195.54.123.249)  886.476 ms  912.863 ms  888.420 ms
13  pos14-0.cr1.sto1.se.bredband.com (195.54.123.129)  496.225 ms  432.663 ms  436.171 ms
14  * pos2-0.cr2.sto3.se.bredband.com (195.54.114.246)  436.768 ms *
15  vlan6.dr2.upp1.se.bredband.com (195.54.120.146)  437.303 ms * *
16  ua-213-115-248-140.cust.bredbandsbolaget.se (213.115.248.140)  901.920 ms  901.133 ms  906.526 ms
17  * * *
18  * * *

结果是:(tail -f /var/log/message)
192.168.0.4$ ping www.mysql.com
Jan  8 14:05:36 Chowroc kernel: PREROUTING_i_eth0: IN=eth0 OUT= MAC=00:50:fc:5e:01:b3:00:0c:29:43:33:c0:08:00 SRC=192.168.0.4 DST=213.115.162.82 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=7683 SEQ=256
Jan  8 14:05:36 Chowroc kernel: FORWARD_i_eth0: IN=eth0 OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=7683 SEQ=256
Jan  8 14:05:36 Chowroc kernel: FORWARD_o_ppp0: IN=eth0 OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=7683 SEQ=256
Jan  8 14:05:36 Chowroc kernel: POSTROUTING_o_ppp0: IN= OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=7683 SEQ=256
Jan  8 14:05:36 Chowroc kernel: FORWARD_o_eth0: IN=ppp0 OUT=eth0 SRC=213.115.162.82 DST=192.168.0.4 LEN=84 TOS=0x10 PREC=0x60 TTL=46 ID=34272 PROTO=ICMP TYPE=0 CODE=0 ID=7683 SEQ=256
Jan  8 14:05:36 Chowroc kernel: FORWARD_i_ppp0: IN=ppp0 OUT=eth0 SRC=213.115.162.82 DST=192.168.0.4 LEN=84 TOS=0x10 PREC=0x60 TTL=46 ID=34272 PROTO=ICMP TYPE=0 CODE=0 ID=7683 SEQ=256
Jan  8 14:05:37 Chowroc kernel: PREROUTING_i_eth0: IN=eth0 OUT= MAC=00:50:fc:5e:01:b3:00:0c:29:43:33:c0:08:00 SRC=192.168.0.4 DST=213.115.162.82 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=7683 SEQ=512
Jan  8 14:05:37 Chowroc kernel: FORWARD_i_eth0: IN=eth0 OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=7683 SEQ=512
Jan  8 14:05:37 Chowroc kernel: FORWARD_o_ppp0: IN=eth0 OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=7683 SEQ=512
Jan  8 14:05:37 Chowroc kernel: POSTROUTING_o_ppp0: IN= OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=7683 SEQ=512

192.168.0.4$ telnet www.mysql.com 80
Jan  8 14:15:18 Chowroc last message repeated 2 times
Jan  8 14:15:30 Chowroc kernel: PREROUTING_i_eth0: IN=eth0 OUT= MAC=00:50:fc:5e:01:b3:00:0c:29:43:33:c0:08:00 SRC=192.168.0.4 DST=213.115.162.82 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=26127 DF PROTO=TCP SPT=1027 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Jan  8 14:15:30 Chowroc kernel: FORWARD_i_eth0: IN=eth0 OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=60 TOS=0x10 PREC=0x00 TTL=63 ID=26127 DF PROTO=TCP SPT=1027 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Jan  8 14:15:30 Chowroc kernel: FORWARD_o_ppp0: IN=eth0 OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=60 TOS=0x10 PREC=0x00 TTL=63 ID=26127 DF PROTO=TCP SPT=1027 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Jan  8 14:15:30 Chowroc kernel: POSTROUTING_o_ppp0: IN= OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=60 TOS=0x10 PREC=0x00 TTL=63 ID=26127 DF PROTO=TCP SPT=1027 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Jan  8 14:15:31 Chowroc kernel: FORWARD_o_eth0: IN=ppp0 OUT=eth0 SRC=213.115.162.82 DST=192.168.0.4 LEN=60 TOS=0x10 PREC=0x60 TTL=46 ID=0 DF PROTO=TCP SPT=80 DPT=1027 WINDOW=5752 RES=0x00 ACK SYN URGP=0
Jan  8 14:15:31 Chowroc kernel: FORWARD_i_ppp0: IN=ppp0 OUT=eth0 SRC=213.115.162.82 DST=192.168.0.4 LEN=60 TOS=0x10 PREC=0x60 TTL=46 ID=0 DF PROTO=TCP SPT=80 DPT=1027 WINDOW=5752 RES=0x00 ACK SYN URGP=0
Jan  8 14:15:31 Chowroc kernel: FORWARD_i_eth0: IN=eth0 OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=52 TOS=0x10 PREC=0x00 TTL=63 ID=26128 DF PROTO=TCP SPT=1027 DPT=80 WINDOW=5840 RES=0x00 ACK URGP=0
Jan  8 14:15:31 Chowroc kernel: FORWARD_o_ppp0: IN=eth0 OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=52 TOS=0x10 PREC=0x00 TTL=63 ID=26128 DF PROTO=TCP SPT=1027 DPT=80 WINDOW=5840 RES=0x00 ACK URGP=0
Jan  8 14:15:35 Chowroc kernel: FORWARD_o_eth0: IN=ppp0 OUT=eth0 SRC=213.115.162.82 DST=192.168.0.4 LEN=60 TOS=0x10 PREC=0x60 TTL=46 ID=0 DF PROTO=TCP SPT=80 DPT=1027 WINDOW=5752 RES=0x00 ACK SYN URGP=0
Jan  8 14:15:35 Chowroc kernel: FORWARD_i_ppp0: IN=ppp0 OUT=eth0 SRC=213.115.162.82 DST=192.168.0.4 LEN=60 TOS=0x10 PREC=0x60 TTL=46 ID=0 DF PROTO=TCP SPT=80 DPT=1027 WINDOW=5752 RES=0x00 ACK SYN URGP=0
Jan  8 14:15:35 Chowroc kernel: FORWARD_i_eth0: IN=eth0 OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=64 TOS=0x10 PREC=0x00 TTL=63 ID=26129 DF PROTO=TCP SPT=1027 DPT=80 WINDOW=5840 RES=0x00 ACK URGP=0
Jan  8 14:15:35 Chowroc kernel: FORWARD_o_ppp0: IN=eth0 OUT=ppp0 SRC=192.168.0.4 DST=213.115.162.82 LEN=64 TOS=0x10 PREC=0x00 TTL=63 ID=26129 DF PROTO=TCP SPT=1027 DPT=80 WINDOW=5840 RES=0x00 ACK URGP=0

结论是:流出,除了 eth0-POSTROUTING 是对的,返回流入,则只经过了 eth0-FORWARD 和 ppp0-FORWARD。

我知道:ppp0 是2063端口,eth0 是1027端口,当目的端口是2063的数据包从 Internet 返回时,Linux 知道要将该包重新传递到 eth0,并将其发送到原始客户机。

但是,为什么返回流入的数据没有经过 PREROUTING 和 POSTROUTING。如果是外部请求的本地服务又会是怎样的情况呢?

前两天,看到论坛中讨论使用两块网卡进行 ADSL 共享的讨论,使我考虑这个问题:因为我以前是只用一块网卡进行局域网的 ADSL 共享的,而ppp0 和 eth0 实际上是同一块物理设备,而如果增加 eth1,那么是不是要添加 eth0 和 eth1 之间的规则?局域网中的其他共享主机,在设置 DNS 和路由时应该设置成 eth0 还是 设置成  eth1 接口的地址呢?

我没有两块网卡,暂时没法测试。

我很希望有人原意共同探讨这个问题以解我疑惑。

谢谢。
 楼主| 发表于 2005-1-10 20:03:21 | 显示全部楼层
另外,我设置默认规则,返回如下错误:
iptables v1.2.6a: -P requires a chain and a policy
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.2.6a: -P requires a chain and a policy
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.2.6a: -P requires a chain and a policy
Try `iptables -h' or 'iptables --help' for more information.

请教原因。

谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表