我有一个运行PPTP的服务器,应该运行一个只能通过VPN访问的httpd(nginx)。 我也运行一些其他的httpds,这不应该在VPN上工作。
路由表
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 xxxx 0.0.0.0 UG 0 0 0 bond0 xxxx xxxx 255.255.255.255 UGH 0 0 0 bond0 xxxx 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 xxxx 0.0.0.0 255.255.255.248 U 0 0 0 bond0 xxxx 0.0.0.0 255.255.0.0 U 1008 0 0 bond0
当我ping mydomain.com(这应该与VPN工作)
ping mydomain.com PING mydomain.com (xxxx) 56(84) bytes of data. ^C --- mydomain.com ping statistics --- 32 packets transmitted, 0 received, 100% packet loss, time 31248ms
但是我可以在tcpdump -vv -i ppp0中看到数据包
15:21:09.543764 IP (tos 0x0, ttl 52, id 37313, offset 0, flags [DF], proto ICMP (1), length 84) cable-xxxxdynamic.provider.com > anon-60-160.vpn.ipredator.se: ICMP echo request, id 4652, seq 8, length 64
你可能可以configuration那个特定的nginx实例来只监听PPTP接口。
http_core模块的文档指定了一个listen指令,允许nginx只监听某个地址和/或端口。
在nginx的实例上listen <IP of VPN>:<port>应该可以工作在vpn上
最简单的方法 – 在专用端口上运行服务器,拒绝来自ppp以外的接口的请求:
iptables -A INPUT -i ! ppp+ -p tcp --dport <protected-port> -j REJECT
上述方法的主要缺点 – 您的服务器可能仍然意外打开。
如果您正在为受保护的专用服务器人员寻找稳定可靠的解决scheme,那么我推荐以下方法:
select任何免费的专用私人地址,如10.255.255.1 。
使用此地址设置内部虚拟抽头接口。
# cat > ifcfg-tap0 DEVICE=tap0 TYPE=Tap IPADDR=10.255.255.1 NETMASK=255.255.255.255 ONBOOT=yes
如果不需要,可以在/etc/sysctl.conf禁用proxy-arp:
net.ipv4.conf.default.proxy_arp=0
select专用的端口来运行你的http服务器,比如说8888 。
将您的服务器绑定到专用IP /端口:
listen 10.255.255.1:8888
限制访问10.255.255.1(本地或仅限VPN):
-I INPUT -p ip -s 10.255.255.1 -j ACCEPT -I INPUT -i ! ppp+ -p ip -d 10.255.255.1 -j REJECT
主要工作已经完成。 所有绑定到10.255.255.1的应用程序只能在内部或使用VPN进行访问。
但是现在你需要关心在客户端路由到10.255.255.1。 您可以避免它,并使您的http服务器通过您通常用于访问主机的任何IP地址的VPN访问:
iptables -t nat -A PREROUTING -i ppp+ -p tcp --dport 8888 -d <normal_server_address> -j DNAT --to 10.255.255.1:8888