我正在为特定应用程序构建各种代理服务器。客户端连接到此服务器并指定代理服务器应连接到的主机。从那里,代理服务器连接到最终服务器并来回传递数据。
进行连接时,如何阻止我的代理服务器用户访问不应该访问的资源?例如,我不希望他们连接到localhost或我用于服务器管理的VPN。我可以做一些黑名单,但我想知道是否有更好的解决方案只允许特定网络接口上的传出连接。也许某种方式将TCP客户端绑定到特定接口,或者验证所选路由是否使用某个接口。
如果它匹配,我使用Node.js来构建这个代理服务器,并使用标准的net.connect()
方法来创建到远程服务器的TCP连接。
答案 0 :(得分:1)
对此的答案完全取决于什么样的"代理"你正在建设,目前还不清楚,或许改写一下?
如果您正在谈论SOCKS或HTTP代理,我担心这是不可能的,无法知道目标是否是vpn端点(至少来自您的代理服务& #39; s观点)。您的代理应用程序可用于过滤的唯一参考是在socks协商期间传递给您的服务器的IP地址或DNS名称,以及连接发起的源IP地址。但是你可以使用防火墙,但这并不是真正的代理相关的。
如果您正在构建某种防火墙/网络堆栈扩展/驱动程序,iptables /内核模块等,您自己将要拆除并重新建立连接并执行严重的数据包摆弄,您可以更好地控制事件,并且能够检查几乎每一层连接。但是,在这种情况下,您的问题可以广泛回答。
您可以使用哪些软件/工具/语言,以及您在谈论什么平台?
编辑:oops,错过了提到Node.js的段落,所以我假设您使用类似袜子的协议将连接转发到最终目的地,而您的代理应用程序无法查询更深层的网络层。如果没有关于协议如何工作的更多细节,您必须使用的只是来自已建立/将要建立的tcp连接的源IP,以及在协议握手中协商的目标IP / DNS。您可以使用它来让您的代理服务查询您的服务器或网络vpn / routing配置(ppp.conf / ldap / yellow pages / database / what you)以确定是否要限制资源。
根据评论中的信息进行了更新:
好的,我们可以将其分为3个部分:
为注册用户提供基于浏览器的shoutcast客户端的公共Web应用程序(我们可以将这两个相同的组件视为参数)
在公共互联网上的某个地方,这些用户可能会或可能不希望他们的客户与之接口的任意数量的不受管制的shoutcast服务器,我们可能会也可能不会意识到这些服务器的存在。
中间的代理服务接受来自网络客户端的连接,将流转发到这些服务器。
我认为保护这些组件的最佳方法是让webapp具有权威性(它可以更好地扩展,更容易实现,更易于管理,并且已经以某种形式或形式存在)。代理应默认删除任何和所有连接。只有当用户登录到webapp / shoutcast客户端时,它才会通知代理服务器可以连接哪些服务器,并且将根据某种令牌或用户/密码组合连接到哪些服务器。
当客户端连接到代理并显示其临时令牌(或其他标识方法)时,代理会在其内部哈希表中查找它以决定连接到哪里(或验证其允许连接到那里)。
您可以让管理员预先批准现有的shoutcast服务器列表供用户使用webapp进行选择,或者让用户将其自己添加到系统中,以便以编程方式或稍后手动验证。
至于防火墙,因为所有转发的连接都来自代理应用程序,所以只需删除源自代理的每个连接并通过某些网络接口(admin,lan,vpn,tun,tap等)也应该很容易)除了那些注定在互联网上的外国地址的人。
除了让您的webapp与代理通话之外,您甚至可以让它配置您的(或亚马逊或者说是谁)防火墙规则,以防止通过您的代理的任何和所有恶意流量(或至少使执行和审核策略更容易,因为任何可能的连接因此必须由有效和现有用户拥有)并且还要防止基本的拒绝服务攻击(webapp可以在云中托管,比你的旧代理服务更容易和更便宜)所以默认情况下防火墙和开放基于网络/用户活动的漏洞是一个可靠的游戏计划,包括规模,复杂性,性能和安全性。
一些额外的常识:
协议强制执行(您只想让您的应用程序协议通过),杀死任何不符合您的rfc /协议的连接。这也有助于破坏对易受攻击服务的攻击,并防止随机的其他协议通过。
建立一个可配置(平面文件/数据库)的站点/服务列表(ip +端口对),这些列表被视为列入白名单。
建立可配置的黑名单(管理网络,localhost等)
请注意您发回的诊断错误,或者您是否发回任何内容(请考虑使用您的代理服务通过查看代理的响应来探测/映射您的内部网络资源的攻击者)。 / p>
根本不考虑实现这个代理,除非你绝对必须,如果静态配置转发/路由就足够了,请改用它。转发(打开或关闭)是有原因的。
亲切的问候,