教程使用的mosdns版本为V4

本文主要介绍的是Alpine下使用V2RayA以及MosDNS做旁路网关的方法
如果是PVE虚拟机创建Alpine建议CPU使用host

准备工作

关于Alpine的安装可以参考这篇文章

  • 下载Alpine的ISO文件并在虚拟机中安装好
  • V2RayA和MosDNS的二进制文件
  • geosite/geoip相关文件

虽然可以在Alpine内使用wget下载,但是如果没有代理的话下载会很慢,所以建议先下载好这些文件到本地。

V2RayA一定要下载对应架构的,不然无法使用!

V2RayA的下载下来的默认是二进制文件,下载后重命名为 v2raya,然后放入 /usr/local/bin/目录下。
V2RayA 下载地址

MosDNS下载下来的是压缩包,需要解压才能得到 mosdns 的二进制文件,同样放入 /usr/local/bin/目录下。
MosDNS 下载地址

因为这关系到后面mosdns里的配置,所以需要重命名,当然如果你也可以根据自己的理解进行修改。

Loyalsoldier的geosite和geoip文件,下载后请重命名为 Loyalsoldier-geosite.datLoyalsoldier-geoip-only-cn-private.dat
geosite 下载地址
geoip-only-cn-private 下载地址

安装与配置

先给v2raya和mosdns都添加执行权限,命令如下:

