移动应用程序参与客户服务器通信很常见。作为移动开发人员,您可以构建与您自己可信赖的服务器通信的应用程序。但是,在某些情况下,您需要与第三方服务器进行通信。在这种情况下,您可能不想公开移动客户端的IP地址。为了解决此问题,使用代理服务器似乎是一个明显的选择。因此,在本文中,我将向您展示您可以在系统中使用代理来改善隐私。而且,根据我的经验,移动工程师可能会发现一些事情有助于进一步浏览该主题。
代理101
代理服务器由于各种原因(例如内容过滤或缓存)非常有用,但其主要目的是提供隐私和安全性。尽管SSL和TLS已经在确保通信方面做得很好,但代理服务器可以添加额外的保护层。
在客户和服务器之间的典型HTTPS连接中,中间没有代理,使用传输层安全性(TLS)协议确保流量。当客户端将请求发送到服务器时,TLS协议确保在通过网络传输数据之前对数据进行加密。服务器收到加密数据后,它将使用仅服务器可以访问的私钥进行解密。
但是,即使流量已加密,服务器仍然可以看到客户端的IP地址,这可能会揭示有关客户端位置或网络配置的敏感信息。这是代理服务器或其他技术提供其他隐私和安全性的地方。
代理还是VPN?
当您要隐藏IP地址时,您有两个流行的选项:代理服务器和虚拟专用网络(VPN)。他们的工作方式:
- 代理服务器充当客户端和服务器之间的中介。这意味着它将请求从客户端转发到服务器,然后将服务器的响应返回给客户端。服务器看到代理服务器的IP地址而不是客户端的IP地址,该服务器提供了额外的隐私层。
- VPN在客户端和远程服务器之间建立了安全的,加密的连接。所有流量均通过远程服务器路由,远程服务器掩盖了客户端的IP地址并提供了附加的安全层。但是,设置VPN比使用代理服务器更复杂。它也可能与VPN代理冲突,阻止未通过VPN隧道路由的流量,需要其他资源。
要使用Network Extensions Framework设置VPN代理,您需要在Xcode项目中创建一个新的网络扩展目标并实施一些委托方法。您还需要使用代理服务器的详细信息来配置隧道提供商,例如其主机名和端口号。
代理的许多阴影
代理服务器的历史悠久。实际上,您可以与SMTP,Socks和FTP一起使用许多不同的协议。但是现在,让我们专注于http(s)。
有关HTTP与HTTPS代理的主要了解是,HTTPS使用SSL/TLS加密来确保数据安全。这意味着,当您使用HTTPS代理时,您的数据从离开设备到达服务器的那一刻就会加密,这使其更加安全。
另一方面,HTTP代理不会对您的数据进行加密,因此对于可能在周围偷窥的任何人来说都是可见的。尽管它们有助于缓存和过滤网络流量,但它们对于发送敏感信息并不是很好。因此,如果您正在在线购物或发送私人消息之类的事情,那么使用HTTPS代理绝对是一个好主意。
值得一提的是,代理有各种形状和大小,而不仅仅是协议。您是否知道即使HTTP也可以具有不同的类型?最常见的是向前和反向代理。向前的代理在客户端和服务器之间充当中间人,而反向代理充当服务器和Internet之间的中间人。
前锋代理
|
反向代理
|
确保分布良好的基础架构和保护客户匿名性至关重要。为了保持匿名,应隐藏大量客户的代理地址。在实践中,经常使用逆向逆转和前向态的组合。为简单起见,下面的示例只会使用一个前向代理。
http:连接人数据包
好吧,所以代理服务器如今非常受欢迎。实际上,HTTP协议仅适用于称为HTTP CONNECT的整个方法。此方法可帮助您通过不安全的网络(例如Internet)创建安全的隧道。当您使用HTTP Connect以连接到服务器时,您将HTTP连接请求发送到代理服务器,您只需要让代理服务器知道要到达的服务器的主机名和端口号。
然后,代理服务器建立了一个带有目标服务器的双向通信渠道,并在客户端和服务器之间传递数据,从而使客户端可以安全地与服务器通信。此方法通常用于建立客户端和服务器之间的SSL/TLS加密连接。它可以用于多种目的,例如绕过防火墙,建立安全的通信渠道并启用远程访问内部网络。
如果您是移动开发人员,则可能会一直使用Get,Post和Wister Plote的方法。但是您曾经使用过连接吗?让我们探索如何使URLSession使用它,或者您是否应该使用更硬的库。
所以检查一下,第一件事 - 您可以在会话配置中完全设置代理地址。没什么大不了的,只是想给你头。
// Create a session configuration object
let config = URLSessionConfiguration.default
// Create a proxy object with your desired host and port
let proxy = [kCFNetworkProxiesHTTPSEnable: true,
kCFNetworkProxiesHTTPSProxy: "your.https.proxy.host",
kCFNetworkProxiesHTTPSPort: 8080] as [String: Any]
// Set the proxy on the session configuration
config.connectionProxyDictionary = proxy
// Create an NSURLSession with the configuration
let session = URLSession(configuration: config)
了解引擎盖下发生的事情的一种方法是使用Wireshark或您喜欢的任何其他工具拦截流量。好的,只需通过本次会议向您最喜欢的端点发出get请求,我们很高兴。
因此,请做到这一点,TCP转储显示客户端实际上是在幕后为我们发送连接。很好!
设置Android同样容易,您仍然会得到相同的结果。
// Create a URL object for the destination server
val url = URL("https://www.example.com")
// Create a Proxy object with your desired host and port
val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("your.https.proxy.host", 8080))
// Open a connection to the URL with the proxy
val connection = url.openConnection(proxy) as HttpURLConnection
休斯顿,我们有一个问题(再次)
好吧,这一切都包裹了吗?还是还有更多?实际上,除了VPN之外,iOS/Android具有漂亮的功能,可让您使用系统级代理设置为特定的Wi-Fi网络。这主要由拥有自己的设备管理的大型公司使用。但是,这导致我们涉及更改系统代理配置的新问题:当您通过会话配置设置新的代理配置时,它会覆盖这些会话处理的任何请求的用户当前设置。
请注意,通过覆盖,我们仅表示会话级请求(即在应用程序会话期间提供的请求),而不是应用程序或设备级请求,这不会受到影响。
您可能决定覆盖默认设置,但这可能会带来以下后果:
- 没有连接性,因为ISP/网络可以要求所有流量通过代理。
- 用户丢失隐私,因为他们可能会使用代理以获得额外的隐私。
- 某些功能故障(例如,由于地理障碍而付款)。
好吧,假设我们要保留两个代理,对吗?不用担心,因为关于网络协议的酷事是您可以将它们彼此分层,从而使它们真正强大。做到这一点的一种方法是将一条隧道嵌套在另一条隧道内。例如,您可以通过系统代理打开一条连接隧道,然后将其嵌套在通过正向代理的第二个隧道中。
以下方式将以以下方式更新以下图表
因此,该图似乎更复杂,但实际上只是复制了两个代理的相同机制。唯一的问题是,默认的iOS/Android库不从开箱即用,因此我们需要进行一些额外的工作。为了解决这个问题,我们可以在iOS,子类NWConnection上使用Network.framework,然后手动处理Network.framework。
这么多代理,很少的时间
好吧,让我们总结本文,以免拖延。我们已经解决了如何在移动客户端上使用代理可以改善用户的安全性和隐私。我们还讨论了VPN和代理服务器之间的差异,并深入研究了两种最常见的代理类型:正向和反向代理。最后,我们查看了客户库库以及如何帮助代理及其局限性。
请密切关注下一篇文章,我们将尝试混合代理。我们将使用NWConnection,甚至可能进行一些字节杂耍。敬请期待!