遇见时光

Keep Looking , Don't Settle
Stay Hungry , Stay Foolish

J1900软路由方案全面指南

主要设备材料:J1900(双千兆网口,8G内存)、240G sata SSD(NAS)、128 msata SSD(PVE)、移动宽带。


鉴于本方案过于庞杂,中间的过程会使用别人教程来缩减篇幅,可以自行学习验证,主要是提供软路由搭建和使用内网服务的整体思路,也是记录中间踩坑和搜索学习的整个过程。


由于我们家是移动宽带,所以是大内网的环境,即所谓的访问ip138.com显示的IP地址与路由器的出口IP地址不一致,并且移动不提供公网IP,这就意味着我们不能使用DDNS的方式从外网访问家中内网的服务。如果是电信的宽带,可以问客服要一下公网IP,理由可以是装摄像头的需要,这样后面就可以使用DDNS了,而不需要使用内网穿透的方式。


我们第一步需要将光猫改桥接,这样可以极大的发挥路由器的性能,而不会限于光猫的路由性能瓶颈。由于我家的宽带已经装了很久了,看网上的帖子说和移动客服或者装宽带的师傅改桥接的方式好像不好办,所以我直接上了万能的小黄鱼找人解决了光猫的超级密码的问题(大约3元左右),进入了光猫的后台,将原来的路由模式改为桥接模式,同时关闭DHCP功能,若是不知道家中宽带的账号和密码,此时在页面中的密码一栏右击——>检查,将弹出的开发者模式下的html代码中的text变量值由password改为text,即可看到设置的密码,记住后面拨号要用。登录路由器的后台,一般是192.168.1.1,不同路由器品牌的IP可能不同,可以自行百度,将路由器改为拨号上网的模式PPoE,并且输入自己家宽带的账号密码即可,部分流程可以参考这里


安装PVE

准备8G的装机U盘,一根网线,一根VGA/HDMI线和显示器或者采集卡+笔记本电脑,键盘鼠标或者pdd上面的20多元无线的无线键鼠;

具体步骤是:

  1. 使用ventory将PVE固件烧到U盘中,备用装机;
  2. 安装中,将PVE装到你想要的盘中,我这边有两个盘,分别是128G的msata和240G的2.5 sata,msata主要用于装PVE,2.5 sata是用于装NAS;同时设置面板的IP地址,最好与你的内网IP地址一致,我的内网网关是192.168.31.1,所以我设置为192.168.31.200,所以内网的访问地址是https://192.168.31.200:8006,若是你设置完想要再次修改,可以参考这里。同时注意面板中连接的网口enp1s0(可能是其他的网口),整个安装流程可以参考这里这里
  3. 安装好PVE后,建议更换PVE软件仓库源和CT模板(LXC)源为国内源。具体分为两种方式来实现,一种是使用PVE tools来修改仓库源,具体操作可以参考这里,另外也可以通过PVE tools来进行其他的配置,可以自行研究;另一个是修改CT模板源,具体操作可以参考这里,同时这种方式也可以修改仓库源。此外,如果你的机器支持PCI硬件直通也需要在这里通过PVE tools进行设置。
  4. 可以参考一下这里理解下系统设备名,软路由设备名的概念,我的网络拓扑大概如下图所示,由于我是直接做旁路由的,所以没有WAN口,直接通过LAN口进行桥接,

旁路由模式拓扑图

网络结构如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
+----------------------------------------------------------------+
| LXC |
| +------------------------------------------------+ |
| | OpenWrt | |
| | +--------+ +--------+ +--------+ | |
| | | br-lan |←---→| eth0 | | enp1s0 | | |
| | +--------+ +--------+ +--------+ | |
| | 192.168.31.2 ↑ ↑ | |
| +------------------------|-------------|---------+ |
| veth phys |
|................................|.............|.................|
| ProxmoxVE 7.0 | | |
| | | |
| ↓ ↓ |
| +------+ +--------+ +------+ |
| |enp4s0|←---→| vmbr0 | |enp1s0| |
| +------+ +--------+ +------+ |
| ↑ |
| | |
| | lan |
+----------------------------------------------|-----------------+

+-------+
|router | 192.168.31.1
+-------+ 硬路由

如果是使用WAN口的话可以参考下面的网络拓扑图:

双路由模式拓扑图

