本文主要介绍的是Alpine下使用V2RayA以及MosDNS做旁路网关的方法
准备工作
- 下载Alpine的ISO文件并在虚拟机中安装好
- V2RayA和MosDNS的二进制文件
- geosite/geoip相关文件
虽然可以在Alpine内使用wget下载,但是如果没有代理的话下载会很慢,所以建议先下载好这些文件到本地。
V2RayA的下载下来的默认是二进制文件,下载后重命名为
v2raya
,然后放入 /usr/local/bin/
目录下。V2RayA 下载地址
MosDNS下载下来的是压缩包,需要解压才能得到 mosdns
的二进制文件,同样放入 /usr/local/bin/
目录下。
MosDNS 下载地址
Loyalsoldier的geosite和geoip文件,下载后请重命名为
Loyalsoldier-geosite.dat
和 Loyalsoldier-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.dat
和 Loyalsoldier-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
服务是否启动。
输入下方命令查看Local Address
一列中是否有domain
(即本机53端口是否在监听)。
netstat -ltue
配置V2RayA
打开浏览器输入 (alpine的IP地址:2017) 即可打开V2RayA的网页管理界面。
一开始我们需要创建一个账户,然后导入节点或订阅。
然后点击右上角的设置,具体设置如下图。
其中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
建议打开自动更新订阅,间隔时间为24小时。
需要注意的是V2RayA启用代理,是要在节点右边点击选择,然后点击左上角启动。
而不是左边的小方框,这个小方框选中节点是测延迟用的。
设置DNS
最后在命令行输入 setup-dns
命令把DNS设置为本机
修改内核参数
复制下方内容粘贴到命令行
cat > /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
fs.file-max = 1000000
EOF
sysctl -p
自动更新geosite/geoip脚本
一个简单的自动更新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地址。
17 条评论
v2raya会自动下载 geo文件,不用写脚本重复下载(docker安装的话在 /usr/local/share/v2ray/下面)
v2raya自动下载的geo文件和我需要用的文件不同。
一步一步按照教程操作,完美~~成功联网
有可能是我把mosdns的广告插件那几行代码删掉的原因?
发现一个问题,v2rayA过段时间会停止,然后网络就会断掉无论是国内还是国外
可以去日志里查看一下
重新配置一次就没有bug了!
求助安装上了外网可以上但是无法访问国内,百度访问不了
建议查看一下DNS配置
debian11的系统 mos监听的是[::]:53
不知道你那边的具体环境是否还有别的什么东西,所以不好判断
关于geo文件更新这部分我做了补全。
!/bin/bash加入了sha256 对比, 这样就不用担心下载了部分文件导致崩溃了。 安装位置和文件名 博主可以对应自己的改下
HOST_RESLOVE=""
PROXY="http://127.0.0.1:8889"PROXY="http://127.0.0.1:20171"
DOWNLOAD_FROM="https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download"
declare -a SAVE_DIR=("/root/.local/share/xray" "/usr/local/share/xray" )
GEOIP="geoip.dat"
GEOIP_RENAME="Loyalsoldier-geosite.dat"
GEOSITE="geosite.dat"
GEOSITE_RENAME="LoyalsoldierIP.dat"
function downloadAndCheckSum()
DOWNLOAD_LINK=$1 DOWNLOAD_FILE=$2 DOWNLOAD_RENAME=$3 shift 3 # Shift all arguments to the left (original $1-3 gets lost) RESOURCE_SAVE_DIR=("[email protected]") # Rebuild the array with rest of arguments echo "Start Download ${DOWNLOAD_LINK}${DOWNLOAD_FILE}" if ! curl -x "${PROXY}" --resolve "${HOST_RESLOVE}" -sSRLJ -H 'Cache-Control: no-cache' "${DOWNLOAD_LINK}/${DOWNLOAD_FILE}" --output "/tmp/${DOWNLOAD_FILE}" ; then echo 'error: Download geoip failed! Please check your network or try again.' else if ! curl -x "${PROXY}" --resolve "${HOST_RESLOVE}" -sSRLJ -H 'Cache-Control: no-cache' "${DOWNLOAD_LINK}/${DOWNLOAD_FILE}.sha256sum" --output "/tmp/${DOWNLOAD_FILE}.sha256sum" ; then echo 'error: Download geoip.sha256 failed! Please check your network or try again.' else SUM="$(openssl sha256 /tmp/$DOWNLOAD_FILE | awk '{print $2}')" CHECKSUM="$(cat /tmp/$DOWNLOAD_FILE.sha256sum | awk '{print $1}')" #echo "$SUM == $CHECKSUM" if [[ "$SUM" != "$CHECKSUM" ]]; then echo 'error: Check failed! Please check your network or try again.' else for dir in "${RESOURCE_SAVE_DIR[@]}" do echo "${DOWNLOAD_FILE} saved to ${dir}/${DOWNLOAD_RENAME}" cp "/tmp/${DOWNLOAD_FILE}" "${dir}/${DOWNLOAD_RENAME}" done rm "/tmp/${DOWNLOAD_FILE}.sha256sum" "/tmp/${DOWNLOAD_FILE}" fi fi fi{
}
downloadAndCheckSum "$DOWNLOAD_FROM" "$GEOIP" "$GEOIP_RENAME" "${SAVE_DIR[@]}"
downloadAndCheckSum "$DOWNLOAD_FROM" "$GEOSITE" "$GEOSITE_RENAME" "${SAVE_DIR[@]}"
downloadAndCheckSum "https://raw.githubusercontent.com/Loyalsoldier/geoip/release" "geoip-only-cn-private.dat" "Loyalsoldier-geoip-only-cn-private.dat" "${SAVE_DIR[@]}"
好家伙,我TM直呼内行
感谢大大的教程,写得非常好与详细!请问大大上面这个sha256有必要添加吗?如何添加呢?(ฅ´ω`ฅ)
SHA256一般不用填,这个是校验文件完整性的
你好,想咨询一下,我用debian安装的mosdns装好后不起作用,我用systemctl status命令查看状态是active (running)查看53端口也是mosdns占用,就是不起作用,不知道还能怎么查看哪里出问题
建议检查一下DNS有没有指向mosdns