由于大家都知道的原因,大多数 ISP 的国外带宽往往不太理想,据说这个可以用 kcp 突破,我暂时没有国外带宽的困扰,有兴趣的可以去研究下。这篇博文提供的方法是使用 Squid 进行分流,国内直连,国外走父级代理,配合 polipo 和 ChinaDNS 效果拔群。
由于 Squid 的父级代理暂不支持 socks5, 故还需要配合 polipo 将 socks5 转换为 HTTP proxy 使用。在 Arch 下通过 packer -S squid polipo
即可安装,接下来结合我的配置文件进行分析。
由于 polipo 和 Squid 都具有缓存功能,考虑到 Squid 在用户鉴权上更为强大,作为 HTTP 前端接入比较合适,因此需要禁用 polipo 的缓存功能。
socks5 to HTTP – polipo
polipo 的配置(/etc/polipo/config
)如下:
# Sample configuration file for Polipo. -*-sh-*- | |
# /etc/polipo/config | |
# You should not need to use a configuration file; all configuration | |
# variables have reasonable defaults. If you want to use one, you | |
# can copy this to /etc/polipo/config or to ~/.polipo and modify. | |
# This file only contains some of the configuration variables; see the | |
# list given by “polipo -v” and the manual for more. | |
### Basic configuration | |
### ******************* | |
# Uncomment one of these if you want to allow remote clients to | |
# connect: | |
proxyAddress = “::0“ # both IPv4 and IPv6 | |
# proxyAddress = “0.0.0.0” # IPv4 only | |
# If you do that, you’ll want to restrict the set of hosts allowed to | |
# connect: | |
# allowedClients = 127.0.0.1, 134.157.168.57 | |
# allowedClients = 127.0.0.1, 134.157.168.0/24 | |
allowedClients = 127.0.0.1, ::1, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 | |
# Uncomment this if you want your Polipo to identify itself by | |
# something else than the host name: | |
# proxyName = “polipo.example.org” | |
# Uncomment this if there’s only one user using this instance of Polipo: | |
# cacheIsShared = false | |
# Uncomment this if you want to use a parent proxy: | |
# parentProxy = “squid.example.org:3128” | |
# Uncomment this if you want to use a parent SOCKS proxy: | |
socksParentProxy = “localhost:8080“ | |
socksProxyType = socks5 | |
# Uncomment this if you want to scrub private information from the log: | |
# scrubLogs = true | |
### Memory | |
### ****** | |
# Uncomment this if you want Polipo to use a ridiculously small amount | |
# of memory (a hundred C-64 worth or so): | |
# chunkHighMark = 819200 | |
# objectHighMark = 128 | |
# Uncomment this if you’ve got plenty of memory: | |
# chunkHighMark = 50331648 | |
# objectHighMark = 16384 | |
### On-disk data | |
### ************ | |
# Uncomment this if you want to disable the on-disk cache: | |
diskCacheRoot = ““ | |
# Uncomment this if you want to put the on-disk cache in a | |
# non-standard location: | |
# diskCacheRoot = “~/.polipo-cache/” | |
# Uncomment this if you want to disable the local web server: | |
# localDocumentRoot = “” | |
# Uncomment this if you want to enable the pages under /polipo/index? | |
# and /polipo/servers?. This is a serious privacy leak if your proxy | |
# is shared. | |
# disableIndexing = false | |
# disableServersList = false | |
### Domain Name System | |
### ****************** | |
# Uncomment this if you want to contact IPv4 hosts only (and make DNS | |
# queries somewhat faster): | |
# dnsQueryIPv6 = no | |
# Uncomment this if you want Polipo to prefer IPv4 to IPv6 for | |
# double-stack hosts: | |
# dnsQueryIPv6 = reluctantly | |
# Uncomment this to disable Polipo’s DNS resolver and use the system’s | |
# default resolver instead. If you do that, Polipo will freeze during | |
# every DNS query: | |
# dnsUseGethostbyname = yes | |
### HTTP | |
### **** | |
# Uncomment this if you want to enable detection of proxy loops. | |
# This will cause your hostname (or whatever you put into proxyName | |
# above) to be included in every request: | |
# disableVia=false | |
# Uncomment this if you want to slightly reduce the amount of | |
# information that you leak about yourself: | |
# censoredHeaders = from, accept-language | |
# censorReferer = maybe | |
# Uncomment this if you’re paranoid. This will break a lot of sites, | |
# though: | |
# censoredHeaders = set-cookie, cookie, cookie2, from, accept-language | |
# censorReferer = true | |
# Uncomment this if you want to use Poor Man’s Multiplexing; increase | |
# the sizes if you’re on a fast line. They should each amount to a few | |
# seconds’ worth of transfer; if pmmSize is small, you’ll want | |
# pmmFirstSize to be larger. | |
# Note that PMM is somewhat unreliable. | |
# pmmFirstSize = 16384 | |
# pmmSize = 8192 | |
# Uncomment this if your user-agent does something reasonable with | |
# Warning headers (most don’t): | |
# relaxTransparency = maybe | |
# Uncomment this if you never want to revalidate instances for which | |
# data is available (this is not a good idea): | |
# relaxTransparency = yes | |
# Uncomment this if you have no network: | |
# proxyOffline = yes | |
# Uncomment this if you want to avoid revalidating instances with a | |
# Vary header (this is not a good idea): | |
# mindlesslyCacheVary = true | |
# Uncomment this if you want to add a no-transform directive to all | |
# outgoing requests. | |
# alwaysAddNoTransform = true |
其中 socksParentProxy = "localhost:8080"
为 socks5 代理,你可以通过 ss 提供。diskCacheRoot = ""
为禁用 polipo 的缓存功能。polipo 默认监听 8123 端口,需要更改的话设定 proxyPort 即可。
Squid
作为可能开放公网接入的 Squid 服务,除了开放局域网内 IP 白名单外还需要对其他 IP 进行鉴权,推荐相对安全一点的 digest http auth
. htdigest 在 apache-tools 中,使用 packer -S apache-tools
安装。按照 Squid 上的操作来就好。我的配置文件如下:
# | |
# Recommended minimum configuration: | |
# | |
# Example rule allowing access from your local networks. | |
# Adapt to list your (internal) IP networks from where browsing | |
# should be allowed | |
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network | |
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network | |
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network | |
acl localnet src fc00::/7 # RFC 4193 local private network range | |
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines | |
acl SSL_ports port 443 | |
acl Safe_ports port 80 # http | |
acl Safe_ports port 21 # ftp | |
acl Safe_ports port 443 # https | |
acl Safe_ports port 70 # gopher | |
acl Safe_ports port 210 # wais | |
acl Safe_ports port 1025-65535 # unregistered ports | |
acl Safe_ports port 280 # http-mgmt | |
acl Safe_ports port 488 # gss-http | |
acl Safe_ports port 591 # filemaker | |
acl Safe_ports port 777 # multiling http | |
acl CONNECT method CONNECT | |
# | |
# Recommended minimum Access Permission configuration: | |
# | |
# Deny requests to certain unsafe ports | |
http_access deny !Safe_ports | |
# Deny CONNECT to other than secure SSL ports | |
http_access deny CONNECT !SSL_ports | |
# Only allow cachemgr access from localhost | |
http_access allow localhost manager | |
http_access deny manager | |
# We strongly recommend the following be uncommented to protect innocent | |
# web applications running on the proxy server who think the only | |
# one who can access services on “localhost” is a local user | |
http_access deny to_localhost | |
# | |
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS | |
# | |
# access chinaip or other | |
cache_peer localhost parent 8123 0 no-query default | |
prefer_direct off | |
nonhierarchical_direct off | |
acl chinaip dst “/etc/chnroute.txt” | |
always_direct allow chinaip | |
never_direct allow all | |
# not alter the X-Forwarded-For header in any way | |
forwarded_for transparent | |
follow_x_forwarded_for allow localhost | |
# prevent 504 proxy loop for polipo | |
via off | |
# Example rule allowing access from your local networks. | |
# Adapt localnet in the ACL section to list your (internal) IP networks | |
# from where browsing should be allowed | |
http_access allow localnet | |
http_access allow localhost | |
# authentication | |
auth_param digest program /usr/lib/squid/digest_file_auth -c /etc/squid/squid_digest_user | |
auth_param digest children 5 | |
auth_param digest realm MyRealm | |
auth_param digest credentialsttl 2 hours | |
acl users proxy_auth REQUIRED | |
http_access deny !users | |
http_access allow users | |
# And finally deny all other access to this proxy | |
http_access deny all | |
# Squid normally listens to port 3128 | |
http_port 3128 | |
cache_mem 128 MB | |
maximum_object_size 32 MB | |
# Uncomment and adjust the following to add a disk cache directory. | |
#cache_dir ufs /var/cache/squid 100 16 256 | |
cache_dir diskd /datacenter/cache/squid 10000 16 256 | |
# Leave coredumps in the first cache dir | |
#coredump_dir /var/cache/squid | |
coredump_dir /datacenter/cache/squid | |
# | |
# Add any of your own refresh_pattern entries above these. | |
# | |
refresh_pattern ^ftp: 1440 20% 10080 | |
refresh_pattern ^gopher: 1440 0% 1440 | |
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 | |
refresh_pattern . 0 20% 4320 |
- https://gist.github.com/billryan/718af2a3500bdf93a30e225d1e7dd725#file-squid-conf-L51 利用了 polipo 父级代理
- https://gist.github.com/billryan/718af2a3500bdf93a30e225d1e7dd725#file-squid-conf-L54 利用了 ChinaDNS 提供的中国大陆的 IPv4 信息,这里是分流的关键!
- https://gist.github.com/billryan/718af2a3500bdf93a30e225d1e7dd725#file-squid-conf-L60 可以配合 nghttpx 使用,以使得 Squid 在作为二级代理时能正确获知客户端 IP 进行鉴权
- https://gist.github.com/billryan/718af2a3500bdf93a30e225d1e7dd725#file-squid-conf-L63 禁用 via, 防止 polipo 504 proxy loop
- https://gist.github.com/billryan/718af2a3500bdf93a30e225d1e7dd725#file-squid-conf-L72 为需认证用户的信息,需要自行更改
- https://gist.github.com/billryan/718af2a3500bdf93a30e225d1e7dd725#file-squid-conf-L92 对于缓存另起一进程处理,避免阻塞
最后设置开机启动,大功告成,Squid 默认开放 3128 端口,局域网内可设置 HTTP 代理为此测试。
原文:https://blog.yuanbin.me/posts/2016/07/Squid-for-home-server.html?utm_source=tuicool&utm_medium=referral
评论 在此处输入想要评论的文本。