Linux使用ss+v2ray+iptables实现透明代理和热点共享

代理搭建完成后,一般来说,如果想使用代理上网,客户端要安装代理程序,自己用也不算麻烦,但是如果客户端设备比较多、或者客户端没有支持代理的程序、又或者偶尔想分享代理给家里其他人使用,安装和配置代理程序就比较麻烦;解决这些问题,在家里配置一个软路由实现透明代理是比较好的答案。

准备软路由设备

什么是软路由?软路由是指利用台式机或服务器配合软件形成路由解决方案,主要靠软件的设置,达成路由器的功能;而硬路由则是以特有的硬设备,包括处理器、电源供应、嵌入式软件,提供设定的路由器功能。

现在好一些的路由器很多本身就是软路由,或者可以通过刷机刷成软路由,你可以检查一下自己家的路由设备支不支持软路由,如果支持的话就很简单了。如果不支持,找找家里的空闲设备,比如电视盒子、旧手机等等,现在宽带运营商一般都有送电视盒子,如果有用不到的盒子可以网上搜一下可不可以刷Linux,如果可以的话把它刷成Linux系统就可以用了(注意设备要支持开热点)

为什么需要v2ray? ss路由规则不太好实现,相比之下v2ray就简单很多了并且功能很强大,使用v2ray主要也是为了实现路由功能

配置软路由系统

准备好软路由并且有自己的代理服务器,ssh连接软路由

安装 shadowsocks-libevv2ray ,我的是Ubuntu20.04系统,命令如下

1
apt install shadowsocks-libev 

v2ray 使用 fhs-install-v2ray 安装

如果使用 simple-obfs,还需要执行 apt install simple-obfs 安装

配置ss

shadowsocks-libev 安装完成后默认会启动服务端,执行 systemctl disable --now shadowsocks-libev.service 禁用并停止服务

添加ss客户端配置文件 /etc/shadowsocks-libev/config-local.json,其中的配置要改为你自己的

1
2
3
4
5
6
7
8
9
10
11
{
"server" : "ss-ip",
"server_port" : port,
"method" : "chacha20-ietf-poly1305",
"password" : "password",
"plugin" : "obfs-local",
"plugin_opts" : "obfs=http;obfs-host=www.baidu.com",
"local_port" : 1080,
"local_address" : "127.0.0.1",
"timeout" : 60
}

然后执行 systemctl enable --now [email protected] 启用并运行ss客户端服务。完成后可以检测一下是否可用

a41f01094e1f0125e71366d7666003e9/20230318173554.png

配置v2ray

添加配置文件 /usr/local/etc/v2ray/config-ss.json,v2ray使用的服务就是ss的socks端口

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
{
"log": {
"loglevel": "warning"
},
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"outboundTag": "direct",
"domain": [
"geosite:cn"
]
},
{
"type": "field",
"outboundTag": "direct",
"ip": [
"geoip:private",
"geoip:cn"
]
}
]
},
"inbounds": [
{
"listen": "127.0.0.1",
"port": "1089",
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true,
"ip": "127.0.0.1"
}
},
{
"listen": "127.0.0.1",
"port": "8889",
"protocol": "http"
},
{
"port": 12340,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp",
"followRedirect": true
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
"streamSettings": {
"sockopt": {
"mark": 255
}
}
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "socks",
"settings": {
"servers": [
{
"address": "127.0.0.1",
"port": 1080
}
]
},
"streamSettings": {
"network": "tcp",
"sockopt": {
"mark": 255
}
}
},
{
"tag": "direct",
"protocol": "freedom",
"settings": {
"domainStrategy": "UseIP"
},
"streamSettings": {
"sockopt": {
"mark": 255
}
}
}
]
}

然后执行 systemctl enable --now [email protected] 启用并运行v2ray服务,完成后也检测一下

3616682ebd2a8d1bbc718f88dbc5d16b/20230318173606.png

配置iptables

添加iptables规则

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
29
30
31
#! /bin/sh

# 创建新chain
iptables -t nat -N V2RAY

# 忽略ss服务器地址
iptables -t nat -A V2RAY -d ss-ip -j RETURN
# cloudflared
iptables -t nat -A V2RAY -d 198.41.0.0/16 -j RETURN

# 忽略局域网和其他一些保留地址
iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 100.64.0.0/10 -j RETURN
iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 198.18.0.0/15 -j RETURN
iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN

# 直连 SO_MARK 为 0xff 的流量(0xff 是 16 进制数,数值上等同与上面配置的 255),此规则目的是避免代理本机(网关)流量出现回环问题
iptables -t nat -A V2RAY -p tcp -j RETURN -m mark --mark 0xff

# 其他流量转发到 12340
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 12340

#最后让从内网发的TCP流量,以及从本机发的TCP流量,均经过V2RAY链的判定处理
iptables -t nat -A PREROUTING -p tcp -j V2RAY
iptables -t nat -A OUTPUT -p tcp -j V2RAY

安装 iptables-persistent 保存配置,重启后依旧生效,如果需要重新保存,执行 dpkg-reconfigure iptables-persistent

这时候linux软路由上的透明代理就配置好了,现在linux上的流量都会经过v2ray,测试一下,curl没有指定socks代理服务器的情况下也访问成功了

d31891bb509761a0cd98eb220b8e3c47/20230318173622.png

开启wifi热点

安装 network-manager ,并确保wifi设备驱动正常

获取wifi设备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 4a:1f:02:96:f1:67 brd ff:ff:ff:ff:ff:ff
3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 46:c1:25:c8:93:ca brd ff:ff:ff:ff:ff:ff
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
5: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
link/ether 84:21:f1:97:35:5f brd ff:ff:ff:ff:ff:ff
6: p2p0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
link/ether 86:21:f1:97:35:5f brd ff:ff:ff:ff:ff:ff
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:b9:d4:2b:72 brd ff:ff:ff:ff:ff:ff

其中wlan0是我的wifi设备

创建热点

1
2
3
4
5
6
7
8
9
10
# 分别配置热点设备、名称、密码,然后创建新热点配置
IFNAME="wlan0"; CON_NAME="linux-ap"; CON_PASSWORD="password"
nmcli con add type wifi ifname $IFNAME con-name $CON_NAME autoconnect yes ssid $CON_NAME
# 将连接方法设置为共享
nmcli con modify $CON_NAME 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared
# 设置热点密码
nmcli con modify $CON_NAME wifi-sec.key-mgmt wpa-psk
nmcli con modify $CON_NAME wifi-sec.psk $CON_PASSWORD
# 启动热点
nmcli con up $CON_NAME

现在就可以用手机连接上面创建的热点测试一下了

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2021-2025 lorzzn
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信