🧷 自用的一个功能很简å•çš„ SNIProxy 顺便分享出æ¥ç»™æœ‰åŒæ ·éœ€æ±‚的人,用得上的è¯å¯ä»¥ç‚¹ä¸ªâ支æŒä¸‹~
SNIProxy æ˜¯ä¸€ä¸ªæ ¹æ®ä¼ 入域å(SNI)æ¥è‡ªåŠ¨ç«¯å£è½¬å‘è‡³è¯¥åŸŸåæºæœåŠ¡å™¨çš„å·¥å…·ï¼Œå¸¸ç”¨äºŽç½‘ç«™å¤šæœåŠ¡å™¨è´Ÿè½½å‡è¡¡ï¼Œè€Œä¸”å› ä¸ºæ˜¯é€šè¿‡æ˜Žæ–‡çš„ SNI æ¥èŽ·å–ç›®æ ‡åŸŸåï¼Œå› æ¤ä¸éœ€è¦ SSL 解密å†åŠ å¯†ï¼Œè½¬å‘速度和效率自然也大大æé«˜äº†ã€‚
Important
注æ„ï¼SNIProxy åªæ˜¯èµ·åˆ°ä¸€ä¸ªç«¯å£è½¬å‘ã€è´Ÿè½½å‡è¡¡çš„作用。简å•çš„æ¥è¯´å°±æ˜¯ SNIProxy 收到的所有数æ®éƒ½ä¼šè¢«åŽŸå°ä¸åŠ¨çš„è½¬å‘ç»™ç›®æ ‡æºæœåŠ¡å™¨ï¼ˆåŒ…æ‹¬æ˜Žæ–‡çš„ SNI 域åä¿¡æ¯ï¼Œä»»ä½•第三方例如墙ä¾ç„¶èƒ½ç›´æŽ¥çœ‹åˆ°ï¼‰ï¼Œå› æ¤ SNIProxy 是 æ— æ³•ç”¨æ¥ç•ªå¢™
的(å¦åˆ™å°±æ˜¯è„±è£¤åæ”¾å± â€”â€” 多æ¤ä¸€ä¸¾ï¼ 毕竟墙早就å¯ä»¥ 域å(SNI)é˜»æ– äº†ï¼‰ã€‚
分享我其他开æºé¡¹ç›®ï¼šTrackersList.com - 全网çƒé—¨ BT Tracker åˆ—è¡¨ï¼æœ‰æ•ˆæé«˜ BT 下载速度~
CloudflareSpeedTest - 🌩「自选优选 IPã€æµ‹è¯• Cloudflare CDN å»¶è¿Ÿå’Œé€Ÿåº¦ï¼ŒèŽ·å–æœ€å¿« IP~
UserScript - 🵠Github 高速下载ã€çŸ¥ä¹Žå¢žå¼ºã€è‡ªåŠ¨æ— ç¼ç¿»é¡µã€æŠ¤çœ¼æ¨¡å¼ ç‰åå‡ ä¸ªæ²¹çŒ´è„šæœ¬~
- æ”¯æŒ å…¨å¹³å°ã€å…¨ç³»ç»Ÿï¼ˆGo è¯è¨€ç‰¹æ€§ï¼‰
- æ”¯æŒ Socks5 å‰ç½®ä»£ç†ï¼ˆæ¯”如å¯ä»¥å†å¥—一层 WARPï¼Œè¿™æ · SNIProxy çš„å‡ºå£ IP 就是 Cloudflare 的了)
- æ”¯æŒ å…è®¸è½¬å‘æ‰€æœ‰åŸŸå 或 ä»…å…è®¸è½¬å‘æŒ‡å®šåŸŸå(包å«åŸŸå自身åŠå…¶æ‰€æœ‰å域å)
- æ”¯æŒ å•ç‹¬æˆ–åŒæ—¶ç›‘å¬åŠä¼ 输 IPv4ã€IPv6 æµé‡
- æ”¯æŒ æ ¹æ®æ˜Žæ–‡ SNI(域å/主机å) æ¥è‡ªåŠ¨è½¬å‘æµé‡åˆ°è¯¥åŸŸåçš„æºæœåŠ¡å™¨ï¼Œæ— éœ€åŠ è§£å¯†æµé‡ï¼Œæ— 需 SSL 密钥或è¯ä¹¦
Warning
注æ„ï¼SNIProxy 仅为我个人自写自用,å¯é 性ã€ç¨³å®šæ€§ç‰æ–¹é¢ä¸å¦‚专业的商业软件(如 Nginxã€HAProxyï¼‰ï¼Œå› æ¤åœ¨æ£å¼çš„生产环境下ä¸å»ºè®®ä½¿ç”¨æœ¬è½¯ä»¶ï¼Œå¦‚é€ æˆæŸå¤±ï¼Œæ ¹æ® GPL-3.0 æœ¬é¡¹ç›®æ— éœ€æ‰¿æ‹…è´£ä»»ï¼ˆæºœäº†æºœäº†~
Note
å¦å¤–,Web æµé‡ä¸€ç›´åœ¨ä¸æ–å‘å±•ï¼Œç›®å‰æµè¡Œçš„ HTTP/2 å¯ä»¥åœ¨å•个 TCP æµä¸å¤ç”¨å¤šä¸ªä¸»æœºå,这会导致 SNIProxy æ— æ³•æ ¹æ®ä¸»æœºå(域å)æ¥æ£ç¡®è½¬å‘æµé‡ï¼ˆå› 为多个混在了一起)。而 HTTP/3 (QUIC) 更是改用 UDP åè®®ä¼ è¾“ï¼Œè¿™å’Œ TCP å议是完全ä¸åŒçš„。SNIProxy 䏿”¯æŒè¿™äº›å议,也ä 8000 ¸ä¼šåŽ»æ·»åŠ æ”¯æŒï¼Œå› 为这会使项目å˜å¾—æžå…¶å¤æ‚ï¼ˆä¹Ÿè¶…å‡ºäº†æˆ‘çš„èƒ½åŠ›ï¼Œæ¯•ç«Ÿæˆ‘åªæ˜¯ä¸ºäº†æ–¹ä¾¿è‡ªå·±ä½¿ç”¨è€Œè¾¹å¦è¾¹å†™çš„,代ç 也æ‰å‡ 百行罢了)。
SNIProxy 的工作æµç¨‹å¤§æ¦‚如下:
- è§£æžä¼ 入连接ä¸çš„ TLS/SSL æ¡æ‰‹æ¶ˆæ¯ï¼Œä»¥èŽ·å–访客å‘é€çš„ SNI 域åä¿¡æ¯ã€‚
- æ£€æŸ¥åŸŸåæ˜¯å¦åœ¨å…许列表ä¸ï¼ˆæˆ–å¼€å¯äº†
allow_all_hosts
),如果ä¸åœ¨å°†ä¸æ–连接,å之继ç»ã€‚ - 使用系统 DNS è§£æž SNI 域å获得 IP 地å€ï¼ˆå³è¯¥åŸŸåçš„æºç«™æœåС噍 IP 地å€ï¼‰ã€‚
- 将收到的数æ®åŽŸå°ä¸åŠ¨çš„è½¬å‘给该域åçš„æºç«™ IP:443,在访客和æºç«™ä¹‹é—´å»ºç«‹ä¸€ä¸ª "æ¡¥æ¢" 进行æŒç»çš„相互数æ®ä¼ è¾“ï¼ˆå³ TCP ä¸è½¬/端å£è½¬å‘)。
// å°† example.com åŸŸåæŒ‡å‘ SNIProxy æœåŠ¡å™¨çš„ IP,然åŽï¼š
访问 example.com <=> SNIProxy(è§£æž SNI èŽ·å¾—ç›®æ ‡åŸŸå) <=> æºç«™(example.com)
// 按照工作æµç¨‹æ›´è¯¦ç»†ä¸€ç‚¹çš„:
访问 example.com <=> SNIProxy [ è§£æž SNI 获得 example.com 域å <=> æ£€æŸ¥è¯¥åŸŸåæ˜¯å¦åœ¨å…è®¸è½¬å‘ <=> 系统 DNS è§£æžè¯¥åŸŸå获得 IP åœ°å€ ] <=> æºç«™(example.com)
// ä¾‹å¦‚ï¼šå½“æœ‰å¤šå°æœåС噍é…ç½® SNIProxy åŽï¼Œå¯ä»¥åœ¨åŸŸå DNS è§£æžä¸æŒ‡å‘这些æœåС噍 IPï¼Œè¿™æ ·è®¿å®¢å°±ä¼šè¢«éšæœºåˆ†é…到其ä¸ä¸€ä¸ªæœåŠ¡å™¨ä¸Šï¼Œå®žçŽ°åˆ†æµè´Ÿè½½å‡è¡¡ç‰ã€‚
// 也å¯ä»¥ä¾é DNS åŒºåŸŸè§£æžæ¥ç»™ä¸åŒåœ°åŒºã€è¿è¥å•†çš„访客指å‘离它们更近ã€çº¿è·¯æ›´ä¼˜çš„æœåŠ¡å™¨ IP,æ¥é—´æŽ¥æé«˜ç½‘站的访问速度,æå‡ç”¨æˆ·ä½“验。
// 如果 SNIProxy å¼€å¯äº†å‰ç½®ä»£ç†ï¼Œé‚£ä¹ˆå°±æ˜¯è¿™æ ·ï¼š
访问 example.com <=> SNIProxy <=> Socks5(è§£æž SNI èŽ·å¾—ç›®æ ‡åŸŸå) <=> æºç«™(example.com)
Tip
SNIProxy 本质上也是一ç§ç«¯å£è½¬å‘(ä¸è½¬ï¼‰ï¼Œä½†ä¸åŒäºŽç«¯å£è½¬å‘åªèƒ½æŒ‡å®šä¸€ä¸ªå›ºå®šçš„ç›®æ ‡ IP,SNIProxy å¯ä»¥é€šè¿‡ DNS è§£æžä¼ å…¥çš„åŸŸåæ¥èŽ·å¾—çµæ´»çš„ç›®æ ‡ IPï¼ˆä¼ å…¥ä¸åŒçš„域åèµ°ä¸åŒç›®æ ‡ IP,å¯åŒæ—¶å˜åœ¨ä¸”互ä¸å¹²æ‰°ï¼‰ã€‚
「 点击查看 Linux 系统下的使用示例 ã€
以下命令仅为示例,版本å·å’Œæ–‡ä»¶å请å‰å¾€ Releases 查看。
# 如果是第一次使用,则建议创建新文件夹(åŽç»æ›´æ–°æ—¶ï¼Œè·³è¿‡è¯¥æ¥éª¤ï¼‰
mkdir sniproxy
# 进入文件夹(åŽç»æ›´æ–°ï¼Œåªéœ€è¦ä»Žè¿™é‡Œé‡å¤ä¸‹é¢çš„下载ã€è§£åދ命令å³å¯ï¼‰
cd sniproxy
# 下载 sniproxy åŽ‹ç¼©åŒ…ï¼ˆè‡ªè¡Œæ ¹æ®éœ€æ±‚æ›¿æ¢ URL ä¸ [版本å·] å’Œ [文件å])
wget -N https://github.com/XIU2/SNIProxy/releases/download/v1.0.4/sniproxy_linux_amd64.tar.gz
# å¦‚æžœä½ æ˜¯åœ¨å›½å†…æœåŠ¡å™¨ä¸Šä¸‹è½½ï¼Œé‚£ä¹ˆè¯·ä½¿ç”¨ä¸‹é¢è¿™å‡ 个镜åƒåŠ é€Ÿï¼š
# wget -N https://ghp.ci/https://github.com/XIU2/SNIProxy/releases/download/v1.0.4/sniproxy_linux_amd64.tar.gz
# wget -N https://ghproxy.cc/https://github.com/XIU2/SNIProxy/releases/download/v1.0.4/sniproxy_linux_amd64.tar.gz
# wget -N https://ghproxy.net/https://github.com/XIU2/SNIProxy/releases/download/v1.0.4/sniproxy_linux_amd64.tar.gz
# wget -N https://gh-proxy.com/https://github.com/XIU2/SNIProxy/releases/download/v1.0.4/sniproxy_linux_amd64.tar.gz
# 如果下载失败的è¯ï¼Œå°è¯•åˆ é™¤ -N 傿•°ï¼ˆå¦‚果是为了更新,则记得æå‰åˆ 除旧压缩包 rm sniproxy_linux_amd64.tar.gz )
# 解压(ä¸éœ€è¦åˆ é™¤æ—§æ–‡ä»¶ï¼Œä¼šç›´æŽ¥è¦†ç›–ï¼Œè‡ªè¡Œæ ¹æ®éœ€æ±‚æ›¿æ¢ æ–‡ä»¶å)
tar -zxf sniproxy_linux_amd64.tar.gz
# 赋予执行æƒé™
chmod +x sniproxy
# 编辑é…ç½®æ–‡ä»¶ï¼ˆæ ¹æ®ä¸‹é¢çš„ é…置文件说明 æ¥è‡ªå®šä¹‰é…置内容并ä¿å˜(按下 Ctrl+X ç„¶åŽå†æŒ‰ 2 下回车)
nano config.yaml
# è¿è¡Œï¼ˆä¸å¸¦å‚数)
./sniproxy
# è¿è¡Œï¼ˆå¸¦å‚数示例)
./sniproxy -c "config.yaml"
# åŽå°è¿è¡Œï¼ˆå¸¦å‚数示例)
nohup ./sniproxy -c "config.yaml" > "sni.log" 2>&1 &
å¦å¤–,强烈建议顺便æé«˜ä¸€ä¸‹ ç³»ç»Ÿæ–‡ä»¶å¥æŸ„数上é™ï¼Œé¿å…é‡åˆ°æŠ¥é”™ too many open files
å¦å¤–ï¼Œå¦‚æžœä½ å¸Œæœ› 开机å¯åЍã€å®ˆæŠ¤è¿›ç¨‹(异常退出自动æ¢å¤)ã€åŽå°è¿è¡Œã€æ–¹ä¾¿ç®¡ç† ç‰ï¼Œé‚£ä¹ˆå¯ä»¥å°†å…¶ 注册为系统æœåŠ¡ã€‚
「 点击查看 Windows 系统下的使用示例 ã€
ä¸‹è½½å·²ç¼–è¯‘å¥½çš„å¯æ‰§è¡Œæ–‡ä»¶å¹¶è§£åŽ‹ï¼š
- Github Releases
- è“å¥äº‘(密ç :xiu2)
找到é…置文件 config.yaml
å³é”®èœå• - æ‰“å¼€æ–¹å¼ - 记事本。
æ ¹æ®ä¸‹é¢çš„ é…置文件说明 æ¥è‡ªå®šä¹‰é…置内容并ä¿å˜ã€‚
åŒå‡»è¿è¡Œ sniproxy.exe
文件。
或者在 CMD 命令行ä¸è¿›å…¥è½¯ä»¶æ‰€åœ¨ç›®å½•å¹¶è¿è¡Œ sniproxy.exe
:
# CMD 命令行ä¸è¿›å…¥è§£åŽ‹åŽçš„ sniproxy ç¨‹åºæ‰€åœ¨ç›®å½•(记得修改下é¢ç¤ºä¾‹è·¯å¾„)
cd /d C:\xxx\sniproxy
# è¿è¡Œï¼ˆä¸å¸¦å‚数)
sniproxy.exe
# è¿è¡Œï¼ˆå¸¦å‚数示例)
sniproxy.exe -c "config.yaml"
「 点击查看 Mac 系统下的使用示例 ã€
ä¸‹è½½å·²ç¼–è¯‘å¥½çš„å¯æ‰§è¡Œæ–‡ä»¶å¹¶è§£åŽ‹ï¼š
- Github Releases
- è“å¥äº‘(密ç :xiu2)
# 通过命令行进入 sniproxy 压缩包所在目录(记得修改下é¢ç¤ºä¾‹è·¯å¾„)
cd /xxx/xxx
# 解压(ä¸éœ€è¦åˆ é™¤æ—§æ–‡ä»¶ï¼Œä¼šç›´æŽ¥è¦†ç›–ï¼Œè‡ªè¡Œæ ¹æ®éœ€æ±‚æ›¿æ¢ æ–‡ä»¶å)
tar -zxf sniproxy_linux_amd64.tar.gz
# 赋予执行æƒé™
chmod a+x sniproxy
# 编辑é…ç½®æ–‡ä»¶ï¼ˆæ ¹æ®ä¸‹é¢çš„ é…置文件说明 æ¥è‡ªå®šä¹‰é…置内容并ä¿å˜(按下 Contrl+X ç„¶åŽå†æŒ‰ 2 下回车)
nano config.yaml
# è¿è¡Œï¼ˆä¸å¸¦å‚数)
./sniproxy
# è¿è¡Œï¼ˆå¸¦å‚数示例)
./sniproxy -c "config.yaml"
home@xiu:~# ./sniproxy -h
SNIProxy vX.X.X
https://github.com/XIU2/SNIProxy
傿•°ï¼š
-c config.yaml
é…置文件 (默认 config.yaml)
-l sni.log
日志文件 (默认 æ— )
-d
è°ƒè¯•æ¨¡å¼ (默认 å…³)
-v
程åºç‰ˆæœ¬
-h
帮助说明
「 点击展开 查看内容 ã€
注æ„: é…置文件是 YAML æ ¼å¼ï¼Œå³æŒ‰ç…§ç¼©è¿›ï¼ˆå³æ¯è¡Œå‰é¢çš„ç©ºæ ¼æ•°é‡ï¼‰æ¥ç¡®å®šå±‚çº§å…³ç³»çš„ï¼Œå› æ¤ä¸æ‡‚çš„è¯è¯·æŒ‰ç…§é»˜è®¤é…ç½®æ–‡ä»¶å†…ç¤ºä¾‹çš„æ ¼å¼ä¸ºå‡†ï¼Œå…¶ä¸
#
的是注释(会被程åºå¿½ç•¥ï¼‰ï¼Œä¸éœ€è¦çš„é…ç½®å¯ä»¥æ³¨é‡ŠæŽ‰ã€‚
ç›®å‰é…置文件ä¸çš„é…ç½®é¡¹æ²¡å‡ ä¸ªï¼Œåˆ†åˆ«ä¸ºï¼š
# 监å¬ç«¯å£ï¼ˆæ³¨æ„需è¦å¼•å·ï¼‰ï¼Œå¸¸è§ç¤ºä¾‹å¦‚下:
# ":443" çœç•¥ IP åªå†™ç«¯å£ï¼Œä»£è¡¨ç›‘嬿œ¬æœºæ‰€æœ‰ IPv4+IPv6 地å€çš„ 443 端å£
# "0.0.0.0:443" ä»£è¡¨ç›‘å¬æœ¬æœºæ‰€æœ‰ IPv4 地å€çš„ 443 端å£
# "127.0.0.1:443" ä»£è¡¨ç›‘å¬æœ¬æœºæœ¬åœ° IPv4 地å€çš„ 443 端å£ï¼ˆåªæœ‰æœ¬æœºå¯è®¿é—®ï¼‰
# "[::]:443" ä»£è¡¨ç›‘å¬æœ¬æœºæ‰€æœ‰ IPv6 地å€çš„ 443 端å£
# "[::1]:443" ä»£è¡¨ç›‘å¬æœ¬æœºæœ¬åœ° IPv6 地å€çš„ 443 端å£ï¼ˆåªæœ‰æœ¬æœºå¯è®¿é—®ï¼‰
# 上é¢ç¤ºä¾‹ä¸çš„ IP 地å€ä¹Ÿå¯ä»¥æ¢æˆä¾‹å¦‚ä½ çš„å¤–ç½‘ IPï¼Œè¿™æ ·çš„è¯å°±åªèƒ½ä»Žè¯¥å¤–网 IP 访问了
listen_addr: ":443"
# å¯é€‰ï¼šå¯ç”¨ Socks5 å‰ç½®ä»£ç†
# (å¯ç”¨å‰ï¼šè®¿å®¢ <=> SNIProxy <=> ç›®æ ‡ç½‘ç«™
# (å¯ç”¨åŽï¼šè®¿å®¢ <=> SNIProxy <=> Socks5 <=> ç›®æ ‡ç½‘ç«™
# (比如å¯ä»¥å¥— WARPï¼Œé‚£æ ·å°±å˜æˆï¼šè®¿å®¢ <=> SNIProxy <=> WARP <=> ç›®æ ‡ç½‘ç«™
enable_socks5: true
# å¯é€‰ï¼šé…ç½® Socks5 代ç†åœ°å€
socks_addr: 127.0.0.1:40000
# å¯é€‰ï¼šå…许所有域å(开å¯åŽä¼šå¿½ç•¥ä¸‹é¢çš„ rules 列表)
allow_all_hosts: true
# å¯é€‰ï¼šä»…å…许指定域å(和上é¢çš„ allow_all_hosts 二选一)
# 指定域ååŽï¼Œåˆ™ä»£è¡¨å…许 域å自身 åŠå…¶ 所有å域å 访问æœåŠ¡ï¼ˆä»¥ä¸‹æ–¹ä¸¤ä¸ªä¸ºä¾‹ï¼Œâˆš 代表å…许,× 代表阻æ¢ï¼‰
rules:
- example.com # example.com √ ã€a.example.com √ ã€a.a.example.com √
- b.example2.com # example2.com × ã€b.example2.com √ ã€c.b.example2.com √
一些示例:
- å…许所有域å访问
listen_addr: ":443"
allow_all_hosts: true
注æ„ï¼Œå¼€å¯ allow_all_hosts 时,å¯èƒ½ä¼šè¢«ä»–人扫æåˆ°è€Œæ»¥ç”¨ï¼Œè¯·æ‚‰çŸ¥ï¼
建议åšä¸€äº›é™åˆ¶ï¼Œä¾‹å¦‚åªä½¿ç”¨ IPv6("[::]:443"
)或防ç«å¢™é™åˆ¶ 443 端å£çš„å¯è®¿é—® IP。
- ä»…å…许指定域å
listen_addr: ":443"
rules:
- example.com
- b.example2.com
- å…许所有域å访问 + å¯ç”¨å‰ç½®ä»£ç†
listen_addr: ":443"
enable_socks5: true
socks_addr: 127.0.0.1:40000
allow_all_hosts: true
- ä»…å…许指定域å + å¯ç”¨å‰ç½®ä»£ç†
listen_addr: ":443"
enable_socks5: true
socks_addr: 127.0.0.1:40000
rules:
- example.com
- b.example2.com
「 点击展开 查看内容 ã€
新建一个空的åå« sniproxy 的系统æœåŠ¡é…置文件:
nano /etc/systemd/system/sniproxy.service
修改以下内容åŽï¼ˆExecStart=
åŽé¢çš„程åºè·¯å¾„ã€å‚数)åŽç²˜è´´è¿›æ–‡ä»¶å†…:
[Unit]
Description=SNI Proxy
After=network.target
[Service]
ExecStart=/home/sniproxy/sniproxy -c /home/sniproxy/config.yaml -l /home/sniproxy/sni.log
Restart=on-failure
[Install]
WantedBy=multi-user.target
å…¶ä¸
Restart=on-failure
表示,当程åºéžæ£å¸¸é€€å‡ºæ—¶ï¼Œä¼šè‡ªåЍæ¢å¤å¯åŠ¨ï¼Œä¹Ÿå°±æ˜¯å¸¸è¯´çš„å®ˆæŠ¤è¿›ç¨‹ã€‚
设置 sniproxy 开机å¯åŠ¨å¹¶ç«‹å³å¯åŠ¨ï¼š
# å¯ç”¨è¯¥ç³»ç»ŸæœåŠ¡ å¹¶ å…许开机å¯åЍ
systemctl enable sniproxy
# ç«‹å³å¯åЍ
systemctl start sniproxy
å…¶ä»–å¯èƒ½ä¼šç”¨åˆ°çš„命令:
# åœæ¢
systemctl stop sniproxy
# é‡å¯
systemctl restart sniproxy
# 查看è¿è¡Œçжæ€
systemctl status sniproxy
# 查看完整日志
cat /home/sniproxy/sni.log
# å®žæ—¶ç›‘å¬æ—¥å¿—(会实时显示最新日志内容)
tail -f /home/sniproxy/sni.log
# å¦‚æžœä½ ä¿®æ”¹äº† /etc/systemd/system/sniproxy.service é…置文件,那么需è¦å…ˆé‡è½½é…ç½®åŽæ‰èƒ½å¯åЍ/é‡å¯ sniproxy æœåŠ¡
systemctl daemon-reload
「 点击展开 查看内容 ã€
é¦–å…ˆéœ€è¦æ¸…楚,SNIProxy 是通过 IPv4 还是 IPv6 地å€è½¬å‘æµé‡ç»™ç›®æ ‡åŸŸåæºæœåŠ¡å™¨ï¼Œå’Œä½ æ˜¯é€šè¿‡ IPv4 还是 IPv6 访问 SNIProxy æœåŠ¡æ— å…³ï¼Œ"ä½ ä¸Ž SNIProxy"
å’Œ "SNIProxy 与 æºæœåС噍"
这两个环节是独立的,互ä¸å½±å“的。
å› ä¸º SNIProxy çš„ DNS è§£æžçŽ¯èŠ‚æ˜¯äº¤ç”±ç³»ç»Ÿ DNS æœåС处ç†çš„ï¼Œå› æ¤å¯¹äºŽ SNIProxy 是通过 IPv4 还是 IPv6 地å€è½¬å‘æµé‡ç»™ç›®æ ‡åŸŸåæºæœåŠ¡å™¨ï¼Œåˆ™å–决于:
- è¿è¡Œ SNIProxy çš„æœåŠ¡å™¨æ˜¯å¦æœ‰ IPv4 或 IPv6 地å€ï¼ˆæˆ–éƒ½æœ‰ï¼Œä¹Ÿå°±æ˜¯åŒæ ˆæœåŠ¡å™¨ï¼‰
- è¿è¡Œ SNIProxy çš„æœåС噍当å‰ç³»ç»Ÿé…置的 DNS 优先级是 IPv4 优先还是 IPv6 优先(一般默认都是 IPv6 优先)
- è¯¥ç›®æ ‡åŸŸåè§£æžè®°å½•䏿˜¯å¦æœ‰ IPv4 或 IPv6 地å€ï¼ˆä¹Ÿå°±æ˜¯ A å’Œ AAAA 记录)
å³ï¼Œå¦‚æžœä½ çš„æœåŠ¡å™¨æœ‰ IPv6 地å€ï¼Œä¸”系统为默认的 IPv6 ä¼˜å…ˆï¼Œé‚£ä¹ˆæ— è®ºä½ æ˜¯é€šè¿‡ IPv4 还是 IPv6 访问的 SNIProxy æœåŠ¡å™¨ï¼Œåªè¦è¯¥åŸŸå有 IPv6 è§£æžåœ°å€ï¼Œé‚£ä¹ˆ SNIProxy 就会通过 IPv6 è½¬å‘æµé‡ç»™ç›®æ ‡åŸŸåæºæœåŠ¡å™¨ã€‚
访问 example.com <=IPv4=> SNIProxy <=优先 IPv6=> 系统 DNS è§£æžèŽ·å¾—è¯¥åŸŸåçš„ IP åœ°å€ <=IPv6=> æºç«™(example.com)
访问 example.com <=IPv6=> SNIProxy <=优先 IPv6=> 系统 DNS è§£æžèŽ·å¾—è¯¥åŸŸåçš„ IP åœ°å€ <=IPv6=> æºç«™(example.com)
å‡å¦‚ç›®æ ‡åŸŸåè§£æžåªæœ‰ IPv6 地å€ï¼Œä½ æœ¬åœ°åªæœ‰ IPv4 地å€ï¼Œä½†ä½ çš„æœåŠ¡å™¨æœ‰ IPv4+IPv6 地å€ï¼Œé‚£ä¹ˆä½ å°±å¯ä»¥é€šè¿‡ IPv4 æ¥è®¿é—® SNIProxyï¼Œç„¶åŽ SNIProxy 通过 IPv6 è®¿é—®ç›®æ ‡åŸŸåæºæœåŠ¡å™¨ã€‚
访问 example.com(ä»… IPv4) <=IPv4=> SNIProxy(æ”¯æŒ IPv4+IPv6) <=IPv6=> æºç«™(example.com ä»… IPv6)
关于这个系统 DNS æœåŠ¡çš„ IPv4 IPv6 优先级是å¯ä»¥è°ƒçš„(以下为将默认的 IPv6 优先改为 IPv4 优先):
æ‰“å¼€å¹¶ç¼–è¾‘æ–‡ä»¶ï¼ˆä½ ä¹Ÿå¯ä»¥ä½¿ç”¨ vim æ¥ç¼–辑):
nano /etc/gai.conf
找到以下行:
#precedence ::ffff:0:0/96 100
去掉改行行首的 #
注释符å·ï¼Œä½¿å…¶å˜ä¸ºï¼š
如果没有找到的è¯ï¼Œå¯ä»¥ç›´æŽ¥åœ¨æ–‡ä»¶æœ«å°¾å¦èµ·ä¸€è¡Œå†™ä¸Šä¸‹é¢è¿™è¡Œä»£ç 。
precedence ::ffff:0:0/96 100
按下 Ctrl+O
并回车ä¿å˜æ–‡ä»¶ï¼Œç„¶åŽå†æŒ‰ä¸‹ Ctrl+X
退出当å‰çš„ nano 编辑器。
æ¤æ—¶éšä¾¿ ping
ä¸€ä¸ªåŒæ—¶æ‹¥æœ‰ IPv4 åŠ IPv6 地å€çš„域åï¼Œçœ‹ä¸€ä¸‹ç»“æžœæ˜¯ä¸æ˜¯ IPv4 地å€ã€‚
å¦å¤–,修改系统 DNS 优先级åŽï¼Œå¯èƒ½éœ€è¦æ¸…ç†æœåŠ¡å™¨çš„ DNS 缓å˜å¹¶é‡å¯ SNIProxy æœåŠ¡ã€‚
「 点击展开 查看内容 ã€
Linux 系统下,一些人å¯èƒ½ä¼šé‡åˆ°æŠ¥é”™ï¼ˆæ—¥å¿—如下):
接å—连接请求时出错: accept tcp [::]:443: accept4: too many open files
è¿™æ˜¯å› ä¸ºç³»ç»Ÿçš„æ–‡ä»¶å¥æŸ„数耗尽了(默认 1024),æé«˜ç³»ç»Ÿæ–‡ä»¶å¥æŸ„数上é™å¯æœ‰æ•ˆç¼“解该问题(ä¸èƒ½å®Œå…¨è§£å†³ï¼Œå› 为ç†è®ºä¸Šï¼Œå½“打开文件ã€è¿žæŽ¥ç‰ç‰è¶³å¤Ÿå¤šæ—¶ï¼Œè¿Ÿæ—©ä¼šè€—尽,一般æ¥è¯´ä¸ç®¡æ˜¯åšä»£ç†è¿˜æ˜¯åšç½‘站,这个æ“作都是必须的)。
- 临时æé«˜ï¼ˆé‡å¯åŽæ¢å¤ä¸º 1024)
ulimit -n 65535
- 永久æé«˜ï¼ˆé‡å¯åŽä¾ç„¶ä¸º 65535ï¼Œå½“ç„¶æ‰“å¼€æ–‡ä»¶åŽæ‰‹åŠ¨åˆ é™¤å°±æ¢å¤äº†ï¼‰
echo "* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535" >> /etc/security/limits.conf
执行以上命令åŽï¼Œéœ€è¦é‡å¯ SNIProxy æ¥ä½¿å…¶ç”Ÿæ•ˆï¼Œå¦‚果还ä¸è¡Œè¯·å°è¯•é‡å¯ç³»ç»Ÿã€‚
systemctl restart sniproxy
å¦‚æžœä½ é‡åˆ°ä»€ä¹ˆé—®é¢˜ï¼Œå¯ä»¥å…ˆåŽ» Issuesã€Discussions é‡Œçœ‹çœ‹æ˜¯å¦æœ‰åˆ«äººé—®è¿‡äº†ï¼ˆè®°å¾—去看下 Closed 的)。
如果没找到类似问题,请新开个 Issues æ¥å‘Šè¯‰æˆ‘ï¼
Note
与 å馈问题ã€åŠŸèƒ½å»ºè®®
æ— å…³çš„ï¼Œè¯·å‰å¾€é¡¹ç›®å†…部 è®ºå› è®¨è®ºï¼ˆä¸Šé¢çš„ 💬 Discussions
「 点击展开 查看内容 ã€
为了方便,我是在编译的时候将版本å·å†™å…¥ä»£ç ä¸çš„ version å˜é‡ï¼Œå› æ¤ä½ 手动编译时,需è¦åƒä¸‹é¢è¿™æ ·åœ¨ go build
命令åŽé¢åŠ ä¸Š -ldflags
傿•°æ¥æŒ‡å®šç‰ˆæœ¬å·ï¼š
go build -ldflags "-s -w -X main.version=v1.0.4"
# 在 SNIProxy 目录ä¸é€šè¿‡å‘½ä»¤è¡Œï¼ˆä¾‹å¦‚ CMDã€Bat 脚本)è¿è¡Œè¯¥å‘½ä»¤ï¼Œå³å¯ç¼–译一个å¯åœ¨å’Œå½“å‰è®¾å¤‡åŒæ ·ç³»ç»Ÿã€ä½æ•°ã€æž¶æž„的环境下è¿è¡Œçš„二进制程åºï¼ˆGo ä¼šè‡ªåŠ¨æ£€æµ‹ä½ çš„ç³»ç»Ÿä½æ•°ã€æž¶æž„)且版本å·ä¸º v1.0.4
如果想è¦åœ¨ Windows 64ä½ç³»ç»Ÿä¸‹ç¼–è¯‘å…¶ä»–ç³»ç»Ÿã€æž¶æž„ã€ä½æ•°ï¼Œé‚£ä¹ˆéœ€è¦æŒ‡å®š GOOS å’Œ GOARCH å˜é‡ã€‚
例如在 Windows 系统下编译一个适用于 Linux 系统 amd æž¶æž„ 64 ä½çš„二进制程åºï¼š
SET GOOS=linux
SET GOARCH=amd64
go build -ldflags "-s -w -X main.version=v1.0.4"
例如在 Linux 系统下编译一个适用于 Windows 系统 amd æž¶æž„ 32 ä½çš„二进制程åºï¼š
GOOS=windows
GOARCH=386
go build -ldflags "-s -w -X main.version=v1.0.4"
å¯ä»¥è¿è¡Œ
go tool dist list
æ¥æŸ¥çœ‹å½“å‰ Go 版本支æŒç¼–译哪些组åˆã€‚
当然,为了方便批é‡ç¼–译,我会专门指定一个å˜é‡ä¸ºç‰ˆæœ¬å·ï¼ŒåŽç»ç¼–译直接调用该版本å·å˜é‡å³å¯ã€‚
åŒæ—¶ï¼Œæ‰¹é‡ç¼–译的è¯ï¼Œè¿˜éœ€è¦åˆ†å¼€æ”¾åˆ°ä¸åŒæ–‡ä»¶å¤¹æ‰è¡Œï¼ˆæˆ–者文件åä¸åŒï¼‰ï¼Œéœ€è¦åŠ ä¸Š -o
傿•°æŒ‡å®šã€‚
:: Windows ç³»ç»Ÿä¸‹æ˜¯è¿™æ ·ï¼š
SET version=v1.0.4
SET GOOS=linux
SET GOARCH=amd64
go build -o Releases\sniproxy_linux_amd64\sniproxy -ldflags "-s -w -X main.version=%version%"
# Linux ç³»ç»Ÿä¸‹æ˜¯è¿™æ ·ï¼š
version=v1.0.4
GOOS=windows
GOARCH=386
go build -o Releases/sniproxy_windows_386/sniproxy.exe -ldflags "-s -w -X main.version=${version}"
The source code has been adapted from FastGitORG/F-Proxy-Agent and TachibanaSuzume/SNIProxyGo .
Thank them for their help!
The GPL-3.0 License.