我有来自不同 ISP 的多个互联网连接,我需要通过特定的 ISP 链路路由某些流量。我为此使用了 Debian。
设置如下;
eth0(IP 地址为 192.168.1.2,网关为 192.168.1.1(192.168.1.1 是具有四个不同 ADSL 连接负载平衡的多 ADSL WAN 路由器))
eth1(IP 地址为 10.254.239.1。这是本地网络,所有工作站都通过 DHCP 从该网络获取分配的 IP 地址)
eth2(IP 地址为(假的)20.20.20.22,网关为 20.20.20.21)
目标是仅通过 eth2 路由特定流量,并通过 eth0 路由所有其他流量至 4 端口 WAN 路由器。
我已经阅读了 lartc.org 示例和许多其他示例,但无法使其发挥作用......
我所做的是;
在 /etc/iproute2/rt_tables 中添加了路由表
201 fiber
将以下内容添加到 rc.local
ip route add 20.20.20.20 dev eth2 src 20.20.20.22 table fiber
ip route add default via 20.20.20.21 table fiber
ip route add 20.20.20.20 dev eth2 src 20.20.20.22
ip rule add fwmark 2 table fiber
修改 iptables 脚本至;
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth0 -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth2 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth2 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth2 -j ACCEPT
iptables -t mangle -N fiber
iptables -t mangle -A fiber -j MARK --set-mark 2
iptables -t mangle -A fiber -j ACCEPT
# ONLY ROUTE TRAFFIC GOING TO 1.2.3.x OVER THE FIBER LINK
iptables -t mangle -A PREROUTING -i eth1 -p tcp -d 1.2.3.4 --dport 80 -j fiber
iptables -t mangle -A PREROUTING -i eth1 -p tcp -d 1.2.3.5 --dport 80 -j fiber
iptables -t mangle -A PREROUTING -i eth1 -p tcp -d 1.2.3.4 --dport 443 -j fiber
iptables -t mangle -A PREROUTING -i eth1 -p tcp -d 1.2.3.5 --dport 443 -j fiber
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth0 -j REJECT
iptables -A FORWARD -i eth2 -o eth2 -j REJECT
在内核级别启用IP转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
我遗漏了什么或做错了什么?非常感谢您的帮助。
答案1
这些规则可能不是您想要的。第一条规则允许来自 eth1 和 eth2 的任何新连接,第二条规则允许来自 eth0 和 eth1 的所有内容。这似乎允许来自任何接口的所有内容,基本上使您的防火墙毫无意义。
iptables -A INPUT -m state --state NEW -i ! eth0 -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth2 -j ACCEPT
你可能指的是这个。
iptables -A INPUT -m state --state NEW -i eth1 -j ACCEPT
无论如何,我可能不会将内容添加到 rc.local,而是更新您的 /etc/network/interfaces 使其看起来像这样。我对您的掩码做了一些猜测,因此请务必检查并更新。您可能应该将所有链接路由添加到光纤表中。
auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
up ip route add table fiber scope link proto kernel dev eth0 192.168.1.0/24
auto eth1
iface eth1 inet static
address 10.254.239.1
netmask 255.255.255.0
network 10.254.239.0
broadcast 10.254.239.255
up ip route add table fiber scope link proto kernel dev eth1 10.254.239.0/24
auto eth2
iface eth2 inet static
address 20.20.20.22
netmask 255.255.255.252
network 20.20.20.20
broadcast 20.20.20.23
up ip route add table fiber scope link proto kernel dev eth2 20.20.20.20/30
up ip route add default via 20.20.20.21 table fiber
up ip rule add fwmark 2 table fiber