想要仅为一个应用程序实现VPN

时间:2011-02-11 23:47:16

标签: c++ networking proxy network-protocols vpn

我正在寻找为我的软件添加对VPN的支持,

我知道PPTP和OpenVPN,两者进行系统范围绑定,安装TAP驱动程序,以便所有应用程序将其流量路由到那时。

我怎样才能为我的应用程序实现VPN支持?有没有图书馆,例子,提示或方法呢?

我的软件实际上是用C ++ / MFC制作的。使用标准CAsyncSocket。

3 个答案:

答案 0 :(得分:14)

传入连接转发到您的应用程序相对简单:

  • stunnel允许您通过SSL隧道将流量转发到特定端口。但是,它要求你在两端运行它。

  • 大多数体面的SSH客户端(例如OpenSSHPuTTY)也支持端口转发,其附加优势是任何远程SSH服务器通常都可以充当另一端隧道没有任何修改。

  • 您也可以使用OpenVPN和其他VPN解决方案,但这需要将特定的转发规则添加到远程服务器。

在不修改应用程序的情况下,转发传出连接更加棘手。正确的方法是实施SOCKS协议,最好是SOCKS5。或者,您可以使用外部应用程序(例如FreeCap)重定向应用程序中的任何连接。

执行此操作后,您可以将连接转发到任何SOCKS服务器。例如,大多数SSH客户端允许您use the SOCKS protocol通过远程服务器路由传出连接。

作为旁注,OpenVPN服务器不一定会成为您所有流量的默认网关。有些人会将这样的路由表条目推送到客户端,但可以更改它。在我自己的OpenVPN设置中,我只使用VPN来访问专用网络,而不是通过它来路由所有内容。

如果您可以强制应用程序将所有传出套接字绑定到一个或多个特定端口,则可以使用系统上的IP过滤规则来路由来自这些端口的任何连接。

编辑:

隧道化UDP数据包有点困难。通常,您需要在远程服务器和本地客户端上使用代理进程,该进程将通过持久TCP连接隧道传入和传出连接。

您最好的选择是在您的应用程序中实现完整的SOCKS5客户端,包括UDP数据包的UDP-ASSOCIATE命令。然后,您将不得不找到支持隧道的SOCKS5代理。

我偶尔会使用Delegate,这似乎是代理人的瑞士口袋刀。据我所知,它在SOCKS5实现中支持UDP-ASSOCIATE命令,它还支持通过TCP连接连接两个Delegate进程。它也适用于Linux和Windows。我不记得它是否也可以加密该TCP连接,但如果需要,你可以随时通过stunnel或SSH隧道连接。

但是,如果您在远程VPN服务器上拥有系统管理员权限,则可以进行更简单的设置:

  • 让您的P2P应用程序将其传出的UDP套接字绑定到客户端VPN接口。您需要为该接口设置辅助默认路由。这样,应用程序的传出数据包将通过远程服务器。

  • 让远程服务器通过VPN连接将传入的UDP数据包转发回特定端口。

这应该是一个更简单的设置,但如果您真的关心匿名,您可能会对确保您的P2P应用程序不会泄漏DNS或其他可以跟踪的请求感兴趣。

答案 1 :(得分:0)

在您的应用中添加SSH连接或使用SSL。您必须使用协议/服务而不是VPN技术。祝你好运!

答案 2 :(得分:-1)

我认为您只需要SSL:http://www.openssl.org/

OpenVPN基于SSL - 但它是一个完整的VPN。

问题是你需要什么?如果您需要加密(应用程序专用连接) - 而不是vpn(虚拟专用网络)请转到ssl。

提示可以在这里找到:

Adding SSL support to existing TCP & UDP code?

http://sctp.fh-muenster.de/dtls-samples.html

http://fixunix.com/openssl/152877-ssl-udp-traffic.html