iptables 等价于 mac os x

naf*_*afe 68 iptables mac-osx ipfw

我想转发来自192.168.99.100:80to 的请求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
Run Code Online (Sandbox Code Playgroud)

我如何在 MacOS X 中做同样的事情?我尝试了一些ipfw命令组合,但没有取得多大成功:

ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80
Run Code Online (Sandbox Code Playgroud)

(对我来说,成功是指向浏览器http://192.168.99.100并从我运行的开发服务器获得响应localhost:8000

naf*_*afe 39

所以我找到了一种方法来做到这一点。我不确定这是否是首选方式,但它有效!在您最喜欢的外壳上:

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
Run Code Online (Sandbox Code Playgroud)

(别名 tolo0似乎是缺失的部分)

如果您希望(假)域指向这个新别名,请确保 /etc/hosts 包含以下行:

10.0.0.1 www.your-domain.com
Run Code Online (Sandbox Code Playgroud)

  • ipfw 无法在 Yosemite (MAC) 上运行,而且似乎已被弃用 (8认同)

Kev*_*ary 33

我能够在 Mac 10.10.2 上使用ifconfigpfctl命令来完成这项工作。通过以下方法,我成功地映射127.0.0.1:3000mydomain.com我的机器上的本地。

在命令行中输入以下两个命令以将连接转发127.0.0.1:300010.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 -
Run Code Online (Sandbox Code Playgroud)

然后编辑您的/etc/hosts/private/etc/hosts文件并添加以下行以将您的域映射到10.0.0.1.

10.0.0.1 mydomain.com
Run Code Online (Sandbox Code Playgroud)

保存主机文件后,刷新本地 DNS:

sudo discoveryutil udnsflushcaches
Run Code Online (Sandbox Code Playgroud)

现在mydomain.com在浏览器中打开,您将看到托管在 localhost 端口(即127.0.0.1:3000)上的服务器。基本上这个过程将一个映射<ip>:<port>到一个新的,<ip>这样你就可以将一个主机映射到该 IP。

  • 谢谢你。您将如何撤消别名和转发? (6认同)
  • 请使用 `sudo dscacheutil -flushcache` 更新 (3认同)
  • 嗨`sudo discoveryutil udnsflushcaches` 给了我`command not found` 但它仍然正确匹配条目。但是如何映射第二个端口?我尝试使用 id: `10.0.0.2` 和另一个端口执行步骤 1+2,但它始终只需要最后一个连接。因此,如果我执行最后一个 `10.0.0.1` 和 `port 3000` 它转发`3000`,如果我执行最后一个 `10.0.0.2` 和端口 `4000` 它转发`4000`。在我的`/private/etc/hosts` 中,我用(根据)不同的 id 写了两个条目。 (2认同)
  • 有效,但是当我重新启动 OSX 时我需要再次使用它......有什么可以永久保存它的吗? (2认同)

Yog*_*sch 7

我最近也不得不做类似的事情,并在搜索中找到了这个答案。不幸的是,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 文件的样子:

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
Run Code Online (Sandbox Code Playgroud)

差不多就是这样。只需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>
Run Code Online (Sandbox Code Playgroud)

并添加该行<string>-e</string>以最终使其像这样:

<array>
         <string>pfctl</string>
         <string>-e</string>
         <string>-f</string>
         <string>/etc/pf.conf</string>
</array>
Run Code Online (Sandbox Code Playgroud)

那应该这样做。

警告: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启动后运行即可解决问题。