我有一台 Debian 服务器,带有一个传入接口 (eth1) 和三个调制解调器 (modem1、modem2、modem3)。此服务器上有一个 squid 实例,监听三个连续端口 (具体来说是 3128、3129、3130)。
我能够设置将来自 eth1 的所有数据包路由到其中一个调制解调器,但我需要根据客户端连接到的端口来路由数据包。例如,如果客户端使用 192.168.138.2:3128 作为代理,则通过 192.168.6.1(即调制解调器 1 的 IP 地址)路由其数据包。这可能吗?
我不需要一步一步的解决方案,只要用谷歌搜索一下术语或类似的东西我就很高兴了,因为目前我陷入了困境。
答案1
您需要的是基于策略的路由。请参阅man ip-rule
。
ip rule add dport 3128 table 100
ip rule add dport 3129 table 101
ip rule add dport 3130 table 102
现在您可以创建不同的路由表
ip route add default via 192.168.6.1 table 100
ip route add default via 192.168.6.2 table 102
ip route add default via 192.168.6.3 table 102
只要您不使用预定义的数字,表格编号或多或少是任意的。
答案2
设法完成所有事情。仅以 2 个接口为例
- 在 squid.conf 中为每个端口创建 acl
acl ip1 myport 3128
acl ip2 myport 3129
- 为两个 acl 设置 tcp_outgoing_address
# 192.168.6.2 - address that first modem gave us
tcp_outgoing_address 192.168.6.2 ip1
tcp_outgoing_address 192.168.7.2 ip2
- 为两个接口创建路由表
echo "201 out1" >> /etc/iproute2/rt_tables
echo "202 out2" >> /etc/iproute2/rt_tables
- 并进行设置
ip route add 192.168.6.0/24 dev enp2s0u1u3 src 192.168.6.2 table out1
ip route add default via 192.168.6.1 table out1
另一个接口也一样
- 添加现在有意义的规则,以前没有
sudo ip rule add from 192.168.6.2 table out1
sudo ip rule add from 192.168.7.2 table out2
现在一切都按预期进行。