代理技术

文章目录

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配置极其部署

待填坑......