vpn 客户端线路选择问题

158 views
Skip to first unread message

王冠

unread,
May 17, 2016, 1:06:09 PM5/17/16
to USTC_LUG
我有一台机器,上面运行了 openvpn 服务和 nginx 服务。现在希望外网的设备在连接上 vpn 的时候能访问 nginx 没有连接上 vpn 的时候不能访问 nginx。不知道该怎么设置才好,现在的情况是由于是同一台机器上运行的两个服务,所以就算外网的设备连接上了 vpn 但是它访问 nginx 的时候不会走 vpn 通道,而是采用直接连接的方式。

Yifan Gao

unread,
May 17, 2016, 2:13:29 PM5/17/16
to ustc...@googlegroups.com
可以借助iptables实现,也可以用nginx的IP白名单实现....方法很多

说一种比较简单的:

假设openvpn中有如下配置:
```
server 10.8.0.0 255.255.255.0
topology subnet
```
那么,OpenVPN网卡将绑定一个10.8.0.1的IP地址。

此时只需要让nginx监听10.8.0.1的对应端口即可,如:

```
server {
listen 10.8.0.1:80;
…..
}
```

这样一来,由于10.8.0.1是VPN内网地址,OpenVPN服务器即便不向客户端推送默认路由,客户端也会通过VPN访问nginx。且外网用户没有到10.8.0.1的路由,自然不能访问nginx。


On May 18, 2016, at 1:06 AM, 王冠 <wgwg1...@gmail.com> wrote:

我有一台机器,上面运行了 openvpn 服务和 nginx 服务。现在希望外网的设备在连接上 vpn 的时候能访问 nginx 没有连接上 vpn 的时候不能访问 nginx。不知道该怎么设置才好,现在的情况是由于是同一台机器上运行的两个服务,所以就算外网的设备连接上了 vpn 但是它访问 nginx 的时候不会走 vpn 通道,而是采用直接连接的方式。

--
来自USTC LUG
请使用gmail订阅,不要灌水。
更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en
---
You received this message because you are subscribed to the Google Groups "USTC_LUG" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ustc_lug+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

王冠

unread,
May 17, 2016, 11:41:26 PM5/17/16
to USTC_LUG
感觉像是我没有说清楚,具体的情况是这样的,nginx 本身是对公网服务的,但是网站的后台我在nginx 上设置的是只能通过内网 ip 访问。
location /wp-admin {
       allow 10.0.0.0/8;
       allow 192.168.0.0/16;
       deny all;
       proxy_pass http://server-ip$request_uri;
       proxy_set_header Accept-Encoding "";
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-Proto https;
       }
在 2016年5月18日星期三 UTC+8上午2:13:29,Yifan Gao写道:

Zhang Cheng

unread,
May 17, 2016, 11:43:41 PM5/17/16
to USTC LUG

2016-05-18 11:41 GMT+08:00 王冠 <wgwg1...@gmail.com>:
感觉像是我没有说清楚,具体的情况是这样的,nginx 本身是对公网服务的,但是网站的后台我在nginx 上设置的是只能通过内网 ip 访问。
location /wp-admin {
       allow 10.0.0.0/8;
       allow 192.168.0.0/16;
       deny all;
       proxy_pass http://server-ip$request_uri;
       proxy_set_header Accept-Encoding "";
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-Proto https;
       }

​网站后台用一个不同的域名访问,这个域名指向VPN内网IP。​



--
Cheng,
Best Regards

Yifan Gao(高一凡)

unread,
May 18, 2016, 1:27:21 AM5/18/16
to ustc...@googlegroups.com
能贴一下iptables-save的结果吗?

Zhang Cheng

unread,
May 18, 2016, 1:45:18 AM5/18/16
to USTC LUG

2016-05-18 13:27 GMT+08:00 Yifan Gao(高一凡) <i...@yfgao.com>:
能贴一下iptables-save的结果吗?

​他的问题我想是这样的,假设他的域名是 www.example.com,他希望的效果是:
* http://www.example.com/admin/ 只能拨通VPN之后访问
* http://www.example.com/* 公网可以访问

因为 www.example.com 解析出的是同一个IP,所以nginx无法判断客户端是否拨了VPN。​



--
Cheng,
Best Regards

王冠

unread,
May 18, 2016, 3:40:41 AM5/18/16
to USTC_LUG
对啊,不就是这样子的么?就是不知道还能怎么解决,除了在DNS上面加一个内网地址!

Bojie Li

unread,
May 18, 2016, 5:10:01 AM5/18/16
to USTC_LUG
如果你的 VPN 是全局 VPN,也就是连上 VPN 之后到所有 IP 的流量都走 VPN,VPN 服务器上做 SNAT 转发,那么不修改 DNS 也是可以解决的。
第一种方法,nginx 服务器上检查源 IP 为 VPN 服务器的公网 IP。
第二种方法,VPN 服务器上增加 iptables DNAT 规则,把发往 www.example.com 公网 IP 的数据包 DNAT 到内网 IP,nginx 服务器上检查源 IP 为内网 IP 段。

