假设您有以下设置:您有多个内部网络以及多个外部 IP 地址和/或网络。您想要实现的是让 LAN #1 仅使用外部 IP #1,而 LAN #2 使用外部 IP #2。
内部局域网 ----------> 公网 IP
LAN #1 外部 IP #1 192.168.0.x --> 123.123.123.11
LAN #2 外部 IP #2 192.168.1.x --> 123.123.123.12
基本上,我们在这里描述的是不仅基于目标地址(典型的 IP 路由)进行路由,而且还基于源地址进行路由。这通常被称为“策略路由”或“源路由”。此功能在 2.0.x 内核中不可用,*在* 2.2.x 内核中通过 IPROUTE2 软件包可用,并且内置于使用 IPTABLES 的新 2.4.x 内核中。
首先,您必须理解 IPFWADM 和 IPCHAINS 都是在路由系统决定将给定数据包发送到哪里*之后*才介入的。这个声明真的应该用红色大字印在所有 IPFWADM/IPCHAINS/IPMASQ 文档上。原因是用户必须首先正确设置他们的路由,然后才开始添加 IPFWADM/IPCHAINS 和/或 Masq 功能。
无论如何,对于上面显示的示例情况,您需要说服路由系统将来自 192.168.0.x 的数据包通过 123.123.123.11 路由,并将来自 192.168.1.x 的数据包通过 123.123.123.12 路由。这是最难的部分,在正确的路由之上添加 Masq 很简单。
要进行这种高级路由,您将使用 IPROUTE2。因为此功能与 IPMASQ 无关,所以本 HOWTO 不会详细介绍此主题。有关此主题的完整 URL 和文档,请参阅 第 2.7 节。
“iprule”和“iproute”命令与“ip rule”和“ip route”命令相同(我更喜欢前者,因为它更容易搜索。)以下所有命令都未经测试,如果它们不起作用,请告知 David Ranch,但请联系 IPROUTE2 邮件列表寻求帮助。此功能与 IP 伪装无关。
2.4.x 内核
以下内容将集成到您的 rc.firewall-iptables 规则集的末尾
EXTIF="eth0" INTNET1="192.168.0.0/24" INTNET2="192.168.1.0/24" EXTIP1="123.123.123.11" EXTIP2="123.123.123.12" iptables -t nat -A POSTROUTING -o $EXTIF -s $INTNET1 -j SNAT --to $EXTIP1 iptables -t nat -A POSTROUTING -o $EXTIF -s $INTNET2 -j SNAT --to $EXTIP2 |
2.2.x 内核
最初的几个命令只需要在启动时执行一次,例如在 /etc/rc.d/rc.local 文件中。
# Allow internal LANs to route to each other, no masq. /sbin/iprule add from 192.168.0.0/16 to 192.168.0.0/16 table main pref 100 # All other traffic from 192.168.1.x is external, handle by table 101 /sbin/iprule add from 192.168.1.0/24 to 0/0 table 101 pref 102 # All other traffic from 192.168.2.x is external, handle by table 102 /sbin/iprule add from 192.168.2.0/24 to 0/0 table 102 pref 102 These commands need to be issued when eth0 is configured, perhaps in /etc/sysconfig/network-scripts/ifup-post (for Redhat systems). Be sure to do them by hand first to make sure they work. # Table 101 forces all assigned packets out via 123.123.123.11 /sbin/iproute add table 101 via 123.123.123.11 # Table 102 forces all assigned packets out via 123.123.123.12 /sbin/iproute add table 102 via 123.123.123.12 At this stage, you should find that packets from 192.168.1.x to the outside world are being routed via 123.123.123.11, packets from 192.168.2.x are routed via 123.123.123.12. It is IMPORTANT that these IPROUTE2 rules be run /BEFORE/ the rc.firewall-* ruleset is run. If everything hangs together, the masq code will see packets being routed out on 123.123.123.11 and 123.123.123.12 and will use those addresses as the masq source address. |