效果
终端只需要修改网关就可以实现访问外网
前置说明
阅读本文需要有Linux,网络,和V2配置基础。
环境介绍:只要是个Linux系统就行,用PC,各种派,虚拟机都行。
硬件:树莓派4b
系统:Ubuntu Server 20.04 LTS
拓扑图
- 路由器负责PPPoE拨号,光猫是桥接模式(非必须配置)
- PC-1 就是常规的网络配置
- 树莓派网络配置和PC-1看似一样。它的ip是240
- PC-2和手机 网关指定的是240,它们可以上外网
旁路由配置
在Ubuntu Server上
1 配置常规网络
如ip为240,网关是路由器,这时它可以正常上网
2 配置转发Ubuntu Server
在sysctl启用
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
安装网络上的说法把其他网络设备网关改为240就可以上网了,可是实际测试不行还需要再加上一个nat配置
iptables -t nat -I POSTROUTING -j MASQUERADE
这时PC-2和手机就可以正常上网了
但是也发现一个问题:就是Ubuntu Server本身DNS异常,经排查 禁用本地DNS服务
systemctl disable systemd-resolved
并确保本地DNS指定正确后解决
3 测试&小结
- 测试PC-2,手机,树莓派都可正常上网。当然外网还是不行
- 其中PC-1和树莓派上网是直接走路由,而PC-2和手机是经树莓派转发后到路由
以上没有问题后再往下看
V2加持
Ubuntu Server会把指向自己的流量无脑转发给路由器。
可是如果它对流量进行分流后 再对部分流量加密 转发至不同的地址。
就可实现高级特效。
先口盾讲解
- Ubuntu Server 接收到流量由自身iptables的
PREROUTING
链mangle
表 转发至本地某端口 比如3080 - 本地v2进程listen 3080接受流量,由
inbounds
里的dokodemo-door
协议接收,并且sniffing嗅探出域名 - v2r的路由模块根据域名进行分流转发至相应的
outbounds
出口,outbounds有2个,direct直连 和 proxy代理 以下为具体配置
iptables
# 设置策略路由 匹配mark是1的流量 将这些流量转到回环接口
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
# 代理局域网设备
# 在mangle表中新建V2RAY chain。在iptables中mangle表特性为可以给流量打标签 以便分流
iptables -t mangle -N V2RAY
iptables -t mangle -A V2RAY -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A V2RAY -d 255.255.255.255/32 -j RETURN
# 直连局域网,避免 V2Ray 无法启动时无法连网关的 SSH,如果你配置的是其他网段(如 10.x.x.x 等),则修改成自己的
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -p tcp -j RETURN
# 直连局域网,53 端口除外,因为要使用V2Ray的dns
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
# 给 UDP 打标记 1,转发至 3080 端口
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 3080 --tproxy-mark 1
# 给 TCP 打标记 1,转发至 3080 端口
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 3080 --tproxy-mark 1
# 应用规则
iptables -t mangle -A PREROUTING -j V2RAY
#### 不启用代理本机
## 代理网关本机
#iptables -t mangle -N V2RAY_MASK
#iptables -t mangle -A V2RAY_MASK -d 224.0.0.0/4 -j RETURN
#iptables -t mangle -A V2RAY_MASK -d 255.255.255.255/32 -j RETURN
## 直连局域网
#iptables -t mangle -A V2RAY_MASK -d 192.168.0.0/16 -p tcp -j RETURN
## 直连局域网,53 端口除外(因为要使用 V2Ray 的 DNS)
#iptables -t mangle -A V2RAY_MASK -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
## 直连 SO_MARK 为 0xff 的流量(0xff 是 16 进制数,数值上等同与上面V2Ray 配置的 255),此规则目的是避免代理本机(网关)流量出现回环问题
#iptables -t mangle -A V2RAY_MASK -j RETURN -m mark --mark 0xff
## 给 UDP 打标记, 重路由
#iptables -t mangle -A V2RAY_MASK -p udp -j MARK --set-mark 1
## 给 TCP 打标记,重路由
#iptables -t mangle -A V2RAY_MASK -p tcp -j MARK --set-mark 1
## 应用规则
#iptables -t mangle -A OUTPUT -j V2RAY_MASK
v2
{
"inbounds": [
{
"tag": "door",
"port": 3080,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp,udp",
"followRedirect": true
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
"streamSettings": {
"sockopt": {
"tproxy": "tproxy"
}
}
},
{
"tag": "lan",
"port": 2080,
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"settings": {
"auth": "noauth"
}
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom",
"streamSettings": {
"sockopt": {
"mark": 255
}
}
},
{
"tag": "proxy",
"protocol": "vmess",
"settings": {
"vnext": [
// 自己的配置
]
},
"streamSettings": {
"sockopt": {
"mark": 255
}
},
"mux": {
"enabled": true
}
}
],
"routing": {
"domainStrategy": "AsIs",
"settings": {
"rules": [
{
"type": "field",
"inboundTag": [
"lan"
],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"ext:dlc.dat:direct",
"ipip.net"
],
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"ext:dlc.dat:proxy",
"google.com",
"speedtest.net",
"amazonaws.com"
],
"outboundTag": "proxy"
},
{
"type": "field",
"ip": [
"geoip:private",
"geoip:cn",
"223.5.5.5"
],
"outboundTag": "direct"
}
]
}
},
"dns": {
"servers": [
"8.8.8.8",
{
"address": "223.5.5.5",
"port": 53,
"domains": [
"geosite:cn",
"ntp.org"
]
}
]
}
//"log": {
// "access": "/tmp/v2ray_access.log",
// "error": "/tmp/v2ray_access.log",
// "loglevel": "debug"
//}
}
v2配置讲解
- inbounds[0] dokodemo-door 是核心入口 端口是3080
- inbound[1] socks 是方便有些有些app继续使用socks5代理
- outbounds[0] freedom 是直连出口,第一个是默认出口,也就是说默认直连
- outbounds[1] vmess(其他协议也可以) 是代理出口
- routing.domainStrategy 使用了AsIs ,仅域名匹配 简单 快。
- routing.settings.rules[0] 规定从socks5来的流量走代理
- routing.settings.rules[1] 匹配到列表内域名后走直连
- routing.settings.rules[2] 匹配到列表内域名后走代理
- routing.settings.rules[2] 的 ext:dlc.dat:proxy 写法为外置域名文件,dlc.dat文件下载地址和生成规则见 github.com/WillGhost/p…
测试
这时拓扑图中架构已完成