7 个版本 (稳定)

2.4.0 2023 年 5 月 8 日
2.3.0 2023 年 5 月 8 日
2.2.0 2020 年 9 月 7 日
2.1.0 2020 年 6 月 9 日
0.1.0 2020 年 4 月 10 日

#1355网络编程

Download history 305/week @ 2024-03-10 204/week @ 2024-03-17 298/week @ 2024-03-24 276/week @ 2024-03-31 159/week @ 2024-04-07 89/week @ 2024-04-14 15/week @ 2024-04-21 58/week @ 2024-04-28 249/week @ 2024-05-05 91/week @ 2024-05-12 51/week @ 2024-05-19 1/week @ 2024-05-26 22/week @ 2024-06-09 9/week @ 2024-06-16 22/week @ 2024-06-23

每月 53 次下载

自定义许可证

150KB
4K SLoC

门卫:用 Rust 编写的 SOCKS5 服务器。

Idein License

功能

认证方法

不支持任何认证方法。

客户端连接到服务器时,需要发送 X'00' (NO AUTHENTICATION REQUIRED) 作为方法选择消息。

命令

只支持 CONNECT 命令。

过滤器

门卫允许用户根据以下内容限制连接:

  • 目标地址
    • IP 地址(子网范围)
    • 域名(正则表达式匹配,通配符)
  • 端口号
  • 协议(目前仅支持 tcp)

用法

此包提供了一个库和一个使用此库的可执行文件。

您可以通过将 gatekeeper 添加到项目 Cargo.toml 中的依赖项来使用它。

[dependencies]
gatekeeper = "2.4.0"

可执行文件

您可以使用 cargo install 命令将门卫安装为可执行文件(gatekeeperd)。

$ cargo install gatekeeper
$ gatekeeperd
gatekeeperd
gatekeeper 2.4.0

如何使用

门卫安装完成后,您将能够运行程序。

$ gatekeeperd

您可以看到命令行选项。

$ gatekeeperd --help

过滤规则

默认情况下,门卫接受所有连接请求。但是,您可以通过提供 yaml 文件(如上所述)来过滤一些请求。此 yaml 文件遵循以下特殊格式。

格式

任何过滤规则 yaml 都由一系列 RuleEntries 组成。每个 RuleEntry 要么是 Allow,要么是 Deny

---
- Allow:
    ..
- Deny:
    ..
- Deny:
    ..
- Allow:
    ..
..

列表中规则顺序靠后的规则具有更高的优先级。然后,规则列表的开头被视为默认规则,规则应允许或拒绝所有连接。

- Allow:
    address: Any
    port: Any
    protocol: Any
..

- Deny:
    address: Any
    port: Any
    protocol: Any
..

所有 RuleEntry 有 3 个字段 addressportprotocol。这些字段的值可以是 AnySpecif。其中,Any 匹配任何值,而 Specif 匹配指定的值。

  • address

    # any address
    address: Any
    

    addressIpAddrDomain
    IpAddr 通过 addrprefix 指定。

    # 192.168.0.1/24
    address:
      Specif:
        IpAddr:
          addr: 192.168.0.1
          prefix: 24
    

    Domain 可以指定为 patternwildcard

    # {mail.,}google.{com,co.jp}
    address:
      Specif:
        Domain:
          # regexp pattern
          pattern: '\A(mail\.)?google.((com|co)\.jp)\z'
    
    # allow any Amazon API Gateway's REST API
    address:
      Specif:
        Domain:
          # converted to the regex pattern: \A[A-Za-z0-9-]{1,63}\.execute\-api\.[A-Za-z0-9-]{1,63}\.amazonaws\.com\z
          wildcard: '*.execute-api.*.amazonaws.com'
    
  • port

    # any port number
    port: Any
    
    # match only 8080
    port:
      Specif: 8080
    
  • protocol

    # any protocol
    protocol: Any
    
    # match only tcp
    protocol:
      Specif: Tcp
    

示例

  • 允许所有连接

    ---
    - Allow:
        address: Any
        port: Any
        protocol: Any
    
  • 只允许本地子网(192.168.0.1/16)的连接

    ---
    .. default deny ..
    - Allow:
        address:
          Specif:
            IpAddr:
              addr: 192.168.0.1
              prefix: 16
        port: Any
        protocol: Any
    
  • 阻止访问facebook.com和youtube.com

    ---
    .. default allow ..
    - Deny:
        address:
          Specif:
            Domain:
              pattern: '\A(www\.)?facebook\.com\z'
        port: Any
        protocol:
          Specif: Tcp
    - Deny:
        address:
          Specif:
            Domain:
              pattern: '\A(www\.)?youtube\.com\z'
        port: Any
        protocol:
          Specif: Tcp
    

集成测试

  1. 准备socks和http服务器
$ docker-compose build
$ docker-compose up -d
  1. 运行 ignored 测试
$ cargo test --verbose -- --nocapture --ignored

依赖项

~7–17MB
~220K SLoC