我的家用电脑通过 OpenVPN 连接互联网。但是,我希望能够通过 ssh 从外部连接到我的家用电脑。ssh 已设置并正常工作,但当我连接到 vpn 时,只能从我的家庭网络内部访问 ssh。
我认为问题出在路由器将传入的 ssh 连接转发到我的 mac,但随后我的 mac 通过 vpn 回复,因此外部连接超时。我已经为其他几个事情设置了 pf,但我不知道如何使用 pf 让 ssh 回复绕过 vpn。我遇到过使用 ip 表、路由表和规则的其他解决方案,但我不知道如何在 mavericks 上进行设置。
我已经搜索这个问题一段时间了,但还没有找到可行的解决方案。如能得到任何帮助我将不胜感激!
更新:我将添加(部分)我当前的 pf.conf 以便更清晰,并添加规则,感谢 MariusMatutiae
#
# Macros
#
vpn_if = "tun0"
lan_if = "en0"
lan_gw = "x.x.x.x"
vpn_gw = "y.y.y.y"
#
# Ruleset
#
pass out on $lan_if route-to ($vpn_if $vpn_gw) from $vpn_if
pass out on $vpn_if route-to ($lan_if $lan_gw) from $lan_if
更新 #2:下面是我尝试过的一些规则(但没有成功)
# Nat to make replies seem to come from my external ip address
nat on $lan_if -> $ext_ip
# Redirect incoming requests on the lan interface back to the lan interface
rdr pass on $lan_if from ! $lan to any -> ($lan_if)
# Make pf reply to lan interface
pass in quick on $lan_if reply-to ($lan_if $lan_gw)
我真的希望有人能帮助我!
答案1
您的诊断是正确的:初始联系是通过您的家庭路由器,通过 OpenVPN 进行回复,您的计算机出于明显的安全原因将其丢弃。
您所要求的就是所谓的Policy-based-
路由Source-based-
。基本上,这意味着有两个(或更多)不同的路由表,并根据一些预定义的规则在它们之间切换。它存在于 Linux 中,并且由于 PF 而存在于 FreeBSD/OpenBSD 中,参见此维基百科文章. 但是由于 PF 在 Mac 上存在(请参阅此处了解如何设置的说明), 我以为我可以告诉你如何在 PF 中做到这一点,尽管严格来说,我只在 OpenBSD 中做到这一点(当然还有 Linux)。
基本上,上面引用的参考资料告诉您,在放置 PF 规则时有两种选择。无论您选择哪种,请将这些规则添加到文件中:
ext_if1 = "ether"
ext_if2 = "tun"
ext_gw1 = "192.168.1.100"
ext_gw2 = "10.0.0.3"
pass out on $ext_if1 from $ext_if2 route-to ($ext_if2 $ext_gw2)
pass out on $ext_if2 from $ext_if1 route-to ($ext_if1 $ext_gw1)
这里的“*ext_if1”是你通过路由器建立的以太网连接,192.168.1.100它的 IP 地址,而外部接口2是你的虚拟接口(tun 或 tap,无论什么),带有 IP 地址10.0.0.3。您应该根据需要替换适当的地址。
顺便说一句,这是直接从 PF 用户手册中摘录的,这里,除非我简化以适应您的(更简单的)要求。