|
|
为了能够更灵活的配置 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(这本书还不错,相对比较全面,但要得到系统安全的整体概念,还得下一番功夫)。
所以,写了如下一个测试脚本:
- #!/bin/bash
- iptables -F
- /sbin/modprobe ipt_MASQUERADE
- /sbin/modprobe iptable_nat
- /sbin/modprobe ipt_LOG
- /sbin/modprobe ip_conntrack
- # iptables -P INPUT -j ACCEPT
- # iptables -P FORWARD -j ACCEPT
- # iptables -P OUTPUT -j ACCEPT
- iptables -t nat -A PREROUTING -i eth0 -j LOG --log-level 0 --log-prefix "PREROUTING_i_eth0: "
- # iptables -t nat -A PREROUTING -o eth0 -j LOG --log-prefix "PREROUTING_o_eth0: "
- iptables -A FORWARD -i eth0 -j LOG --log-level 0 --log-prefix "FORWARD_i_eth0: "
- iptables -A FORWARD -o eth0 -j LOG --log-level 0 --log-prefix "FORWARD_o_eth0: "
- # iptables -t nat -A POSTROUTING -i eth0 -j LOG --log-prefix "POSTROUTING_i_eth0: "
- iptables -t nat -A POSTROUTING -o eth0 -j LOG --log-level 0 --log-prefix "POSTROUTING_o_eth0: "
- iptables -t nat -A PREROUTING -i ppp0 -j LOG --log-level 0 --log-prefix "PREROUTING_i_ppp0: "
- # iptables -t nat -A PREROUTING -o ppp0 -j LOG --log-prefix "PREROUTING_0_ppp0: "
- iptables -A FORWARD -i ppp0 -j LOG --log-level 0 --log-prefix "FORWARD_i_ppp0: "
- iptables -A FORWARD -o ppp0 -j LOG --log-level 0 --log-prefix "FORWARD_o_ppp0: "
- # iptables -t nat -A POSTROUTING -i ppp0 -j LOG --log-prefix "POSTROUTING_i_ppp0: "
- iptables -t nat -A POSTROUTING -o ppp0 -j LOG --log-level 0 --log-prefix "POSTROUTING_o_ppp0: "
- iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
- echo 1 > /proc/sys/net/ipv4/ip_forward
- iptables -A INPUT -j ACCEPT
- iptables -A FORWARD -j ACCEPT
- 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 接口的地址呢?
我没有两块网卡,暂时没法测试。
我很希望有人原意共同探讨这个问题以解我疑惑。
谢谢。 |
|