代理技术
文章目录
1. 代理技术
1.1 TCP/IP协议栈简介
介绍代理技术前先温故一下TCP/IP协议栈模型,现行大部分的计算机程序进行网络活动需要遵循TCP/IP四层参考模型封装和解封数据。应用在应用层中将数据封装
以Chrome浏览器为例,浏览器产生的数据会依次经过应用层、传输层、网路层和接口层的封装,层层打包。应用层数据里会以HTTP
协议打包,添加域名、请求头等信息。传输层数据会以TCP
协议打包,添加端口等信息。网路层数据会以IP
协议封装,添加源和目标IP地址等信息。网路接口层数据会以802.3
(以太网)标准封装,发送至你的路由器或者是运营商的光猫。
在四层模型中传输层和网路层由操作系统实现,提供Socket库供应用程序进行调用。
1.2 DNS解析
报文发送至目标主机需要通过IP协议寻址,数字形式的IP地址并不容易进行记忆,由此产生了更易于记忆的域名方式来映射具体的IP地址。应用程序一般使用域名访问服务,这就需要将域名转换为IP地址的服务,即DNS服务。系统提供的DNS服务会先查询hosts文件的域名IP映射关系,然后查询已配置的DNS服务器。
1.3 代理技术以及以及常见开源实现
代理技术分正向代理和反向代理,他们的特征在于正向代理面向客户端,集中代理客户端流量,而反向代理则是面向服务器,转发客户端流量到服务器。正向代理技术可以实现科学上网、广告拦截、流量转发等功能,反向代理技术则可以实现负载均衡、证书加密等功能。正向代理常用的客户端有v2ray、clash等软件,反向代理常用的软件有nginx、httpd。
2. Clash配置极其部署
2.1 部署
Clash使用Go语言编写,直接下载二进制可执行文件并添加执行权限即可运行。clash发行版版有开源版本和闭源版本,推荐使用闭源版本支持虚拟网卡代理功能。下载地址:Clash.
1# 以root权限运行
2cp -a /path/to/your/clash/binary /usr/bin
3if [ ! -d /etc/clash ]; then
4 mkdir -p /etc/clash
5fi
6
7# 编写systemd服务配置
8cat >> /etc/systemd/system/clash.service << EOF
9[Unit]
10Description=Clash daemon, A rule-based proxy in Go.
11After=network.target
12
13[Service]
14Type=simple
15Restart=always
16ExecStart=/usr/bin/clash -d /etc/clash
17
18[Install]
19WantedBy=multi-user.target
20EOF
21
22# 开机启动
23systemctl enable clash
24
25# 开启frps服务
26systemctl start clash
2.2 代理控制脚本
附上自己编写的clash代理控制文本,支持代理更新、代理重启、代理关闭、代理启动操作。配合crond可实现代理自动更新。该代码是遵循MIT协议分发。
1#!/bin/bash
2SUB_PARAMS="订阅服务器参数"
3SUB_SERVER="订阅服务器URL
4SUB_URL="$SUB_SERVER/$SUB_PARAMS"
5
6
7CONFIG_DIR=/etc/clash
8CONFIG_NAME=config.yaml
9
10
11BASE_CONFIG="
12port: 7890
13socks-port: 7891
14allow-lan: true
15mode: Rule
16log-level: info
17external-controller: :9090
18secret: api访问密码
19external-ui: ui
20dns:
21 enable: true
22 ipv6: false
23 default-nameserver: [223.5.5.5, 119.29.29.29]
24 enhanced-mode: fake-ip
25 fake-ip-range: 192.18.0.1/16
26 fake-ip-filter:
27 - '*.manjaro.org'
28 use-hosts: true
29 nameserver: ['https://doh.pub/dns-query', 'https://dns.alidns.com/dns-query']
30tun:
31 enable: true
32 stack: gvisor # system or gvisor
33 dns-hijack:
34 - any:53
35 auto-route: true
36 auto-detect-interface: true
37"
38
39
40PROXY_CONFIG="
41proxies:
42
43"
44
45PROXY_GROUPS_CONFIG="
46proxy-groups:
47
48"
49
50RULES_CONFIG="
51rules:
52 - IP-CIDR,198.41.128.0/17,DIRECT
53 - DOMAIN-SUFFIX,bangumi.moe,🚀 节点选择
54 - PROCESS-NAME,x86_64-qbittorrent-nox,DIRECT
55"
56
57task_start_info(){
58 echo -e "\033[34m************************************************************************\033[0m"
59 echo -e "\033[34m**\033[34m $1 started. $(date "+%Y-%m-%d %H:%M:%S")\033[0m"
60 echo -e "\033[34m************************************************************************\033[0m"
61}
62
63task_finished_info(){
64 echo -e "\033[34m************************************************************************\033[0m"
65 echo -e "\033[34m**\033[34m $1 finished. $(date "+%Y-%m-%d %H:%M:%S")\033[0m"
66 echo -e "\033[34m************************************************************************\033[0m"
67 echo ""
68}
69
70
71
72prase_config(){
73 task_start_info prase_config
74 echo ">> getting configuration......"
75 SUB_CONTENT=$(curl -s $SUB_URL)
76 echo ">> prasing configuration......"
77 PROXYS=$( echo "$SUB_CONTENT" |sed -n '/^proxies:.*/,/^proxy-groups:.*/ p' | grep -v "^proxies:.*\|^proxy-groups:.*")
78 PROXY_GROUPS=$(echo "$SUB_CONTENT" | sed -n '/^proxy-groups:.*/,/^rules:.*/ p' | grep -v "^proxy-groups:.*\|^rules:.*")
79 RULES=$(echo "$SUB_CONTENT" |sed -n '/^rules:.*/,$ p' | grep -v "^rules:.*")
80 echo ">> applying custom configuration......"
81 PROXY_CONFIG=$(echo -e "$PROXY_CONFIG""$PROXYS")
82 PROXY_GROUPS_CONFIG=$(echo -e "$PROXY_GROUPS_CONFIG""$PROXY_GROUPS")
83 RULES_CONFIG=$(echo -e "$RULES_CONFIG""$RULES")
84 echo ">> checking proxy server count......"
85 PROXY_SERVER_COUNT=$(echo -e "$PROXYS" | wc -l)
86 echo ">> proxy server count is $PROXY_SERVER_COUNT"
87 if [ $PROXY_SERVER_COUNT -lt 10 ]; then
88 echo ">> proxy server count is invail!"
89 return 1;
90 fi
91 task_finished_info prase_config
92}
93
94
95update_config(){
96 task_start_info update_config
97 echo ">> checking config exists......"
98 if [ -f $CONFIG_DIR/$CONFIG_NAME ]; then
99 echo ">> config exists truncate it......"
100 truncate -s 0 $CONFIG_DIR/$CONFIG_NAME
101 else
102 echo ">> config not exists create it......"
103 touch $CONFIG_DIR/$CONFIG_NAME
104 fi
105 echo ">> filling config content......"
106 echo -e "$BASE_CONFIG""$PROXY_CONFIG""$PROXY_GROUPS_CONFIG""$RULES_CONFIG" >> $CONFIG_DIR/$CONFIG_NAME
107 task_finished_info update_config
108}
109
110start_clash(){
111 task_start_info start_clash
112 echo ">> starting clash......"
113 systemctl start clash
114 task_finished_info start_clash
115}
116
117stop_clash(){
118 task_start_info stop_clash
119 echo ">> stoping clash......"
120 systemctl stop clash
121 task_finished_info stop_clash
122}
123
124restart_clash(){
125 task_start_info restart_clash
126 echo ">> restarting clash......"
127 systemctl restart clash
128 task_finished_info restart_clash
129}
130
131network_test(){
132 task_start_info network_test
133 echo ">> network testing......"
134 ping -c 4 www.google.com
135 task_finished_info network_test
136}
137
138reload_config(){
139 task_start_info reload_config
140 curl \
141 -X PUT \
142 -H "Content-Type:application/json" \
143 -H "Authorization: Bearer api访问密码"\
144 -d '{"path": "/etc/clash/config.yaml"}' \
145 http://127.0.0.1:9090/configs
146 task_finished_info reload_config
147}
148
149# ============================================================================
150usage() {
151 local -r exit_code="${1:-0}"
152 (($# > 0)) && shift
153 # shellcheck disable=SC2015
154 [ "$exit_code" != 0 ] && local -r out=/dev/stderr || local -r out=/dev/stdout
155
156 (($# > 0)) && redEcho "$*$nl" >$out
157
158 cat >$out <<EOF
159Usage: $0 [OPTION]... [INPUT [OUTPUT]]
160
161Example:
162
163Options:
164
165EOF
166
167 exit "$exit_code"
168}
169
170update(){
171 # prase config
172 prase_config
173 if [ $? -ne 0 ] ;then
174 echo prase_config has occurn an error!
175 exit 1
176 fi
177 # update config
178 update_config
179
180 # reload config
181 reload_config
182}
183
184# ============================================================================
185if [ $(id -u) != 0 ]; then
186 echo "Need running as root, try again later......"
187 usage
188 exit 1
189fi
190case $1 in
191start)
192 start_clash
193 ;;
194stop)
195 stop_clash
196 ;;
197restart)
198 restart_clash
199 ;;
200test)
201 network_test
202 ;;
203update)
204 update
205 ;;
206*)
207 usage
208 ;;
209esac
3. nginx配置极其部署
待填坑......