我有一台 Mac mini,我将其用作运行 XBMC 的媒体服务器,并将 NAS 中的媒体传输到我的立体声音响和电视(已使用 Spyder3Express 进行了颜色校准,很开心)。这台 Mac 运行 OSX 10.8.2,互联网连接通过 Tunnelblick 通过 OpenVPN 隧道传输,以保护一般隐私。我相信我的匿名 VPN 提供商将“redirect_gateway”推送到 OpenVPN/Tunnelblick,因为当它打开时,它会有效地将所有非 LAN 流量传输到出站和出站。但有一个不良副作用,那就是将盒子的服务器端口向外界开放,不受保护,并绕过我的防火墙路由器(Netgear SRX5308)。我已经在 VPN IP 上从 LAN 外部运行了 nmap,mini 上的服务器端口清晰可见且可连接。
mini 打开了以下端口:ssh/22、ARD/5900 和 8080+9090,用于 XBMC iOS 客户端 Constellation。
我还有一个 Synology NAS,除了通过 AFP 和 WebDAV 提供 LAN 文件服务外,它还为 WAN 提供 OpenVPN/1194 和 PPTP/1732 服务器。在 LAN 之外时,我通过 OpenVPN 从笔记本电脑连接到它,通过 PPTP 从 iPhone 连接到它。我只想通过 AFP/548 从 mini 连接到 NAS。
边界防火墙 (SRX5308) 运行良好,稳定,在从各种 VOD 服务流式传输时具有非常高的吞吐量。我的连接是 100/10,接近理论最大吞吐量。规则集如下
Inbound:
PPTP/1723 Allow always to 10.0.0.40 (NAS/VPN server)
from a restricted IP range matching the cell phone provider range
OpenVPN/1194 Allow always to 10.0.0.40 (NAS/VPN server) from any
Outbound: Default outbound policy: Allow Always
OpenVPN/1194 TCP Allow always from 10.0.0.30 (mini) to a.b.8.1-a.b.8.254 (VPN provider)
OpenVPN/1194 UDP Allow always to 10.0.0.30 (mini) to a.b.8.1-a.b.8.254 (VPN provider)
Block always from 10.0.0.30 (mini) to any
在 Mini 上,我禁用了 OSX 应用程序级防火墙,因为它会弹出不记得我每次选择的弹出窗口,这对媒体服务器来说很烦人。相反,我运行 Little Snitch,它可以在应用程序级别很好地控制传出连接。我已配置出色的 OSX 内置防火墙 pf(来自 BSD),如下所示
配置文件(苹果应用防火墙插件已移除)
### macro names for external interface.
eth_if = "en0"
vpn_if = "tap0"
### wifi_if = "en1"
### %usb_if = "en3"
ext_if = $eth_if
LAN="{10.0.0.0/24}"
### General housekeeping rules ###
### Drop all blocked packets silently
set block-policy drop
### all incoming traffic on external interface is normalized and fragmented
### packets are reassembled.
scrub in on $ext_if all fragment reassemble
scrub in on $vpn_if all fragment reassemble
scrub out all
### exercise antispoofing on the external interface, but add the local
### loopback interface as an exception, to prevent services utilizing the
### local loop from being blocked accidentally.
### set skip on lo0
antispoof for $ext_if inet
antispoof for $vpn_if inet
### spoofing protection for all interfaces
block in quick from urpf-failed
#############################
block all
### Access to the mini server over ssh/22 and remote desktop/5900 from LAN/en0 only
pass in on $eth_if proto tcp from $LAN to any port {22, 5900, 8080, 9090}
### Allow all udp and icmp also, necessary for Constellation. Could be tightened.
pass on $eth_if proto {udp, icmp} from $LAN to any
### Allow AFP to 10.0.0.40 (NAS)
pass out on $eth_if proto tcp from any to 10.0.0.40 port 548
### Allow OpenVPN tunnel setup over unprotected link (en0) only to VPN provider IPs
### and port ranges
pass on $eth_if proto tcp from any to a.b.8.0/24 port 1194:1201
### OpenVPN Tunnel rules. All traffic allowed out, only in to ports 4100-4110 (rtorrent)
### Outgoing pings ok
pass in on $vpn_if proto {tcp, udp} from any to any port 4100:4110
pass out on $vpn_if proto {tcp, udp, icmp} from any to any
那么我的目标是什么?上述设置能实现什么?(直到你告诉我其他的:)
1)对迷你/媒体服务器上上述端口进行完全 LAN 访问(包括通过我自己的 VPN 服务器)2)来自迷你/媒体服务器的所有互联网流量都是匿名的,并通过 VPN 进行隧道传输
3) 如果 mini 上的 OpenVPN/Tunnelblick 断开连接,则不会因为 pf 和路由器传出规则集而泄露任何信息。它甚至无法通过路由器进行 DNS 查找。
那么我有什么可隐瞒的呢?其实没什么,我只是一时兴起试图阻止通过 VPN 隧道进行端口扫描 :)
无论如何,这种设置运行完美,并且非常稳定。
问题终于出现了!
我想运行一个 minecraft 服务器,我将其安装在迷你服务器上的单独用户帐户 (user=mc) 上,以保持分区。我不希望通过匿名 VPN 隧道访问此服务器,因为通过该隧道进行的端口扫描和黑客攻击比通过我的常规 IP 进行的端口扫描和黑客攻击要多得多,而且我一般不信任 java。因此,我在迷你服务器上添加了以下 pf 规则:
### Allow Minecraft public through user mc
pass in on $eth_if proto {tcp,udp} from any to any port 24983 user mc
pass out on $eth_if proto {tcp, udp} from any to any user mc
And these additions on the border firewall:
Inbound: Allow always TCP/UDP from any to 10.0.0.30 (mini with mc server)
Outbound: Allow always TCP port 80 from 10.0.0.30 to any (needed for online account checkups)
这可以正常工作,但前提是 OpenVPN/Tunnelblick 隧道关闭。当隧道打开时,无法从 LAN 外部连接到 minecraft 服务器,而 LAN 内部的访问始终正常。其他一切都按预期运行。我相信 redirect_gateway 推送可能接近问题的根源,但我想保留该特定的 VPN 提供商,因为它具有出色的吞吐量、价格和服务。
解决方案?
我如何打开隧道外的 minecraft 服务器端口,以便它只能通过 en0 而不是 VPN 隧道使用?
我应该使用静态路由吗?但我不知道要连接哪些 WAN IP... 很困惑
您认为这种设置的安全性如何?您是否还有其他改进可以分享?
答案1
本文
——似乎回答了你的核心问题。它解释了你如何忽略来自Redirect_Gateway Push
您的 ISP。
忽略重定向网关
如果您以客户端身份运行 OpenVPN,而您使用的服务器使用推送“ redirect-gateway
”,则您的客户端会将所有互联网流量重定向到 VPN。有时客户端不希望这样,但他们无法更改服务器的配置。本页解释了如何覆盖重定向网关,这样即使服务器要求,客户端也不需要重定向互联网。
方法一:忽略
有两个选项可用于忽略服务器推送的路由:
--route-noexec
不要自动添加或删除路由。而是使用环境变量将路由传递给 --route-up 脚本。
--route-nopull
与 --client 或 一起使用时--pull
,接受服务器推送的选项,但路由和 dhcp 选项(如 DNS 服务器)除外。在客户端上使用时,此选项可有效禁止服务器向客户端的路由表添加路由,但请注意,此选项仍允许服务器设置客户端 TUN/TAP 接口的 TCP/IP 属性。
方法 2:覆盖
在这里,我们将简单地添加覆盖的路由--redirect-gateway
。这将与def1
标志的--redirect-gateway
工作方式非常相似。如果服务器使用标志或不def1
使用选项--redirect-gateway
(通过在连接时检查日志),情况可能会有所不同。请注意,这net_gateway
是 openvpn 的内部变量,不需要更改为任何内容。如果您不知道您的服务器是否使用def1
并且不想检查日志来弄清楚,只需假设他们确实使用def1
并使用这 4 条路由。无论如何,这都会起作用。
def1
0.0.0.0/1
-- 使用此标志通过使用和128.0.0.0/1
而不是 来覆盖默认网关0.0.0.0/0
。这样做的好处是可以覆盖但不会消除原始默认网关。如果服务器不使用,def1
请将以下选项添加到客户端配置中:
route 0.0.0.0 128.0.0.0 net_gateway
route 128.0.0.0 128.0.0.0 net_gateway
如果服务器确实使用def1
或者您不知道,请将以下选项添加到客户端配置中:
route 0.0.0.0 192.0.0.0 net_gateway
route 64.0.0.0 192.0.0.0 net_gateway
route 128.0.0.0 192.0.0.0 net_gateway
route 192.0.0.0 192.0.0.0 net_gateway