bra*_*tao 8 c++ vpn proxy networking network-protocols
我正在寻找为我的软件添加对VPN的支持,
我知道PPTP和OpenVPN,两者进行系统范围的绑定,安装TAP驱动程序,以便所有应用程序将其流量路由到那时.
我怎样才能为我的应用程序实现VPN支持?有没有图书馆,示例,提示或方法呢?
我的软件实际上是用C++/MFC制作的.使用标准CAsyncSocket.
thk*_*ala 14
转发到您的应用程序的传入连接相对容易:
stunnel允许您通过SSL隧道将流量转发到特定端口.但是,它要求你在两端运行它.
大多数不错的SSH客户端(如OpenSSH或PuTTY)也支持端口转发,其附加优势是任何远程SSH服务器通常都可以作为隧道的另一端而无需任何修改.
您也可以使用OpenVPN和其他VPN解决方案,但这需要将特定的转发规则添加到远程服务器.
但是,转发传出连接在不修改应用程序的情况下比较棘手.正确的方法是实现SOCKS协议,最好是SOCKS5.或者,您可以使用外部应用程序(如FreeCap)重定向应用程序中的任何连接.
执行此操作后,您可以将连接转发到任何SOCKS服务器.例如,大多数SSH客户端允许您使用SOCKS协议通过远程服务器路由传出连接.
作为旁注,OpenVPN服务器不一定成为您所有流量的默认网关.有些人会将这样的路由表条目推送到客户端,但可以更改它.在我自己的OpenVPN设置中,我只使用VPN来访问专用网络,而不是通过它来路由所有内容.
如果您可以强制应用程序将所有传出套接字绑定到一个或多个特定端口,则可以使用系统上的IP过滤规则来路由来自这些端口的任何连接.
编辑:
隧道化UDP数据包有点困难.通常,您需要在远程服务器和本地客户端上使用代理进程,该进程将通过持久TCP连接隧道传入和传出连接.
您最好的选择是应用程序中的完整SOCKS5客户端实现,包括UDP数据包的UDP-ASSOCIATE命令.然后,您将不得不找到支持隧道的SOCKS5代理.
我偶尔会使用代表,这似乎是代理的瑞士口袋刀.据我所知,它在SOCKS5实现中支持UDP-ASSOCIATE命令,它还支持通过TCP连接连接两个Delegate进程.它也适用于Linux和Windows.我不记得它是否也可以加密该TCP连接,但如果需要,您可以始终通过stunnel或SSH隧道连接.
但是,如果您在远程VPN服务器上拥有系统管理员权限,则可以进行更简单的设置:
让您的P2P应用程序将其传出的UDP套接字绑定到客户端VPN接口.您需要为该接口设置辅助默认路由.这样,应用程序的传出数据包将通过远程服务器.
让远程服务器通过VPN连接将传入的UDP数据包转发回特定端口.
这应该是一个更简单的设置,但如果你真的关心匿名,你可能会对确保你的P2P应用程序不泄漏DNS或其他可以跟踪的请求感兴趣.