Featured image of post 基于 V2rayA 配置透明代理软路由[Linux/Ubuntu]

基于 V2rayA 配置透明代理软路由[Linux/Ubuntu]

在双网口主机上配置软路由;使用 v2rayA 实现透明代理

基本信息

环境:Ubuntu22.04,已安装docker,所有操作在root权限下运行;

网络拓扑:上级网络(光猫)->主机@enp1s0做wan口->主机@enp2s0做lan口->有线中继WiFi等局域网设备。

软路由基本配置

配置网卡启用桥接网络

1
apt install bridge-utils

使用netplan工具配置网卡,将 enp1s0作为wan口连接上级网络,enp2s0作为lan口连接局域网设备,在 enp2s0上建立桥接网络以将局域网与上级网络连接:

1
vim /etc/netplan/00-installer-config.yaml

依据网络环境修改并添加以下内容:

 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
27
28
network:
  ethernets:
    enp1s0:
      dhcp4: no  # 配置静态ip上网,也可设置为true以使用上级网络dhcp配置网络,使用dhcp时下列配置均不需要
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
          metric: 100
          on-link: true
      nameservers:
        addresses:
          - 192.168.99.2  # 后续在桥接网络上配置dns服务,也可先设置为公共dns
    enp2s0:
      dhcp4: no
  bridges:  # 建立桥接网络将局域网设备接入上层网络,其中99可更改为任意网段
    br0:
      dhcp4: no
      addresses:
        - 192.168.99.2/24
      nameservers:
        addresses:
          - 192.168.99.2
      interfaces:
        - enp2s0
  version: 2
  renderer: NetworkManager

应用配置并查看信息:

1
2
3
netplan apply

brctl show

桥接网络配置应包含类似以下信息:

1
2
bridge name	   bridge id		    STP enabled	   interfaces
br0		       8000.6aa01d4c1f71	no		       enp2s0

配置DNS服务器

本文使用adguardhome提供dns服务,dnsmasq、smartdns、mosdns等均可。

调整 systemd-resolved 服务

首先调整Ubuntu自带DNS Resolve服务器:

1
2
3
4
# vim /etc/systemd/resolved.conf

DNS=192.168.99.2  # 修改为br0接口地址
DNSStubListener=no  # 关闭dns服务以取消端口占用

随后重启 systemd-resolved服务以取消dns端口占用:

1
2
3
systemctl restart systemd-resolved
systemctl stop systemd-resolved  # 可选,防止systemd-resolved影响后续配置
systemctl disable systemd-resolved --now  # 可选,防止systemd-resolved影响后续配置

检查 /etc/resolv.conf内的 nameserver是否为 192.168.99.2,使用 lsof指令检查53端口占用情况:

1
2
apt install lsof
lsof -i :53

lsof输出应没有任何内容,若存在 systemd-resolved服务则需要重试。

安装配置 AdguardHome

使用docker以host网络模式运行 AdguardHome,其中 /mydir/adguardhome/目录位置可自行调整:

1
2
3
4
5
6
7
docker run -itd \
    --name adguardhome \
    --network host \
    -v /mydir/adguardhome/work:/opt/adguardhome/work \
    -v /mydir/adguardhome/conf:/opt/adguardhome/conf \
    --restart=always \
adguard/adguardhome

访问ip+端口号(3000),进入网页配置,修改网页管理端口(80可提供其他服务),配置监听 br0:192.168.99.2地址,配置DNS上游服务器,选择合适的广告屏蔽器。

配置完成后,使用 lsof检查,应有快速输出(若输出缓慢可能存在dns配置问题),类似以下信息:

1
2
3
4
5
lsof -i :53

COMMAND      PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
AdGuardHo  92446  root   10u  IPv4 1906252      0t0  UDP 192.168.99.2:domain
AdGuardHo  92446  root   11u  IPv4 1906253      0t0  TCP 192.168.99.2:domain (LISTEN)

配置DHCP服务器

本文使用 isc-dhcp-server作为dhcp服务器,使用dnsmasq或其他服务均可。

1
apt install isc-dhcp-server

修改DHCP接口:

1
2
3
4
# vim /etc/default/isc-dhcp-server # 修改接口为br0

INTERFACESv4="br0"
INTERFACESv6="br0"

配置子网:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# vim /etc/dhcp/dhcpd.conf

default-lease-time 21600; # 延长租约时间到6小时
max-lease-time 86400;
ddns-update-style none;
authoritative;  # 启用权威dhcp服务器

# 配置DHCP子网
subnet 192.168.99.0 netmask 255.255.255.0 {
  range 192.168.99.10 192.168.99.240;
  option domain-name-servers 192.168.99.2;
  option subnet-mask 255.255.255.0;
  option routers 192.168.99.2;
}

重启DHCP服务:

