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/ 这个位置提供服务。

深入学习 Slowdown 服务器的使用,请访问 Slowdown 项目。

客户端

passless 命令可启动(用于连接到上述服务器端的)支持 socks5http 协议的 本地服务器,供本地客户端使用。

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