|
|
发表于 2005-5-31 15:59:07
|
显示全部楼层
另外,iptables 到底是怎样工作的,数据报文的流入、流出的路线到底是怎样的?我其实还是有些不甚了了。
《Linux 系统安全──开发源码安全工具管理员指南》(Scott Mann, Ellen L. Mitchell, Mitchell Krell 著,电子工业出版社) 指出了报文通过各个表和链的情况,但并没有说明接口的问题──比如说,一个接口和两个接口有什么区别?
我曾经考虑报文的流入流出的实际路线应该是:
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
于是,写了一个脚本:
- #!/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
复制代码
通过查看 message 文件中的记录,我的结论是,使用 eth0 + ppp0 的 ADSL 共享上网,内网请求 Internet 服务,经过:
LAN ---> eth0(PREROUTING) ---> 路由算法 ---> eth0(FORWARD) ---> ppp0(FORWARD) ---> ppp0(POSTROUTING: NAT) ---> Internet
没有eth0(POSTROUTING) 和 ppp0(PREROUTING) 的环节。
而 Internet 服务返回的数据,只经过 eth0(FORWARD) 和 ppp0(FORWARDE)──我通过看到的记录只能得出这样的结论。
我知道:ppp0 是2063端口,eth0 是1027端口,当目的端口是2063的数据包从 Internet 返回时,Linux 知道要将该包重新传递到 eth0,并将其发送到原始客户机。
但是,为什么返回流入的数据没有经过 PREROUTING 和 POSTROUTING。如果是外部请求的本地服务又会是怎样的情况呢?
也不知道两块网卡共享上网的情况?
比如 ttyrone 兄自定义了一个链 LOGDENY,然后 INPUT 的一个规则跳转到这个链,那么如果我最后在增加:
iptables -A INPUT -j DROP
还会不会对这个已经跳转的规则起作用呢?这个我后面再试试。不过如果概念问题不弄清楚,就始终是知其然而不知其所以然,遇到新情况就不知道怎么变通了。 |
|