Passless¶
简介¶
Passless 是一套用于保护服务器私有服务的堡垒机建构工具,基于 Yingbo Gu 的 Shadowproxy 项目实现,由一个 Slowdown 服务器插件和一个客户端组成。
以我们日常一般都会用到的 ssh 服务为例,如果服务器上恰好安装了 Slowdown 服务器在 提供 WEB 服务,那么我们就可以通过 Passless 的服务器插件,让 Slowdown 服务器提供 额外的堡垒机服务。通过(在配置文件或 iptables 中)禁止所有非本机 IP 对 ssh 服务的 连接,让用户只能透过本机上的 Slowdown 堡垒机提供的可靠传输通道来使用 ssh 服务。 这就是 Passless 的工作原理。
安装¶
Passless 已经发布于 Python 软件目录 (PyPI) ,可以使用 pip 命令以如下方式安装:
$ pip install -U passless
也可以从项目的代码仓库 Git repository 中将项目取回本地进行安装:
$ git clone https://github.com/wilhelmshen/passless
$ cd passless
$ pip install .
或:
$ pip install git+https://github.com/wilhelmshen/passless
服务器端¶
创建服务器¶
首先需要创建一个 Slowdown 服务器。
$ virtualenv --python=/usr/bin/python3 myserver
$ myserver/bin/pip3 install passless
$ myserver/bin/slowdown --init
Initialize a project in /PATH/TO/myserver? [Y/n]: Y
Creating myserver/bin ... exists
Creating myserver/etc ... exists
Creating myserver/var ... done
Creating myserver/pkgs ... done
Creating myserver/var/log ... done
Creating myserver/bin/slowdown ... exists
Creating myserver/etc/slowdown.conf ... done
DONE! Completed all initialization steps.
配置¶
接下来编辑服务器的配置文件。配置文件 slowdown.conf
位于服务器根目录的 etc
文件夹下。配置文件参考如下:
# 基于正则表达式的 URL 路由设置
<routers>
<router ALL>
# 定义一个用于匹配 HOST 的正则表达式
# 正则表达式中的 "组" 名称需要大写
#
pattern ^(?P<EXAMPLE>example\.com)$$
<host EXAMPLE>
# 定义一个用于匹配 PATH_INFO (路径) 的正则表达式
# 正则表达式中的 "组" 名称需要大写
#
pattern ^/passless(?P<PASSLESS>/.*)$$
# 在该主机和路径下,启用 passless 来响应请求
<path PASSLESS>
handler passless
# 加密算法与通讯密码
cipher aes-128-cfb
password PASSWORD
# The forwarding server (可选)
#
#via passless://CIPHER:PASSWD@BRIDGE.SERVER/HOST/PATH/
# Ad block list (可选)
#
#adblk /PATH/TO/AD/BLOCK.conf
# If the direct connection fails, use the forwarding
# server instead. The default is "no".
#
#auto_switch no
# Deny access to the local ip, the default is "no"
# If you want a Bastion Host for local services, this
# option must be setted to "no".
#
#global_only no
# 访问日志与调试日志 (可选)
#accesslog $LOGS/access-%Y%m.log
#errorlog $LOGS/error-%Y%m.log
</path>
</host>
# 其他路由设置 ..
#
#<host HOSTNAME>...</host>
</router>
</routers>
# 服务器绑定设置
<servers>
<http MY_HTTP_SERVER>
address 0.0.0.0:8080
router ALL
</http>
</servers>
启动服务器:
myserver/bin/slowdown -vv
2020-09-14 17:45:49 INFO slowdown/{__version__}
2020-09-14 17:45:49 INFO Serving HTTP on 0.0.0.0 port 8080 ...
在上述这个例子中,Passless 服务在
pass://aes-128-cfb:PASSWORD@example.com:80/example.com/passless/
这个位置提供服务。
客户端¶
passless 命令可启动(用于连接到上述服务器端的)支持 socks5 和 http 协议的 本地服务器,供本地客户端使用。
usage: bin/passless [-h] [-u USER] [-v | -vv | -q] SERVERS
例子:
$ sudo bin/passless -vv -u nobody "socks://127.0.0.1:1080/?via=passless://aes-128-cfb:PASSWORD@example.com:8080/example.com:8080/passless/&autoswitch=no&globalonly=no" "http://127.0.0.1:8118/?via=passless://aes-128-cfb:PASSWORD@example.com:8080/example.com:8080/passless/&adblk=my_ad_block.conf"
$ bin/passless "127.0.0.1:1080?via=aes-128-cfb:PASSWORD@example.com/example.com/passless/"
通过这个本地 socks/http 服务器,你就可以把远程的安装了 Passless 插件的 Slowdown 服务器,作为堡垒机来访问“该服务器本机”或“已授权该服务器访问的其他服务器”上的 受保护的私有服务了。
注解
默认的 scheme 是 socks://
,默认的 via scheme 是 passless://
.
proxychains¶
该脚本基于 Adam Hamsik 的 proxychains 项目实现,能够自动地启动一个连接到指定的 堡垒机 的临时服务器,然后对网络传输进行转发,一如原版的 proxychains 。
Example:
$ bin/proxychains "pass://aes-128-cfb:PASSWORD@example.com:8080/example.com:8080/passles/&autoswitch=no" ssh user@example.com
$ bin/proxychains "aes-128-cfb:PASSWORD@example.com/example.com/passles/" bash
Detect that you have entered bash in proxy mode, use "exit" to leave later.
$ exit
exit
注解
socks 的默认端口是 1080
passless 的默认端口是 80
.
Ad block¶
参考上面的例子,你可以为 Passless 服务器或客户端指定一个 通过/阻止 列表,来进行连接 限制。列表文件的格式非常简单:
domain1 REJECT
domain2 REJECT
...
domain1 PROXY
domain2 PROXY
...
例子:
com.baidu.adscdn REJECT
com.my-server PROXY