type
status
date
slug
summary
tags
category
icon
password
如需技术支持,请点击 👉 联系方式
前段时间把软路由换了下来,换上刷了 Padavan 的红米 AC2100 硬路由。由于需要在 unRAID 上开启另一个网段的 IP 给到 Docker 用,因此就必须要在 Padavan 上设置第二个网段 IP 来正常给同网段的应用提供路由。本文章记录了在 Padavan 和 unRAID 上的设置过程,以此作为实现 unRAID 双网卡走不同网关的目的。
前言
作者的内网环境中存在透明代理(也就是常说的旁路由)且作者将 unRAID 的网关设置为了这个透明代理,由此作者诞生了另一个需求:某些服务走另一个网卡上的另一个网段去联网(不经过透明代理),这样就一方面可以把流量负载分摊到另一个网卡上,另一方面可以实现双网关的目的。
本文章记录了在 Padavan 和 unRAID 上的设置过程,以此作为实现 unRAID 的双网卡双网关 Docker 分流目的的实验。
正好前段时间把软路由换了下来,换上刷了 Padavan 的红米 AC2100 硬路由,因为需要在 unRAID 上开启另一个网段的 IP 给到 Docker 服务去联网,因此就必须要在 Padavan 上设置第二个网段 IP 来正常给同网段的应用提供路由,所以正好也向大家介绍如何在 Padavan 上添加第二个网段 IP。
需要说明的是,实现本文开头所说的目标有很多种办法,会有比本文更好的解决方案,但由于作者自身能力有限尚无法实现,所以本文仅仅只是作为一个参考给到大家,大家如果有更好的方法希望可以告诉我。
本文所希望实现的网络信息如下图所示:
- 如图所示,正常情况下
eth0
的流量都会经过透明代理(Openwrt),在引入了第二个网卡的情况下可以实现绕开透明代理的直接将数据发送给主路由(Padavan)。
- 新建一个
10.10.11.0/24
网段 IP,让这个网段的 IP 走eth1
网卡。
- 为了实现这一目的,需要在主路由器上新建一个虚拟子网卡 br0:1,并设置 IP 地址为
10.10.11.1
,即相当于10.10.11.0/24
网段的网关地址 。
设置好之后,就可以人为的决定让 unRAID 上的哪些服务去走哪个网卡。
1、为什么要在 unRAID 上做双网关
因为需要让 unRAID 的某些服务走特定的网关。
默认情况下,unRAID 自身服务所跑的网络流量都会走向在网络设置中的网关地址:
比如说如果你给 unRAID 设置了旁路由网关(也就是透明网关),那么 unRAID 下面的服务包括 Docker 都会将流量发送给旁路由,再由旁路由对流量进行处理之后发送给主路由。如果你的旁路由上开启了代理工具,那么就有可能会导致 unRAID 上的某些不需要走代理的服务走了代理,例如 qBittorrent 或者 Transmission 等这一类 P2P 下载工具。
但如果说你的 unRAID 上有多个网口或者说存在 PCIE 网卡,那么就可以将除管理口之外多出来的一个或多个网口给到 unRAID,然后让这个网口的数据包走另一个网段,这样我们就可以实现让某些 Docker 不走旁路由、某些 Docker 走旁路由的分流目的。
由于存在透明网关,往往还会遇到端口转发的问题,也就是如果你需要将某个服务的端口暴露到外网上,那么你可能得需要在主路由上将端口转发指向透明网关,然后再从透明网关转发给对应的服务。但如果实现了本文所说的分流目的,那么某些服务就不需要这么麻烦的去这么做端口转发了。
2、如何在 Padavan 上添加第二个网段并添加相应的 NAT 规则
此章节涉及到 Linux 的相关命令行知识(如 ip、ifconfig、iptables 等),
2.1、开启 SSH 服务
由于我这一个 Padavan 的 WebUI 界面上没有可以直接添加网段的地方,只能是通过 SSH 到路由器上使用命令行进行操作,因此就需要打开路由器的 SSH 终端服务:
使用 SSH 工具登录后台:
2.2、添加 br0:1
子接口
要实现第二个网段的添加,就需要添加一个虚拟子接口,需要用到
ip
命令:在上述命令中,
10.10.11.1/24
是你要为子接口分配的IP地址和子网掩码,br0
是物理网桥接口的名称,br0:1
是子接口的标签(名称)。这个命令会将指定的IP地址和子网掩码添加到物理网桥接口的子接口上。brd
是ip addr
命令的一个选项,用于指定广播地址。
+
是一个特殊符号,用于告诉命令使用默认的广播地址计算方法。默认情况下,广播地址是基于子网掩码和IP地址计算得出的。
dev br0
指定了要添加地址的设备名称,即物理网桥接口。
同样的效果也可以通过ifconfig
命令实现:
添加好之后,可以通过以下命令查看创建好的
br0:1
子接口的信息:或者通过
ifconfig
命令:2.3、添加 iptables 规则实现外网访问
这里涉及到 iptables 和网络的相关知识,比较复杂,作者自身也不是理解的很透彻,所以这一章节只简单介绍实现的方法和原理。
当添加好之接口之后,还需要通过 iptables 命令添加一条 nat 规则实现子接口上数据包的源地址修改:
从效果上来说就是将那些从任意接口出去的数据包的源 IP 地址都转换为出去接口的 IP 地址,保证回应的包可以正确地返回到源地址。
添加好之后可以通过以下命令查看已添加的规则:
这条命令的作用是在 iptables 的nat
表的POSTROUTING
链的开始处插入一条规则,该规则将所有经过 POSTROUTING 链的数据包的源地址转换为出口接口的 IP 地址。这是一种类型的源地址 NAT(SNAT)。具体来说:
-t nat
:指定nat
表,它用于地址转换。
-I POSTROUTING
:在POSTROUTING
链的开始处插入一条规则。POSTROUTING 链处理的是路由决策之后的数据包,所以适合做 SNAT。
-j MASQUERADE
:指定MASQUERADE
动作。这个动作会将数据包的源地址改为出口接口的地址,这样回应的包就可以正确地返回到源地址。这条命令通常在需要隐藏内部网络地址,或者需要共享一个公共 IP 地址给多个内部设备时使用。例如,在家庭网络中,家庭路由器可能会使用这种方式,将所有连接到路由器的设备的 IP 地址转换为路由器的公网 IP 地址,以便这些设备能够访问互联网。
其他参 iptables 常用命令
列出 nat 上已设置的规则
删除 nat 表
POSTOUTING
对应编号的规则(通过上面的查看命令添加 --line-number
可以查看到编号):2.4、配置持久化
作者的 Padavan 路由器重启之后上述添加好的相应设置会丢失,所以借助自定义脚本来实现路由器重启后将相应的配置添加上去:
3、unRAID 的相关设置
3.1、网络设置
- 开启第二个网卡的桥接模式。
- 成员绑定为第二个网卡自身。
- 不分配 IP 地址。其实这里分不分配 IP 地址都可以,如果要分配的话那么需要给 unRAID 一个
10.10.11.x
的 IP 地址,同时网关设置为10.10.11.1
。需要说明的是,如果这里设置了网关,那么在下文中的 Docker 自定义网络设置就不能设置网关了,因为会自动以这里的网关作为 Docker 的自定义网络的网关。
3.2、Docker 自定义网络设置
设置 - Docker:
- 子网设置为
10.10.11.0/24
网段。
- 网关设置为
10.10.11.1
;
- DHCP 池可以设置也可以不设置,设置的话 Docker 创建时可以不用手动分配 IP,但需要注意的是需要规定一下 DHCP 池的 IP 起始地址,这样可以避免 IP 地址冲突,比如图中以
10.10.11.10
作为 DHCP 池的起始 IP,Docker 容器自动获取 IP 时就会从10.10.11.10
开始分配 IP。
3.3、给 Docker 分配 IP
创建 Docker 的时候网络类型选择
Custom:br1
:例如给一个 aria2 容器手动设置了
10.10.11.5
的 IP 地址:然后通过容器内的命令行窗口使用 traceroute 命令查看路由的路径情况,可以看到容器将数据包发送到了
10.10.11.1
上,通过路由器将,而不再经过旁路由:4、结尾说明
经过上述的配置,基本上已经实现了本文开头所描述的目的:
- 网卡流量负载分摊;
- 双网关自由分配;
举例来说就是当我们希望某一些服务,比如 QB Docker 容器这一类下载工具直接走
10.10.11.X
网段的 IP 地址,这样就不需要经过旁路由;而其他一些可能需要借助旁路由走代理的服务,比如说 Emby 上的刮削,就可以走默认的网段去走旁路由的代理。4.1、不足
关于 Docker 这一块,实际上作者的想法是建立一个基于 eth1 网卡的自定义 Bridge 网络,这样可以实现一层 Docker 网络的 NAT 隔离。但在实际测试过程中这么做之后流量还是会发送给旁路由(流量发送到
10.10.11.1
然后再发送给了旁路由),这个应该是由于没有相应的 iptables 规则所导致的,但是截至作者写下本文时还没有摸索明白,如果哪天弄清楚我再更新本文。4.2、有待更新
后续会继续完善本文的主题,完。
- 作者:JackieWu
- 链接:https://www.jackiewu.top/article/unraid-dual-gateway-experiment
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。