我想将请求从 转发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
)
答案1
我发现A这样做的方法。我不确定这是否是首选方法,但它有效!在您最喜欢的 shell 中:
sudo ifconfig lo0 10.0.0.1 alias
sudo ipfw add fwd 127.0.0.1,9090 tcp from me to 10.0.0.1 dst-port 80
(别名似乎lo0
是缺失的部分)
如果您希望(虚假)域名指向这个新别名,那么请确保 /etc/hosts 包含以下行:
10.0.0.1 www.your-domain.com
答案2
我能够在 Mac 10.10.2 上使用ifconfig
和pfctl
命令来实现这一点。使用以下方法,我成功地在我的计算机上本地127.0.0.1:3000
进行了映射。mydomain.com
在命令行中输入以下两个命令将连接转发127.0.0.1:3000
到10.0.0.1
:
sudo ifconfig lo0 10.0.0.1 alias
echo "rdr pass on lo0 inet proto tcp from any to 10.0.0.1 port 80 -> 127.0.0.1 port 3000" | sudo pfctl -ef -
然后编辑您的/etc/hosts
或/private/etc/hosts
文件并添加以下行以将您的域映射到10.0.0.1
。
10.0.0.1 mydomain.com
保存主机文件后刷新本地 DNS:
sudo discoveryutil udnsflushcaches
现在打开mydomain.com
浏览器,您将看到托管在本地主机端口上的服务器(即127.0.0.1:3000
)。基本上,此过程将一个映射<ip>:<port>
到一个新<ip>
,以便您可以映射该 IP 的主机。
答案3
我最近也不得不做类似的事情,在搜索中找到了这个答案。不幸的是,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
。使用 sudo 打开文件并在最后一行 rdr-anchor (即 ) 后pf.conf
添加,并在末尾添加。rdr-anchor "redirection"
rdr-anchor "com.apple/*"
load anchor "redirection" from "/etc/pf.anchors/redirection"
最终,pf.conf 文件应该是这样的:
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr-anchor "redirection" #added for redirection/port forwarding
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "pow" from "/etc/pf.anchors/redirection" #added for redirection/port forwarding
差不多就这些了。只需pfctl
先sudo pfctl -d
禁用它,然后sudo pfctl -fe /etc/pf.conf
重新启动即可。
现在,如果您需要在每次重启后自动执行此操作,则需要完成另一项小工作:需要pfctl
更新启动守护程序(引用的要点提到 pf 在启动时自动启用,但从代码来看似乎并非如此)。打开(使用 sudo)System/Library/LaunchDaemons/com.apple.pfctl.plist
并查找以下内容:
<array>
<string>pfctl</string>
<string>-f</string>
<string>/etc/pf.conf</string>
</array>
并添加以下行<string>-e</string>
,最终使其如下所示:
<array>
<string>pfctl</string>
<string>-e</string>
<string>-f</string>
<string>/etc/pf.conf</string>
</array>
那就可以了。
警告:Apple 不再允许像这样更改启动守护程序文件(不能使用 sudo、chmod 或其他任何方法)。仅有的方法是修改系统完整性保护设置:启动到恢复模式并启动终端。使用 检查 SIP 状态csrutil status
,通常应已启用。使用 禁用它csrutil disable
并在正常模式下重新启动,然后如上所述对 plist 文件进行更改。完成后,返回恢复模式并通过发出 重新启用保护(它有充分的理由)csrutil enable
。
解释:可以通过发出命令来检查ifconfig
该命令127.0.0.1
已经是 localhost lo0 的(默认)别名 - 此事实用于避免必须为 localhost 添加额外的别名,并仅在文件中使用默认地址pf.conf
。
更新:不幸的是,似乎在启动时加载文件不起作用。我仍在尝试寻求帮助来解决这个问题。在此之前,sudo pfctl -f /etc/pf.conf
启动后运行就可以解决问题。
答案4
从 10.5 开始,OS X 配备了一个新的面向应用程序的防火墙,而不是ipfw
。但 ipfw 仍然安装。如果您对其语法有疑问,请查看图形前端,如WaterRoof
或Flying Buttress
。
HTH,PEra