网络结构如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
+----------------------------------------------------------------+
| LXC |
| +------------------------------------------------+ |
| | OpenWrt(主) | |
| | +--------+ +--------+ +--------+ | |
| | | br-lan |←---→| eth0 | | enp4s0 | | |
| | +--------+ +--------+ +--------+ | |
| | 192.168.1.1 ↑ ↑ | |
| +------------------------|-------------|---------+ |
| veth phys |
|................................|.............|.................|
| ProxmoxVE 7.0 | | |
| | | |
| ↓ ↓ |
| +------+ +--------+ +------+ |
| |enp1s0|←---→| vmbr0 | |enp4s0| |
| +------+ +--------+ +------+ |
| ↑ ↑ |
| | | |
| | lan | |
+-------------------|--------------------------|-----------------+
↓ ↓wan
+----+ +--------+ +----+ +-------+
| PC |←---→ | switch |←---→| TV | | modem |光猫桥接
+----+ +--------+ +----+ +-------+


J1900网口对应:

外部识别系统设备名软路由内设备名
EHT1(前面)enp1s0eth0(桥接) Lan
ETH0(侧面)enp4s0eth1 Wan

软路由拓扑图:
拓扑图1
拓扑图2


Tips:
服务器定时清理日志:

1
2
3
# root进入
crontab -e
0 1 * * 1,5 /usr/bin/journalctl --vacuum-size=100M

安装OpenWrt

前面我们安装好PVE后,我们需要在其中安装一下OpenWrt,在恩山论坛了解到将OpenWrt装在PVE的虚拟机中的性能不如容器的性能好,但是容器的方案可能出现一些麻烦,本着折腾的心理我们直接上容器。


使用容器安装OpenWrt可以参考这里,使用被人烧录好的固件即可,命令的具体参数可以研究一下自行修改,这里比较重要的是修改OpenWrt的IP地址;它的设置取决你想要将OpenWrt作为双路由模式还是主-旁路由模式,这里说一下我的想法,若是作为主路由,建议设置为内网的网关192.168.31.1,硬路由则使用AP的功能;旁路由的话则设置为内网其他的IP地址即可,可以使用DHCP功能,我这边设置的是192.168.31.2,端口的话改成了66端口,由于运营商把网页服务的80和443端口屏蔽了,所以对OpenWrt的访问端口进行更改,可以在uHTTPd内进行更改。


关于我使用的命令,记录一下,lxc安装OpenWrt:

1
pct create 100 local:vztmpl/vzdump-lxc-113-2022_05_04-openwrt_laop.tar.zst --rootfs local:4 --ostype unmanaged --hostname OpenWrt --arch amd64 --cores 2 --memory 2048 --swap 0 --onboot yes -net0 bridge=vmbr0,name=eth0

OpenWrt中增加WAN口,可以在vi /etc/config/network增加WAN接口的设置即可,由于我作为旁路由,所以就只有一个lan


具体OpenWrt作为旁路由的防火墙和网络的配置可以参考这里这里中旁路由的设置,双路由的方案可以参考这里这里;如果你有公网IP,则要使用端口转发和DDNS,哪个设备拨号上网,就在设置进行端口转发,DDNS的话使用插件中的AliDDNS或者动态DNS即可,设置完之后使用公网IP+端口的方式就可以访问内网的服务了。如果你没有内网IP的话,就要进行第四章的内网穿透工作。


主路由端口转发设置:

名称外部端口内部IP地址内部端口
Alist5244192.168.31.885244
Openwrt66192.168.31.266
qinglong5700192.168.31.885700
nginx8888192.168.31.8880

OpenWrt作为旁路由,内网的设备需要使用其代理上网,则需要将网关设置为其IP地址,DNS也是其IP地址;我将设备网关设置为OpenWrt的IP地址,主要应用是设备和内网的服务出国,还有异地组网,将OpenWrt加入ZeroTier网络,并设置下一跳路由表,使用OpenWrt作为网关的服务和设备就可以和ZeroTier网络中的其他设备互相访问了,这部分内容会在内网穿透部分说明。


作为OpenWrt的灵魂,插件的作用举足轻重,我们可以使用其进行出国、去广告、分流、DDNS、ZeroTier异地组网、FRP内网穿透,BT下载等功能。关于出国的可以参考这里这里这里;去广告的可以参考这里这里


此外,还需要在SSR Plus+上的LAN IP访问控制内设置白名单:

  • 由于我目前仅需要qinglong服务有外网的需求,则设置白名单,内网主机列表为:192.168.31.88;192.168.31.238(测试机)
  • 内网主机分流列表:192.168.31.88;192.168.31.238;不设置全局代理的LAN IP
  • 不走代理的域名增加 jd.comtencent.com

