前提

用docker安装squid

  • x86 用

    docker run -d --name squid -p 3128:3128 minimum2scp/squid
  • arm64 / x86 兼用 (树莓派可用)

    mkdir ~/docker-vols/squid
    cd ~/docker-vols/squid
    
    # 由于要使用的docker镜像内部默认没有安装任何文本编辑器vi 和 nano都没有
    # 所以需要在宿主机上修改容器内部的配置文件
    # 先创建一个使用默认配置文件的容器以便取得这个原始的配置文件
    docker run -d --name squid -e TZ=UTC -p 3128:3128 ubuntu/squid:5.2-22.04_beta
    
    # 从刚刚创建的容器中复制默认的配置文件到当前目录
    docker cp squid:/etc/squid/squid.conf .
    
    # 销毁刚才的容器
    docker rm -f squid
    
    # 创建一个空的passwd文件
    touch passwd
    
    # 重新创建一个容器,绑定passwd文件和刚才拷贝出来的默认配置文件
    docker run -d --name squid -e TZ=UTC -p 3128:3128 -v ~/docker-vols/squid/squid.conf:/etc/squid/squid.conf -v ~/docker-vols/squid/passwd:/usr/lib/squid/passwd ubuntu/squid:5.2-22.04_beta
    

进入容器(事先绑定配置文件的话就不需要进入容器了)

docker exec -it squid /bin/bash

后面的操作都要在容器内进行。

设置访问权限

方式1:简单设置所有人均可访问,无密码 (不推荐)

不推荐,很快你的代理服务器就会被别人扫描到然后就会进入那些卖代理的IP列表,不然你以为那么多代理IP哪里来的。不信过段时间你查看一下/var/log/squid/access.log

编辑配置文件

vi /etc/squid/squid.conf

找到 http_access allow localhost 这一行,删掉,或注释掉
接着往下找到 http_access deny all 这一行,删掉,或注释掉
添加一行 http_access allow all
改完后大概是这样的

# 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

# And finally deny all other access to this proxy
#http_access deny all
http_access allow all

方式2:指定用户密码登录(http basic认证)推荐

推荐此方式,比较安全

首先要生成一个密码文件,用到htpasswd,是apache服务自带的一个命令工具。
如果没有使用apache服务器,例如使用nginx等,可能手头没有这个命令行工具,可以使用在线版生成器
如图:
在线生成

生成后得到一串文本将这个文本复制到容器内的密码文件

/usr/lib/squid/passwd

中即可(文件不存在就创建一个,如下),一个密码文件可以设置多个用户,每行一个。

root@5cdce0c2c796:/# echo 'apple:$apr....' > /usr/lib/squid/passwd

如果宿主机已经安装了apache可在宿主机下用以下命令生成密码文件。passwd是文件名,myuser是用户名。

htpasswd -c passwd myuser

同样的,在宿主机生成密码文件以后cat查看文件内容并复制到容器内的密码文件/usr/lib/squid/passwd中。

密码文件准备好以后编辑配置文件启用密码认证

vi /etc/squid/squid.conf

找到 http_access allow localhost 这一行,删掉,或注释掉
接着往下找到 http_access deny all 这一行,删掉,或注释掉
添加一行 http_access allow auth_user

改完后大概是这样的

# 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

# And finally deny all other access to this proxy
#http_access deny all
http_access allow auth_user

继续找到auth_param basic部分的设置,默认是none,添加2行。
改完后大概是这样的

##auth_param basic program <uncomment and complete this line>
##auth_param basic children 5 startup=5 idle=1
##auth_param basic realm Squid proxy-caching web server
##auth_param basic credentialsttl 2 hours
#Default:
# none
auth_param basic program /usr/lib/squid/basic_ncsa_auth /usr/lib/squid/passwd
acl auth_user proxy_auth REQUIRED

注意,根据版本不同,/usr/lib/squid/basic_ncsa_auth可能会是/usr/lib/squid/ncsa_auth,自己检查一下。

访问权限(方式1或方式2)设置完毕后重启squid服务

/etc/init.d/squid restart

开放3128端口

常规操作不多说了。(用docker run生成容器时会自动开放-p指定的端口,但如果是云服务器还需要确认一下安全组的端口设置,比如腾讯云默认所有端口允许入站而阿里云则默认只允许一些常用端口入站)

利用代理

linux环境下临时用一下的话执行下面两句即可。

export http_proxy=http://user:pass@服务器地址:3128
export https_proxy=http://user:pass@服务器地址:3128

浏览器使用的话推荐chrome插件SwitchyOmega

经网友提示(感谢),最后可以用下面的方法验证是否成功:

export http_proxy=http://127.0.0.1:3128
curl http://example.com/#
Last modification:October 6, 2023
If you think my article is useful to you, please feel free to appreciate