1
2
systemctl restart isc-dhcp-server
systemctl status isc-dhcp-server  # 查看是否正确运行

enp2s0上连接设备以测试DHCP与DNS服务是否正常,检查是否可正确获取ip地址、网关地址、dns服务器。

转发与路由配置

配置主机转发能力:

1
2
3
4
# vim /etc/sysctl.conf

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

应用配置:

1
sysctl -p /etc/sysctl.conf

使用 iptables启用路由能力,以下指令非持久化,每次重启主机需重新执行:

1
2
3
iptables -A FORWARD -s 192.168.0.0/16 -j ACCEPT  # 局域网,可依据自身环境修改为10.0.0.0/24等
iptables -A FORWARD -s 172.16.0.0/12 -j ACCEPT   # docker网络
iptables -t nat -A POSTROUTING -j MASQUERADE     # 应用nat伪装源ip地址

持久化示例(iptables-persistent):

iptables-persistent 会在重启后自动加载 iptables 规则。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 安装并设置自启动,安装过程会提示是否保存 ipv4 规则和 ipv6 规则。
apt install iptables-persistent && systemctl enable netfilter-persistent

# 添加规则
iptables -A FORWARD -s 192.168.0.0/16 -j ACCEPT  # 局域网,可依据自身环境修改为10.0.0.0/24等
iptables -A FORWARD -s 172.16.0.0/12 -j ACCEPT   # docker网络
iptables -t nat -A POSTROUTING -j MASQUERADE     # 应用nat伪装源ip地址

# 保存 ipv4 规则
iptables-save > /etc/iptables/rules.v4
# 保存 ipv6 规则
ip6tables-save > /etc/iptables/rules.v6

# 上述两条指令可通过在.bashrc文件内配置alias快速操作

保存后可以重启,使用 iptables -L 命令查看刚刚添加的规则是否还在。

若使用 ufw,应用以下规则:

1
2
3
ufw allow from 172.16.0.0/12   # docker的桥接网络地址
ufw allow from 192.168.0.0/16  # 局域网
ufw reload 

至此,软路由基本配置完成,主机可作为一个普通的路由器使用。

基于 v2rayA 配置透明代理访问ChatGPT

参考官网安装并启动 v2rayA,其中 apt安装流程如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
wget -qO - https://apt.v2raya.org/key/public-key.asc | sudo tee /etc/apt/keyrings/v2raya.asc  # 添加公钥

echo "deb [signed-by=/etc/apt/keyrings/v2raya.asc] https://apt.v2raya.org/ v2raya main" | sudo tee /etc/apt/sources.list.d/v2raya.list   # 添加软件源
sudo apt update

sudo apt install v2raya v2ray         # 也可以使用 xray 包

sudo systemctl start v2raya.service   # 启动v2rayA

sudo systemctl enable v2raya.service  # 设置开机自启动

连接到 http://192.168.99.2:2017(不能访问则检查防火墙开放端口),配置管理员账号与密码

v2rayA 配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
 透明代理/系统代理
 启用: 分流规则与规则端口所选模式一致
 开启IP转发
 开启端口分享
 
 透明代理/系统代理实现方式
 redirect
 
 规则端口的分流模式
 RoutingA
 
 防止DNS污染
 关闭
 
 特殊模式
 supervisor
 
 TCPFastOpen
 保持系统默认

一份简单的 RoutingA 配置,更多配置方法可参考官网

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#常用学术网站
domain(aliyundrive.com, mail.qq.com, ntia.gov, nist.gov, ieee.org, acm.org)->direct
domain(geosite:category-scholar-cn)->direct
domain(geosite:google-scholar, geosite:category-scholar-!cn)->proxy

#AI网站
domain(bing.com, claude.ai, bard.google.com, poe.com, bingapis.com, copilot.microsoft.com, anthropic.com, generativelanguage.googleapis.com)->proxy
domain(chat.openai.com.cdn.cloudflare.net, openaiapi-site.azureedge.net, z01.azurefd.net, blob.core.windows.net, production-openaicom-storage.azureedge.net)->proxy
domain(chatgpt-async-webps-prod-eastus-0.webpubsub.azure.com, cdn.oaistatic.com,ab.chatgpt.com,oneocsp.microsoft.com)->proxy
domain(geosite:openai)->proxy

# 按地区划分
ip(geoip:hk,geoip:mo)->proxy
domain(geosite:cn)->direct
domain(geosite:geolocation-!cn)->proxy
ip(geoip:private, geoip:cn)->direct

default: proxy

参考

软路由系列–路由器系统-Ubuntu

[v2RayA]RoutingA自定义分流

iptables 两种持久化方式 - centos 和 ubuntu 下 iptables 的持久化

使用 Hugo 构建
主题 StackJimmy 设计