安装Docker

在PVE中安装Docker需要开启特权容器和嵌套的功能,主要的操作可以参考这里这里这里。此外,我们还需要修改LXC的Debian源和Docker的镜像源,具体可以参考这里这里。在设置容器镜像源时,我们可以登录cr.console.aliyun.com;点击“创建我的容器镜像”,得到专属加速地址。修改文件/etc/docker/daemon.json 文件,修改为如下形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi /etc/docker/daemon.json

{
"registry-mirrors": [
"https://xxx.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}
# 加载重启docker并查看
# 使daemon.json 文件生效
systemctl daemon-reload
systemctl restart docker
docker info

同时,我将Docker的IP地址设置为192.168.31.88,网关、DNS设置为OpenWrt的IP地址,这样方面后面ZeroTier异地组网和服务、设备出国。

  • 内网的服务想要在大局域网内互通需要将网关和DNS设置为OpenWrt的IP地址;本例下将Docker容器的DNS和网关设置为OpenWrt地址
  • 从公网访问内网服务只要在设备端输入电脑/服务器的内网IP+端口号即可。

LXC中使用docker:

  1. 安装portainer:
1
2
3
docker run -d -p 10003:8000 -p 10004:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/portainer/data:/data portainer/portainer-ce

# 访问portainer面板可以查看所有Docker服务的运行状况

  1. 安装qinglong:
1
2
3
4
5
6
7
8
9
docker run -dit \
-v /home/docker/qinglong:/ql/data \
-p 5700:5700 \
--name qinglong \
--hostname qinglong \
--restart always \
whyour/qinglong:2.13

# 安装完qinglong后设置相应的定时任务和环境变量

  1. 安装alist:
1
2
3
docker run -d --restart=always -v /home/docker/alist:/opt/alist/data -p 5244:5244 -e PUID=0 -e PGID=0 -e UMASK=022 --name="alist" xhofe/alist:latest

# 安装完alist后按照官网教程设置需要集成的网盘服务

  1. 安装nginxProxyManager:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vi docker-compose.yml

version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./www:/var/www
- ./letsencrypt:/etc/letsencrypt

docker-compose up -d

Tips: /www/html/目录下主要存放192.168.31.88的地址下的页面,可以用于导航页面,也可以安装heimdall来设置导航页面。


  1. 安装heimdall:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vi docker-compose.yml

version: "2.1"
services:
heimdall:
image: lscr.io/linuxserver/heimdall:latest
container_name: heimdall
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- /path/to/appdata/config:/config
ports:
- 88:80
- 444:443
restart: unless-stopped

# 由于外部80和443已经被占用了,所以设置为88和444端口
docker-compose up -d

# 安装完heimdall需要在面板设置首页需要访问的内网服务

端口映射表:

host端口docker内端口服务
8080(代理)nginxProxyManager
8181(管理)nginxProxyManager
443443nginxProxyManager
100038000portainer:tcp
100049000portainer:http
52445244alist
57005700qinglong

应用服务映射表:

应用服务内网IP外网IP
PVE192.168.31.200:80-
Openwrt192.168.31.2:66172.24.124.12:66
portainer192.168.31.88:10004192.168.31.88:10004
nginxProxyManager192.168.31.88:81192.168.31.88:81
alist192.168.31.88:5244192.168.31.88:5244
qinglong192.168.31.88:5700192.168.31.88:5700
首页(nginxPM自带)192.168.31.88192.168.31.88
AdGuard Home 面板192.168.31.2:8081172.24.124.12:8081
AdGuard Home DNS192.168.31.2:5353172.24.124.12:5353
DSM192.168.31.156:5000192.168.31.156:5000
heimdall(homepage)192.168.31.88:88192.168.31.88:88

安装NAS

  1. 首先要对虚拟机进行硬盘直通;具体步骤可以参考这里
  2. 配置安装群晖;具体步骤可以参考这里这里中的NAS安装。
  3. NAS的异地组网方案有两种,一种是在NAS上安装ZeroTier,加入同一网络中,具体步骤可以参考这里;另一种是设置NAS的网关为OpenWrt,我使用的就是这种方式。

内网穿透

这里除了会讲一下内网穿透,也会提及一下有公网IP的情况下外网访问的方案;整体设计可以参考这里


  1. 有内网IP
  • 使用拨号上网的主路由(硬路由/软路由)进行端口转发,包含Openwrt的路由进行DDNS设置;可以设置其中的DDNS插件并在阿里云设置域名解析。使用域名+端口转发的外部端口访问内部应用。具体步骤可以参考这里

  1. 没有内网IP

主要有三种方式:FRP、ZeroTier、Nps方案


自建服务器+内网穿透:

  • 在自己买的低配的带公网IP的服务器上安装FRP服务,设置内网穿透到本地网络,我们访问服务器的IP+端口就相当于访问本地的IP+端口了;接着将穿透的服务设置反向代理,这样就可以通过二级域名直接访问内部的服务了。这种方案比较麻烦,需要有服务器,而且非P2P的穿透,性能取决于服务器的性能和带宽;但是不会暴露访问的端口。

  • 异地组网(ZeroTier)——在服务器上安装ZeroTier,并设置为Moon节点,同时,需要接入组网的设备安装对应的客户端或者服务,在ZeroTier网页端将需要加入组网的设备加入同一网络中,并将服务器设置为Moon节点,这样在网络不佳的情况下,就可以通过Moon进行数据的转发,同时该方案采用P2P穿透,不受服务器带宽的影响。

Tips:
对于自用服务,可以直接使用ZeroTier进行异地组网,通过内网IP+端口的方式访问内网服务;对于提供服务,建议使用FRP,内网穿透搭建在公网服务器,映射到家宽的端口,流量出口在家宽IP,通过公网+端口/域名的方式访问内网服务,可以配合使用SPY等监控工具/CK自助等。服务器主要作为跳板机,提供公网IP、内网穿透和反向代理等能力。

可以考虑一个带公网IP的低配云服务器即可!

两种方案的具体步骤可以参考这里这里


ZeroTier+OpenWrt直接异地组网:

首先我们需要在OpenWrt上开启ZeroTier插件,并设置好组网的ID,同时在ZeroTier网页端设置组网下一跳的路由表,可以是家中、公司的网段,同时保证局域网内需要互访的设备的网关和DNS为OpenWrt。


这里,也记录一下我设置异地组网中遇到的一些问题:

Zerotier运行问题:

  • 在OpenWrt上的插件启动ZeroTier后,终端输入zerotier-cli listnetworks后回出现PORT_ERROR错误,原因是Zerotier正常工作需要tun设备,但LXC容器默认没有提供。解决方案见这里
  • zerotier-cli info显示offline,zerotier-cli listnetworks
    显示 REQUESTING_CONFIGURATION PRIVATE zt0 - 而不是IP;
  1. opkg update对zerotier进行更新,若出现错误则需要在OpenWrt中系统—>软件包修改一下软件源,删除无效的软件源。
  2. 重启容器
  • 运行命令zerotier-cli会报错:symbol not found:

原因是库文件的版本不对;
修正的方法如下:WEB登陆LEDE–>系统–>软件包–>更新列表–>搜索libgcc1和libstdcpp6并点击更新
你也可以在这个界面下直接搜索zerotier并安装–>SSH进入系统–>vi /etc/config/zerotier修改配置如下:
option enabled 0 (这里把0替换成1,让选项生效)
list join ‘你的ID’ (替换为Zerotier官网上生成的网络ID)
–>按ESC并输入:wq保存退出–>reboot重启系统–>进入zerotier官网允许连接
回到终端,输入zerotier-cli listnetworks则会出现加入的网络。

ZeroTier相关的命令可以见这里


Zerotier 设置内网设备互访:
在 Zerotier 设置页面中,允许要接入网络的路由器,同时记好分配的 Zerotier 内网 IP 地址。其次在路由表设置中添加记录,Destination 填入某一路由器的网段,不同的网段可以是你家中或者公司的网段,Via 中填入该路由器的 Zerotier 内网 IP 地址。依次添加所有路由器的路由,具体的设置步骤可以见这里

mark

  • 内网的服务想要在大局域网内互通需要将网关和DNS设置为OpenWrt的IP地址;本例下将Docker容器的DNS和网关设置为OpenWrt地址
  • 从公网访问内网服务只要在设备端输入电脑/服务器的内网IP+端口号即可。

至此,我们就搭建好了软路由+内网服务整个体系了,我们需要连接局域网内的设备开启ZeroTier,可以访问内网的导航页(heimdall)来选择需要的内网服务或者直接通过内网IP+端口访问内网服务;局域网内的设备设置OpenWrt为网关和DNS,可以获得广告过滤、出国、BT下载等功能。

大爷,赏点?