chmod +x /usr/local/bin/*

安装V2RayA

安装V2RayA所需软件。

apk add v2ray iptables ip6tables

创建V2RayA系统服务进程。

cat >> /etc/init.d/v2raya << EOF
#!/sbin/openrc-run

name="v2rayA"
description="A Linux web GUI client of Project V which supports V2Ray, Xray, SS, SSR, Trojan and Pingtunnel"

command="/usr/local/bin/v2raya"
command_args="--log-file /var/log/v2raya/access.log"
error_log="/var/log/v2raya/error.log"
pidfile="/run/${RC_SVCNAME}.pid"
command_background="yes"
start_stop_daemon_args=" -e "V2RAYA_CONFIG=\"/usr/local/etc/v2raya"\""
rc_ulimit="-n 30000"
rc_cgroup_cleanup="yes"

depend() {
    need net
    after net
}

start_pre() {
   if [ ! -d "/tmp/v2raya/" ]; then 
     mkdir "/tmp/v2raya" 
   fi
   if [ ! -d "/var/log/v2raya/" ]; then
   ln -s "/tmp/v2raya/" "/var/log/"
   fi
}

EOF

给V2RayA的系统服务进程添加权限。

chmod +x /etc/init.d/v2raya

启动V2RayA并添加到开机自启。

rc-service v2raya start
rc-update add v2raya

安装与配置mosdns

先创建mosdns的文件夹 mkdir /etc/mosdns
再在本地创建一个config.yaml,将下面的内容复制粘贴进去,然后上传到 /etc/mosdns/目录下即可。

log:
  level: error
  file: "/etc/mosdns/mosdns.log"

data_providers:
  - tag: geosite
    file: ./Loyalsoldier-geosite.dat
    auto_reload: true
  - tag: geoip
    file: ./Loyalsoldier-geoip-only-cn-private.dat
    auto_reload: true

plugins:
  # 缓存
  - tag: cache
    type: cache
    args:
      size: 4096
      lazy_cache_ttl: 172800

  # 转发至本地服务器的插件
  - tag: forward_local
    type: fast_forward
    args:
      upstream:
        - addr: tls://120.53.53.53:853
          enable_pipeline: true

        - addr: tls://223.6.6.6:853
          idle_timeout: 8
          trusted: true

  # 转发至远程服务器的插件
  - tag: forward_remote
    type: fast_forward
    args:
      upstream:
        - addr: tls://208.67.220.220:853
          enable_pipeline: true

        - addr: tls://1.0.0.1:853
          enable_pipeline: true
          trusted: true


  # 匹配本地域名的插件
  - tag: query_is_local_domain
    type: query_matcher
    args:
      domain:
        - 'provider:geosite:apple-cn'
        - 'provider:geosite:google-cn'
        - 'provider:geosite:[email protected]'
        - 'provider:geosite:alibaba'
        - 'provider:geosite:jd'
        - 'provider:geosite:cn'
        - 'provider:geosite:private'

  # 匹配非本地域名的插件
  - tag: query_is_non_local_domain
    type: query_matcher
    args:
      domain:
        - 'provider:geosite:geolocation-!cn'

  # 匹配广告域名的插件
  - tag: query_is_ad_domain
    type: query_matcher
    args:
      domain:
        - 'provider:geosite:category-ads-all'

  # 匹配本地 IP 的插件
  - tag: response_has_local_ip
    type: response_matcher
    args:
      ip:
        - 'provider:geoip:cn'
        - 'provider:geoip:private'

  # 主要的运行逻辑插件
  # sequence 插件中调用的插件 tag 必须在 sequence 前定义,
  # 否则 sequence 找不到对应插件。
  - tag: main_sequence
    type: sequence
    args:
      exec:
        # 删除ECS
        - _no_ecs
        # 缓存
        - cache

        # 屏蔽广告域名
        - if: query_is_ad_domain
          exec:
            - _new_nxdomain_response
            - _return

        # 已知的本地域名用本地服务器解析
        - if: query_is_local_domain
          exec:
            - forward_local
            - _return

        # 已知的非本地域名用远程服务器解析
        - if: query_is_non_local_domain
          exec:
            - forward_remote
            - _return

          # 剩下的未知域名用 IP 分流。
          # 这里借助了 `fallback` 工作机制。分流原理请参考 `fallback`
          # 的工作流程。
          # primary 从本地服务器获取应答,丢弃非本地 IP 的结果。
        - primary:
            - forward_local
            - if: "(! response_has_local_ip) && [_response_valid_answer]"
              exec:
                - _drop_response
          # secondary 从远程服务器获取应答。
          secondary:
            - _prefer_ipv4
            - forward_remote
          # 这里建议设置成 local 服务器正常延时的 2~5 倍。
          # 这个延时保证了 local 延时偶尔变高时,其结果不会被 remote 抢答。
          # 如果 local 超过这个延时还没响应,可以假设 local 出现了问题。
          # 这时用就采用 remote 的应答。单位: 毫秒。
          fast_fallback: 200

servers:
  - exec: main_sequence
    listeners:
      - protocol: udp
        addr: 0.0.0.0:53
      - protocol: tcp
        addr: 0.0.0.0:53

然后再把下载好的 Loyalsoldier-geosite.datLoyalsoldier-geoip-only-cn-private.dat 文件上传到 /usr/share/v2ray/目录下。

先给mosdns添加开机自启。

mosdns service install -c /etc/mosdns/config.yaml -d /usr/share/v2ray/

再启动mosdns服务。

rc-service mosdns restart

输入rc-status看一下mosdns服务是否启动。
系统服务.png
输入下方命令查看Local Address一列中是否有domain(即本机53端口是否在监听)。

netstat -ltue

53端口监听.png

配置V2RayA

打开浏览器输入 (alpine的IP地址:2017) 即可打开V2RayA的网页管理界面。
一开始我们需要创建一个账户,然后导入节点或订阅。
v2raya.0.配置.png
v2raya.1.导入节点、订阅.png
然后点击右上角的设置,具体设置如下图。
v2raya.2.设置.png
其中RoutingA的配置如下,直接复制粘贴即可。

# 广告域名屏蔽
domain(ext:"Loyalsoldier-geosite.dat:category-ads")->direct

# BT 下载直连
# 这个需要在BT下载工具里设置走这个socks代理
inbound: socks_direct = socks(address: 0.0.0.0, port: 30100)
inboundTag(socks_direct) -> direct

# 国内直连
domain(ext:"Loyalsoldier-geosite.dat:[email protected]")->direct
domain(ext:"Loyalsoldier-geosite.dat:alibaba")->direct
domain(ext:"Loyalsoldier-geosite.dat:jd")->direct
domain(ext:"Loyalsoldier-geosite.dat:cn")->direct
domain(ext:"Loyalsoldier-geosite.dat:private")->direct

ip(ext:"Loyalsoldier-geoip-only-cn-private.dat:private")->direct
ip(ext:"Loyalsoldier-geoip-only-cn-private.dat:cn")->direct

# DNS
ip(120.53.53.53, 223.6.6.6)->direct
ip(208.67.220.220, 1.0.0.1)->proxy

# 国外代理
domain(ext:"Loyalsoldier-geosite.dat:geolocation-!cn")->proxy
default: proxy

RoutingA.png

建议打开自动更新订阅,间隔时间为24小时。
v2raya.4.自动更新订阅.png

需要注意的是V2RayA启用代理,是要在节点右边点击选择,然后点击左上角启动。
而不是左边的小方框,这个小方框选中节点是测延迟用的。
v2raya.5.启动代理.png

如果节点是直连,需要把节点IP和域名SNI在mosdns中加入直连

设置DNS

最后在命令行输入 setup-dns 命令把DNS设置为本机
alpine设置dns.png

修改内核参数

复制下方内容粘贴到命令行

cat > /etc/sysctl.conf << EOF

net.ipv4.ip_forward = 1
fs.file-max = 1000000

EOF

sysctl -p

自动更新geosite/geoip脚本

一个简单的自动更新geosite/geoip脚本。

下面的命令是curl通过代理去更新geosite/geoip文件。
可能会出现下载下来的文件损坏的情况,这会导致mosdns和v2rayA无法加载使用,而断网。
有大佬在评论区给了一个脚本,有能力的朋友可以参考修改一下自用。

输入下方命令直接创建。

cat > /root/auto_update_geoxx.sh << EOF
#!/bin/ash

# 设置代理
export all_proxy="socks5://127.0.0.1:20170"

# 下载文件
curl -O https://cdn.jsdelivr.net/gh/Loyalsoldier/[email protected]/geosite.dat
curl -O https://cdn.jsdelivr.net/gh/Loyalsoldier/[email protected]/geoip-only-cn-private.dat

# 核对 SHA256
geosite_checksum=$(curl -s https://cdn.jsdelivr.net/gh/Loyalsoldier/[email protected]/geosite.dat.sha256sum | awk '{ print $1 }')
geoip_checksum=$(curl -s https://cdn.jsdelivr.net/gh/Loyalsoldier/[email protected]/geoip-only-cn-private.dat.sha256sum | awk '{ print $1 }')

if [[ "$(sha256sum geosite.dat | awk '{ print $1 }')" = "${geosite_checksum}" ]] && [[ "$(sha256sum geoip-only-cn-private.dat | awk '{ print $1 }')" = "${geoip_checksum}" ]]; then
  # 文件 SHA256 核对通过,移动并重命名
  mv geosite.dat /usr/share/v2ray/Loyalsoldier-geosite.dat
  mv geoip-only-cn-private.dat /usr/share/v2ray/Loyalsoldier-geoip-only-cn-private.dat
  
  # 重启系统
  reboot
else
  # 文件 SHA256 核对失败,删除文件并重新下载
  rm -f geosite.dat geoip-only-cn-private.dat
  exec "$0" "[email protected]"
fi

EOF

给脚本执行权限

chmod +x /root/auto_update_geoxx.sh

给脚本添加定时任务(每天3点33分执行)
先在命令行中输入 crontab -e, 之后添加下面这行即可。

33 3 * * * /root/auto_update_geoxx.sh > /dev/null 2>&1

终端设置

最后直接在终端设置网关和DNS为alpine的IP地址就可以顺利的科学上网了。
当然如果家中设备比较多的话,可以在主路由的DHCP里给终端下发的网关和DNS设置为alpine的IP地址。

参考

v2rayA wiki
mosdns wiki
Alpine Linux Wiki

最后修改:2023 年 03 月 03 日
如果觉得我的文章对你有用,请随意赞赏