按国家限制网站访问

the*_*yuv 5 dns geolocation amazon-web-services amazon-route53

我正在使用AWS托管我的网站。

该网站位于2个ec2实例上,并带有一个负载均衡器(ELB)来平衡它们之间的流量。

目前,我正在使用DNS(Route 53)通过Route 53的地理位置路由来限制对网站的访问:http : //docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html#routing -政策地理

(地理位置限制仅是为了限制我的网站的初始发布。这不是出于安全原因。这意味着该限制只需要对一般公众有效)

这让我有些担心,因为我的负载均衡器仍然可以从任何地方访问。因此,我担心我的负载均衡器会被Google或其他索引编制索引,然后我所在地区以外的人将能够访问该网站。

是否有针对此的修复程序?我是否以错误的方式限制了位置访问?是否有办法在ELB的安全组中指定它仅接收来自我的DNS的入站流量(当然,那我还必须指定我的静态内容也允许来自边缘位置的入站流量,但这不是问题)?

注意:为安全组选择入站规则时,有一个选项,在“类型”下选择“ DNS(UDP)”或“ DNS(TCP)”。我尝试为我的ELB的两种DNS类型(和IP地址=“ anywhere”)添加两个规则,但这并不限制对ELB的访问只能通过我的DNS。

谢谢。

Mic*_*bot 7

CloudFront 中提供了简单的解决方案。两种解决方案,实际上:

CloudFront 可以使用其 GeoIP 数据库为您进行阻止...

当用户请求您的内容时,无论用户位于何处,CloudFront 通常都会提供请求的内容。如果您需要阻止特定国家/地区的用户访问您的内容,您可以使用 CloudFront 地理限制功能[...]

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/georestrictions.html

您可以将 CloudFront 配置为允许或拒绝哪些国家/地区。您还可以配置存储在 S3 中的静态页面,这些页面显示给被拒绝的用户。(您还可以为可能发生的其他 CloudFront 错误配置静态自定义错误页面,并将这些页面也存储在 S3 中,CloudFront 将在需要时获取它们)。

...或者...

CloudFront 可以使用CloudFront-Viewer-Country:标头将位置信息传递回您的服务器,您的应用程序代码可以根据该标头附带的内容进行阻止。传入的请求看起来像这样(为了清楚起见,一些标头被删除或删除):

GET / HTTP/1.1
Host: example.com
X-Amz-Cf-Id: 3fkkTxKhNxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==
Via: 1.1 cb76b079000000000000000000000000.cloudfront.net (CloudFront)
CloudFront-Viewer-Country: US
CloudFront-Forwarded-Proto: https
Accept-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)

CloudFront 会根据请求的页面和查看者的国家/地区以及任何其他列入白名单的标头的组合缓存响应,因此它会独立地正确缓存您拒绝的响应和允许的响应。

以下是有关如何启用CloudFront-Viewer-Country:标头的更多信息:

如果您希望 CloudFront 根据请求来自的国家/地区缓存不同版本的对象,请将 CloudFront 配置为将 CloudFront-Viewer-Country 标头转发到您的源。CloudFront 会自动将请求来自的 IP 地址转换为两个字母的国家/地区代码。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-location

或者,当然,您可以启用这两个功能,让 CloudFront 进行阻止,同时仍然让您的应用程序了解允许通过的位置的国家/地区代码。


但是,您如何解决负载均衡器仍然对外开放的问题呢?

CloudFront 最近也通过自定义源头解决了这个问题。这些是 CloudFront 随每个请求发送到您的源服务器的秘密自定义标头。

您可以识别由 CloudFront 转发到您的自定义源的请求。如果您想知道用户是否绕过 CloudFront[...]

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html

因此,假设您向 CloudFront 添加了一个自定义标头:

X-Yes-This-Request-Is-Legit: TE9MIHdoYXQgd2VyZSB5b3UgZXhwZWN0aW5nIHRvIHNlZT8=
Run Code Online (Sandbox Code Playgroud)

什么是线路噪音?没有什么,真的,只是一个只有您的服务器和 CloudFront 知道的虚构的秘密值。配置您的 Web 服务器,以便如果传入请求中不存在此标头和值,则拒绝访问——这是一个未通过 CloudFront 的请求。

不要使用上面的秘密,当然……你自己编造。这完全是任意的。


适用于任何GeoIP 限制策略的警告:它并不完美。CloudFront声称准确度为 99.8%


Rod*_*o M 1

实现地理IP限制最可靠的方法是使用地理位置数据库或服务API,并在应用程序级别实现。

例如,对于几乎任何语言的网站,在每个页面请求的开头添加测试,并将客户端 IP 与 geo IP 数据库或服务进行比较,并处理来自那里的响应都是非常简单的。

在应用程序级别,管理您接受/拒绝的国家/地区并根据需要记录这些事件比在网络级别更容易。

基于 IP 的地理位置数据通常是可靠的,并且该数据有很多来源。虽然您可能在很多事情上信任 AWS,但我确实认为有许多可靠的第三方来源提供地理 IP 数据,专注于这些数据。

  • freegeoip.net提供公共 HTTP API 来搜索 IP 地址的地理位置。每小时最多允许 10,000 个查询。
  • ip2location.com LITE是一个免费的 IP 地理定位数据库,供个人或商业用途。

如果您的应用程序使用数据库,那么这些地理数据库很容易在您的应用程序中导入和引用。