我想将请求转发192.168.99.100:80
到127.0.0.1:8000
。这就是我在linux中使用的方法iptables
:
iptables -t nat -A OUTPUT -p tcp --dport 80 -d 192.168.99.100 -j DNAT --to-destination 127.0.0.1:8000
我如何在 MacOS X 中做同样的事情?我尝试了一些ipfw
命令组合,但没有取得多大成功:
ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80
(对我来说,成功是将浏览器指向http://192.168.99.100
并从我运行的开发服务器上获得响应localhost:8000
)
所以我找到了一种方法来做到这一点。我不确定这是否是首选方式,但它有效!在你最喜欢的外壳上:
(别名 to
lo0
似乎是缺失的部分)如果您希望(假)域指向这个新别名,请确保 /etc/hosts 包含以下行:
我能够使用Mac 10.10.2 上的
ifconfig
and命令来完成这项工作。pfctl
通过以下方法,我成功地映射127.0.0.1:3000
到mydomain.com
我的机器上的本地。在命令行中输入以下两个命令以将连接转发
127.0.0.1:3000
到10.0.0.1
:然后编辑您的
/etc/hosts
or/private/etc/hosts
文件并添加以下行以将您的域映射到10.0.0.1
.保存主机文件后,刷新本地 DNS:
现在
mydomain.com
在浏览器中打开,您将看到托管在您的本地主机端口(即127.0.0.1:3000
)上的服务器。基本上,此过程将一个映射<ip>:<port>
到一个新的<ip>
,以便您可以映射该 IP 的主机。我最近也不得不做类似的事情,并且在搜索中找到了这个答案。不幸的是,Nafe 使用的答案
ipfw
现在在 OSX 中已被弃用且不可用;Kevin Leary 的回答确实有点骇人听闻。所以我不得不做一些更好(更干净)的东西,并决定在这里分享给后代。该答案主要基于此要点中提到的方法。正如 OP 所提到的,将浏览器指向 192.168.99.100 应该会从 localhost:8000 的服务器获得响应。添加别名
ifconfig
并不是真正必要的,pfctl
单独使用就足够了:要实现这一点,需要修改pf.conf
文件。/etc/pf.conf
首先,我们(使用 sudo)在以下位置创建一个新的锚文件(我们称之为
redirection
):/etc/pf.anchors/redirection
. 这基本上是一个常规文本文件,包含以下行(就像 Kevin Leary 的回答一样)rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000
:. 创建新的锚文件后,需要在pf.conf
文件中引用它。pf.conf
使用 sudo打开文件并rdr-anchor "redirection"
在最后一个 rdr-anchor 行(即rdr-anchor "com.apple/*"
)之后添加load anchor "redirection" from "/etc/pf.anchors/redirection"
并在末尾添加。最终,这就是 pf.conf 文件的样子:
差不多就是这样。只需
pfctl
通过sudo pfctl -d
先禁用它然后sudo pfctl -fe /etc/pf.conf
再次启动它来重新启动。现在,如果您需要在每次重新启动后自动执行此操作,则需要完成另一项工作:
pfctl
需要更新启动守护进程(引用的 gist 提到 pf 在启动时自动启用,但这似乎不是查看代码的案例)。打开(使用 sudo)System/Library/LaunchDaemons/com.apple.pfctl.plist
并查找以下内容:并添加该行
<string>-e</string>
以最终使其成为这样:那应该这样做。
警告:Apple 不再允许像那样更改启动恶魔文件(不允许使用 sudo、chmod 或其他任何东西)。唯一的方法是修改系统完整性保护设置:启动到恢复模式并启动终端。用 来检查 SIP 状态
csrutil status
,一般应该是启用的。禁用它csrutil disable
并在正常模式下重新启动,然后如上所述对 plist 文件进行更改。完成后,返回恢复模式并通过发出csrutil enable
.说明:可以通过发出已经是 localhost lo0 的(默认)别名的
ifconfig
命令来检查127.0.0.1
- 这一事实被用来避免必须为 localhost 添加额外的别名并简单地使用pf.conf
文件中的默认地址。更新:不幸的是,似乎在启动时加载文件不起作用。我仍在努力寻求帮助以对其进行排序。在那之前,
sudo pfctl -f /etc/pf.conf
在启动后运行就可以了。这对我来说效果很好:
将以下行添加到启动文件中,如下所述:http: //xeiam.com/port-forwarding-80-to-8080-using-ipfw-on-mac-os-x/
add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in
从 10.5 开始,OS X 带有一个新的、面向应用程序的防火墙,而不是
ipfw
. 但是 ipfw 仍然安装。如果您对其语法有疑问,请查看图形前端,例如WaterRoof
或Flying Buttress
。HTH,佩拉
规则的顺序很重要,请确保在您的允许规则之前没有“全部拒绝”,或者类似的东西。
您的命令似乎缺少规则编号;尝试:
(如果您不是以 root 身份运行,则必须在它前面加上 sudo)。要检查的另一件事是启用了防火墙:
如果它返回值为 0(关闭),请使用以下命令打开它:
...然后安排它在计算机重新启动时重新启用。执行此操作的“正确”方法可能是创建一个启动项(Lingon使这相当容易)。或者只使用 PEra 提到的 GUI 工具之一,让它处理细节。