我有一台运行 PPTP 的服务器,该服务器应该运行一个只能通过 VPN 访问的 httpd(nginx)。我还运行了其他几个 httpd,它们不应该在 VPN 上运行。
路由表
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 x.x.x.x 0.0.0.0 UG 0 0 0 bond0
x.x.x.x x.x.x.x 255.255.255.255 UGH 0 0 0 bond0
x.x.x.x 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
x.x.x.x 0.0.0.0 255.255.255.248 U 0 0 0 bond0
x.x.x.x 0.0.0.0 255.255.0.0 U 1008 0 0 bond0
当我 ping mydomain.com 时(这应该与 VPN 兼容)
ping mydomain.com
PING mydomain.com (x.x.x.x) 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-x.x.x.x.dynamic.provider.com > anon-60-160.vpn.ipredator.se: ICMP echo request, id 4652, seq 8, length 64
答案1
您也许可以将特定的 nginx 实例配置为仅在 PPTP 接口上监听。
http_core 模块的文档指定一个 listen 指令以允许 nginx 仅监听特定的地址和/或端口。
listen <IP of VPN>:<port>
在 nginx 实例上应该可以在 vpn 上工作
答案2
最简单的方法是 - 在专用端口上运行服务器并拒绝来自此端口的 ppp 以外的接口的请求:
iptables -A INPUT -i ! ppp+ -p tcp --dport <protected-port> -j REJECT
上述方法的主要缺点是 - 您的服务器仍然可能会意外打开。
如果您正在寻找稳定可靠的解决方案来保护专用服务器人员,那么我推荐以下方式:
选择任何免费的专用私人地址,例如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
如果不需要,可以选择禁用代理 arp :
net.ipv4.conf.default.proxy_arp=0
选择专用端口来运行你的 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 的路由。您可以避免这种情况,并使用您通常用于访问主机的任何 IP 地址通过 VPN 使您的 http 服务器可访问:
iptables -t nat -A PREROUTING -i ppp+ -p tcp --dport 8888 -d <normal_server_address> -j DNAT --to 10.255.255.1:8888