如果你的 VPN 连接上之后只对内网流量走 VPN,那就只能修改 DNS 了。这种情况下,最简单的方法是用另一个域名作为管理地址(例如 admin.example.com),以免与主域名的 DNS 混淆。如果你能够保证连上 VPN 之后使用内网自建的 DNS 服务器,当然也可以在内网自建 DNS 上对该域名返回内网 IP,这也是大多数家庭网关的做法。

On Wed, May 18, 2016 at 3:40 PM, 王冠 <wgwg1...@gmail.com> wrote:
对啊,不就是这样子的么?就是不知道还能怎么解决,除了在DNS上面加一个内网地址!

Zhang Cheng

unread,
May 18, 2016, 5:17:42 AM5/18/16
to USTC LUG

2016-05-18 17:10 GMT+08:00 Bojie Li <boj...@gmail.com>:
如果你的 VPN 是全局 VPN,也就是连上 VPN 之后到所有 IP 的流量都走 VPN,VPN 服务器上做 SNAT 转发,那么不修改 DNS 也是可以解决的。
第一种方法,nginx 服务器上检查源 IP 为 VPN 服务器的公网 IP。
第二种方法,VPN 服务器上增加 iptables DNAT 规则,把发往 www.example.com 公网 IP 的数据包 DNAT 到内网 IP,nginx 服务器上检查源 IP 为内网 IP 段。

如果你的 VPN 连接上之后只对内网流量走 VPN,那就只能修改 DNS 了。这种情况下,最简单的方法是用另一个域名作为管理地址(例如 admin.example.com),以免与主域名的 DNS 混淆。如果你能够保证连上 VPN 之后使用内网自建的 DNS 服务器,当然也可以在内网自建 DNS 上对该域名返回内网 IP,这也是大多数家庭网关的做法。

​他的情况比较麻烦,vpn和nginx是同一台机器,​即使VPN修改全局的路由,到这台机器的公网地址也不会从VPN走。



--
Cheng,
Best Regards

Bojie Li

unread,
May 18, 2016, 5:19:55 AM5/18/16
to USTC_LUG
抱歉,我没看清第一封邮件……既然 VPN 服务器和 nginx 服务器在一台机器上,共享一个公网 IP,你可以在 VPN 服务器里面写一个 post connection hook,VPN 连接建立完成后,把 VPN 客户端的公网 IP 加入 nginx 配置文件的 “allow” 选项,然后 reload nginx。VPN 连接断开的时候,再修改配置文件,移除这个 IP。

OpenVPN 里面 "script-security 2", "up /path/to/add-allow", "down /path/to/remove-allow" 就能做这个.

2016-05-18 17:10 GMT+08:00 Bojie Li <boj...@gmail.com>:

Bojie Li

unread,
Jun 19, 2016, 4:46:57 AM6/19/16
to USTC_LUG
今天看 TK 教主发现的 BadTunnel 漏洞 http://www.darkreading.com/vulnerabilities---threats/windows-badtunnel-attack-hijacks-network-traffic/d/d-id/1325875
知道了有 WPAD 这样一个神奇的东西,Chrome,Firefox,IE 这些主流浏览器都支持。

WPAD 全称 Web Proxy Auto-Discovery Protocol,用于自动配置 proxy.pac 代理配置脚本。具体来说,DHCP 服务器在分配 IP 地址的时候可以附加一个 auto-proxy-config 选项(类似 PXE 的 next-server),包含代理配置脚本(PAC 文件)的 HTTP URL。此外,浏览器还会通过 DNS 查询 wpad 这个主机名,如果解析出来了,就会下载 http://wpad/wpad.dat 作为 PAC 文件。对于 Windows 系统来说,如果 DNS 查不到,还会用 NetBIOS 协议去查 wpad 这个主机名。PAC 文件是一个 JavaScript 脚本,每访问一个 URL 的时候都会调用这个脚本,脚本返回是否需要 HTTP 代理,以及代理服务器的地址。

这个 WPAD 机制真的很强大,VPN 服务器在 DHCP 分配地址的时候可以返回 auto-proxy-config 选项。如果 DNS 服务器也在 VPN 虚拟网络范围内,可以同时在 DNS 上返回 wpad 的 A 记录。题主的问题,可以在 PAC 文件里把这个需要特殊处理的域名设置 HTTP 代理到 VPN 虚拟网络范围内。由于是浏览器执行 PAC 脚本,脚本看到的是完整的 URL,完全不用在意 DNS 把这个域名解析到什么 IP 了。只要用户没有自己私设 PAC 文件(很多科学上网工具使用 PAC 的方式做白名单),就可以实现很强大的代理(或者说劫持)功能。其他需要在 VPN 或者局域网范围内实施一些网络代理策略,又没有能力劫持所有 HTTP 流量的,WPAD 感觉是个不错的方案。
Reply all
Reply to author
Forward
0 new messages