一直使用ocserv的原因之一就是它的安全性,它默认采用了全程加密,非常适合企业等对网络安全性要求高的应用场景。
ocserv默认使用的端口是443(可以在配置文件当中修改成别的端口,由之而来的问题是客户端连接时需要指名端口好),和一般的web服务器使用的加密传输端口一致。
假设资源紧张不得已需要在一台机器上部署nginx以及ocserv服务,又不想给用户的体验造成影响(不加端口好访问)是不是两者不可兼得呢?
ocserv官方给出了使用haproxy的SNI解决方案。
简单来说就是nginx和ocserv使用两个不通的端口号而443端口给haproxy使用。
例如,ocserv使用9443,Web服务器使用8443.我们还假设Web服务器响应www.example.com,而vpn服务器响应vpn.example.com。这样便将流量重定向到适当服务器进行响应了。
frontend www-https bind 0.0.0.0:443 mode tcp tcp-request inspect-delay 5s default_backend bk_ssl_default backend bk_ssl_default mode tcp acl vpn-app req_ssl_sni -i vpn.example.com acl web-app req_ssl_sni -i www.example.com use-server server-vpn if vpn-app use-server server-web if web-app use-server server-vpn if !vpn-app !web-app option ssl-hello-chk server server-vpn 127.0.0.1:4443 send-proxy-v2 server server-web 127.0.0.1:4444 check
最后,为了让ocserv获取有关传入会话的信息,我们在haproxy的配置中启用了代理协议(使用send-proxy-v2
选项)。这要求ocserv的配置包含以下内容:
listen-proxy-proto = true
原则上自然博客建议单台服务器仅运行主要程序模块为最佳,能避免共用端口还是尽量避免吧。