您如何检测 VPN 或代理连接?

How do you detect a VPN or Proxy connection?

我想阻止所有使用 VPN 或代理服务器的连接。有没有办法检测到正在使用 VPN 或代理连接?如果没有,我是否可以检查使用 VPN 或代理的可能性?最后,有什么我可以查询或提示用户检查他们是否使用 VPN 或代理,以便如果有人通过,我可以尝试执行额外的验证?我不需要用户提供任何信息,例如位置、真实 IP 或类似信息。我只想完全禁止来自 VPN 或代理的连接。

编辑:我一直在想,我可能会 运行 进行测试,看看 VPN IP 的 ping 和客户端可检测到的延迟之间是否存在一致的差异,但这听起来很不可靠。

Edit2:代理服务器或 VPN 服务器打开的端口可能比标准家庭连接多得多,因此我可以使用打开的端口数来帮助衡量连接来自 VPN 的可能性 运行对连接的人进行端口扫描。

遗憾的是,没有合适的技术方法来获取您想要的信息。您可能会发明一些测试,但这些测试与现实的相关性非常低。因此,要么您无法捕捉到您想要的那些,要么就会有更多的误报。两者都不能被认为是有意义的。

从 Internet 服务器向后生成任何类型的流量以响应传入的客户端(端口扫描,甚至简单的 ping)通常是不受欢迎的。或者,在端口扫描的情况下,对您来说可能更糟,例如,当客户端位于中央企业防火墙后面时,最糟糕的是当客户端来自中央政府网络防火墙池后面时...

坦率地说,基于 IP 的禁令(或者实际上,针对不完全拥有其 public IP 地址的人的任何类型的限制:代理服务器、VPN、NAT 设备等)对于很长一段时间以来,随着世界许多地方的 IPv4 池逐渐枯竭,ISP 将越来越多的客户置于大型 NAT 池之后(这是我国本周的新闻,最大的 ISP,德国电信的子公司,已开始将私有 IPv4 地址作为一种标准业务方式分发给其客户,人们必须明确要求提供商获得 public IP 地址),因此这样做的意义越来越小。如果你想封禁客户端,你应该根据身份(账号)来封禁他们,而不是根据IP地址。

您可以下载已知代理 IP 地址列表并在本地查找以查看是否是 VPN、打开代理等。

市场上有几种商业产品。 IP2Proxy LITE 是免费的,您可以立即试用。

最简单的方法是使用 API 之类的外部服务来阻止 VPN 或代理用户。

MaxMind and GetIPIntel 都通过 API 提供,您可能想试一试。 GetIPIntel 提供免费 API 服务,因此我建议您先尝试一下。

对于OpenVPN,someone used unique MSS values to identify VPN connections但是设置很复杂,现在可能是"patched"。

您在编辑中提到的策略似乎不是一个好主意,因为您会 运行 出现许多误报。每当他们连接到您的服务时发送端口扫描将在您获得结果之前花费大量时间和资源。

  • 获取(以某种方式)代理服务器的 IP 列表。
  • 测量用户的往返 ping 时间。帮助在线 websocket 游戏。游戏可以在 50 毫秒以下的 ping 下玩,因此您可以通过消息 "Sorry, too large ping".
  • 断开与 ping 大约 100 毫秒或更长的用户的连接

是的,您可以使用 Shodan 检测 IP 是否属于 VPN/代理。以下 Python 代码显示了如何执行此操作:

import shodan

# Setup the API wrapper
api = shodan.Shodan('YOUR API KEY') # Free API key from https://account.shodan.io

# Lookup the list of services an IP runs
ipinfo = api.host(VISITOR_IP)

# Check whether the IP runs a VPN service by looking for the "vpn" tag
if 'tags' in ipinfo and 'vpn' in ipinfo['tags']:
    print('{} is connecting from a VPN'.format(VISITOR_IP))

您还可以查看端口列表以确定访问者从 HTTP 代理连接的可能性:

if 8080 in ipinfo['ports']:
    print('{} is running a web server on a common proxy port'.format(VISITOR_IP))

Tor 出口节点列表为 publicly available。您只需要 "exit nodes" 并且它以 CSV 格式提供。这应该是 100% 完整和准确的,因为它是直接从 Tor 目录生成的。

开放代理的免费列表可从 iblocklist.com. A free list that incorporates open proxies, Tor nodes and VPN endpoints from ip2location.com 获得。

后两个的覆盖范围和准确性很可能有限,尤其是在涉及 VPN 出口节点时 - 它们太多了。一些供应商采用另一种方法,将所有 "hosted subnets"(ISP 从中为其托管服务器分配其客户端 IP 的子网)视为某种 VPN 或代理,因为最终用户应从 "consumer" 个子网进行连接。

在 IPinfo,我们提供 privacy detection API,它会让您知道连接是来自 VPN、匿名代理、Tor 出口节点还是托管服务提供商(可用于隧道交通)。这是一个例子:

$ curl ipinfo.io/43.241.71.120/privacy?token=$TOKEN
{
    "vpn": true,
    "proxy": false,
    "tor": false,
    "hosting": true
}

如果您想阻止从 VPN 连接到您的站点,那么您可以发出 API 请求以获取此信息,如果它被检测为 VPN,则回复错误。在 PHP 中看起来像这样:

$ip = $_SERVER['REMOTE_ADDR'];
$url = "http://ipinfo.io/{$ip}/privacy?token={$IPINFO_API_TOKEN}";
$details = json_decode(file_get_contents($url));
// Just block VPNs
if($details->vpn) { 
    return echo "VPN Access Blocked!";
}

// Or we could block all the other types of private / anonymous connections...
if($details->vpn || $details->proxy || $details->tor || $details->hosting) { 
    return echo "Access Blocked!";
}