8000 GitHub - itsharex/SNIProxy: 🧷 è‡ªç”¨çš„ç®€å• SNIProxy(常用于网站负载å‡è¡¡ã€åŸºäºŽåŸŸå(SNI)的端å£è½¬å‘ç­‰
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
forked from XIU2/SNIProxy

🧷 è‡ªç”¨çš„ç®€å• SNIProxy(常用于网站负载å‡è¡¡ã€åŸºäºŽåŸŸå(SNI)的端å£è½¬å‘ç­‰

License

Notifications You must be signed in to change notification settings

itsharex/SNIProxy

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

XIU2/SNIProxy

Go Version Release Version GitHub license GitHub Star GitHub Fork

🧷 自用的一个功能很简å•çš„ 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 的工作æµç¨‹å¤§æ¦‚如下:

  1. è§£æžä¼ å…¥è¿žæŽ¥ä¸­çš„ TLS/SSL æ¡æ‰‹æ¶ˆæ¯ï¼Œä»¥èŽ·å–访客å‘é€çš„ SNI 域åä¿¡æ¯ã€‚
  2. æ£€æŸ¥åŸŸåæ˜¯å¦åœ¨å…许列表中(或开å¯äº† allow_all_hosts),如果ä¸åœ¨å°†ä¸­æ–­è¿žæŽ¥ï¼Œå之继续。
  3. 使用系统 DNS è§£æž SNI 域å获得 IP 地å€ï¼ˆå³è¯¥åŸŸåçš„æºç«™æœåС噍 IP 地å€ï¼‰ã€‚
  4. 将收到的数æ®åŽŸå°ä¸åŠ¨çš„è½¬å‘给该域åçš„æºç«™ 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 系统下的使用示例 ã€

下载

ä¸‹è½½å·²ç¼–è¯‘å¥½çš„å¯æ‰§è¡Œæ–‡ä»¶å¹¶è§£åŽ‹ï¼š

  1. Github Releases
  2. è“å¥äº‘(密ç :xiu2)

é…ç½®

找到é…置文件 config.yaml å³é”®èœå• - æ‰“å¼€æ–¹å¼ - 记事本。

æ ¹æ®ä¸‹é¢çš„ é…置文件说明 æ¥è‡ªå®šä¹‰é…置内容并ä¿å­˜ã€‚

è¿è¡Œ

åŒå‡»è¿è¡Œ sniproxy.exe 文件。

或者在 CMD 命令行中进入软件所在目录并è¿è¡Œ sniproxy.exe:

# CMD 命令行中进入解压åŽçš„ sniproxy ç¨‹åºæ‰€åœ¨ç›®å½•(记得修改下é¢ç¤ºä¾‹è·¯å¾„)
cd /d C:\xxx\sniproxy

# è¿è¡Œï¼ˆä¸å¸¦å‚数)
sniproxy.exe

# è¿è¡Œï¼ˆå¸¦å‚数示例)
sniproxy.exe -c "config.yaml"

「 点击查看 Mac 系统下的使用示例 ã€

ä¸‹è½½å·²ç¼–è¯‘å¥½çš„å¯æ‰§è¡Œæ–‡ä»¶å¹¶è§£åŽ‹ï¼š

  1. Github Releases
  2. è“å¥äº‘(密ç :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
        帮助说明

# 其他说明

# é…置文件说明 (config.yaml)

「 点击展开 查看内容 ã€

注æ„: é…置文件是 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 √

一些示例:

  1. å…许所有域å访问
listen_addr: ":443"
allow_all_hosts: true

注æ„ï¼Œå¼€å¯ allow_all_hosts 时,å¯èƒ½ä¼šè¢«ä»–人扫æåˆ°è€Œæ»¥ç”¨ï¼Œè¯·æ‚‰çŸ¥ï¼
建议åšä¸€äº›é™åˆ¶ï¼Œä¾‹å¦‚åªä½¿ç”¨ IPv6("[::]:443")或防ç«å¢™é™åˆ¶ 443 端å£çš„å¯è®¿é—® IP。

  1. ä»…å…许指定域å
listen_addr: ":443"
rules:
  - example.com
  - b.example2.com
  1. å…许所有域å访问 + å¯ç”¨å‰ç½®ä»£ç†
listen_addr: ":443"
enable_socks5: true
socks_addr: 127.0.0.1:40000
allow_all_hosts: true
  1. ä»…å…许指定域å + å¯ç”¨å‰ç½®ä»£ç†
listen_addr: ":443"
enable_socks5: true
socks_addr: 127.0.0.1:40000
rules:
  - example.com
  - b.example2.com

# Linux é…置为系统æœåŠ¡ (systemd - 以支æŒå¼€æœºå¯åЍã€å®ˆæŠ¤è¿›ç¨‹ç­‰)

「 点击展开 查看内容 ã€

新建一个空的åå« 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 è½¬å‘æµé‡ç»™ç›®æ ‡åŸŸåæºæœåŠ¡å™¨ï¼Ÿ

「 点击展开 查看内容 ã€

é¦–å…ˆéœ€è¦æ¸…楚,SNIProxy 是通过 IPv4 还是 IPv6 地å€è½¬å‘æµé‡ç»™ç›®æ ‡åŸŸåæºæœåŠ¡å™¨ï¼Œå’Œä½ æ˜¯é€šè¿‡ IPv4 还是 IPv6 访问 SNIProxy æœåŠ¡æ— å…³ï¼Œ"ä½  与 SNIProxy" å’Œ "SNIProxy 与 æºæœåС噍" 这两个环节是独立的,互ä¸å½±å“的。

因为 SNIProxy çš„ DNS è§£æžçŽ¯èŠ‚æ˜¯äº¤ç”±ç³»ç»Ÿ DNS æœåС处ç†çš„,因此对于 SNIProxy 是通过 IPv4 还是 IPv6 地å€è½¬å‘æµé‡ç»™ç›®æ ‡åŸŸåæºæœåŠ¡å™¨ï¼Œåˆ™å–决于:

  1. è¿è¡Œ SNIProxy çš„æœåŠ¡å™¨æ˜¯å¦æœ‰ IPv4 或 IPv6 地å€ï¼ˆæˆ–éƒ½æœ‰ï¼Œä¹Ÿå°±æ˜¯åŒæ ˆæœåŠ¡å™¨ï¼‰
  2. è¿è¡Œ SNIProxy çš„æœåС噍当å‰ç³»ç»Ÿé…置的 DNS 优先级是 IPv4 优先还是 IPv6 优先(一般默认都是 IPv6 优先)
  3. 该目标域åè§£æžè®°å½•ä¸­æ˜¯å¦æœ‰ 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 æœåŠ¡ã€‚


# æé«˜ç³»ç»Ÿæ–‡ä»¶å¥æŸ„æ•°ä¸Šé™ (é¿å…报错 too many open files)

「 点击展开 查看内容 ã€

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}"

Credit

The source code has been adapted from FastGitORG/F-Proxy-Agent and TachibanaSuzume/SNIProxyGo .

Thank them for their help!


License

The GPL-3.0 License.

About

🧷 è‡ªç”¨çš„ç®€å• SNIProxy(常用于网站负载å‡è¡¡ã€åŸºäºŽåŸŸå(SNI)的端å£è½¬å‘ç­‰

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 100.0%
0