背景资料
- 我正在使用 Linux 系统为一小块公共 IPv4 地址路由流量(通过在 中启用 IP 转发
sysctrl.conf
)。 eth1
路由器正在使用 PPPoE连接到 ISP 。- 用于 ppp 的本地对等地址是由 ISP 指定的手动配置的 IP 地址。本地对等地址是
10.0.0.10
。 - 用于 ppp 的远程对等地址也是 ISP 指定的手动配置的 IP 地址。本地对等地址是
10.0.0.9
。 路由器的默认路由是
10.0.0.9
via10.0.0.10
。路由器通过 连接到以太网交换机
eth0
。eth0
配置为使用公共地址之一。- 交换机连接所有其他公共主机。每个连接的主机都使用一个公共 IP 地址。
10.0.0.9
ISP ----------+
| 10.0.0.10 X.X.X.X
+------------- (eth1) ROUTER (eth0) --------------- SWTICH
|
+-- X.X.X.Y
+-- X.X.X.Z
...
我的问题
除了在路由器上运行的程序外,一切都按预期工作。我在路由器上运行的任何应用程序10.0.0.10
在启动与 Internet 的连接时都用作源 IP 地址。这是可以理解的,因为eth1
互联网是可用的。但是,由于该地址不可公开路由,因此apt
、ping
和其他程序不起作用。如果我在支持它的应用程序(即ping
)上明确设置源地址,应用程序确实可以工作。
我的问题
如何将路由器配置为通过eth1
/路由未知数据包,同时在启动新连接10.0.0.9
时还使用公共 IP 地址作为默认源?eth0
注意:我会考虑你的路由器的局域网是192.0.2.0/24,它在eth0上的局域网IP是192.0.2.1/24,以便能够给出具体的解释和解决方案。
为了节省一些公共 IP 地址,您的 ISP 为您分配了一个私有 IP,用于内部路由。没关系,因为这个 IP 永远不会在外面看到(如果曾经放在 ISP 路由器之外的线路上,那么沿路径的严格反向路径转发会迅速丢弃,或者如果不是,因为不可路由,永远不会得到回复)。但这会使您的配置更加复杂,以避免在所有情况下都使用此 IP,但从您的路由器连接到 ISP。
你可能有类似的东西(可能略有不同,没关系):
例如,您可能有
default via 10.0.0.9 dev ppp0 src 10.0.0.10
,或者via 10.0.0.9
甚至没有出现,因为它是第 3 层链接而不是第 2 层链接,因此via
不需要(但仍被接受)。只需相应地调整以下设置。目前,内核选择显然最适合的 IP,即设置在同一侧以访问 Internet 的 IP,因为没有任何其他说明(或者它明确告诉使用您不想要的 IP):
当内核检查如何访问互联网并声明特定的首选源 IP 地址时,您只需要替换路由行为。请注意,如果出现错误和不可预见的问题,您可能会失去连接。如果可能,具有备用(控制台)访问权限:
就是这样,您的路由器将照常路由,但是当需要选择本地发起的传出 IP 时,将选择 192.0.2.1,除非另有明确说明(例如:进程明确绑定其套接字上的源 IP)。
每次链路关闭然后打开时,必须再次设置此路由。在链接完全建立后,您可以将其集成到一些 pppoe 脚本中。
另请注意,接口名称ppp0可能会更改为ppp1或任何其他名称。这取决于您在设置脚本中处理此问题。
设置相同路由设置的替代方法:
如果设置了原始指标(即它不是 0,假设它是 100),您可以添加一个具有较低指标的备用默认路由,而不是替换以前的:
如果您担心 pppoe 中涉及的各种工具的交互可能会删除上述路由,您可以将此设置安装在备用路由表中,并在路由规则中赋予其优先级,并使用主表的部分副本来防止中断。每次断开/重新连接后仍然需要重做,因为路由仍然会消失。这
iif lo
是特殊的,实际上意味着“本地发起的传出数据包”而不是传入,并且 109 是任意选择的表值:如果您在主表中添加了其他路由条目,您可能还必须在上面复制它们。
正如你所说。交换机上以您的路由器作为网关的其他客户端具有公共 IP 地址。你的路由器没有。它有一个不会被路由的 LAN 地址。由于您的互联网服务提供商没有给您一个公共地址,路由器将无法出去。
如果您有另一个公共 ip,请在 eth1 上创建虚拟 eth 配置并正确路由。然后你的路由器也可以出去了。