相当于Mac OS X的iptables


55

我想将请求从转发192.168.99.100:80127.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


我们在谈论OSX客户端还是服务器?
Scott Pack 2010年

1
是雪豹。
nafe 2010年

是否有某些原因您不能仅将Web服务器配置为也监听192.168.99.100:80?
Zoredache

1
@Zoredache在端口80上侦听需要sudo,并且某些Web服务器没有足够快地放弃特权以使用sudo安全地运行它们。
纳文

Answers:


33

所以我找到了一种方法。我不确定这是否是首选方法,但是它可以工作!在您最喜欢的外壳上:

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

4
ipfw无法在优胜美地(MAC)上使用,似乎有点不赞成使用
-Vadorequest

25

使用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 -

然后编辑您的/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的主机。


1
只是个小问题,但可以完成工作。不错的秀。
乔伊·卡森

6
谢谢。您将如何撤消别名和转发?
卡洛斯·努涅斯(CarlosNuñez)2015年

1
sudo discoveryutil udnsflushcaches,我给了我,command not found但它仍然正确匹配条目。但是如何映射第二个端口?我尝试使用id:10.0.0.2和另一个端口执行步骤1 + 2 ,但是它始终仅占用最后一个连接。所以,如果我不持续10.0.0.1port 3000转发3000,如果我最后做10.0.0.2和端口4000转发4000。在我的文章中,/private/etc/hosts我都用(根据)不同的ID编写了两个条目。
安迪·吉加

可以,但是当我重新启动OSX时我需要再次。...有什么东西可以永久保存吗?
卡巴斯尔(Kasper)

1
请更新sudo dscacheutil -flushcache
northtree

5

最近我也不得不做类似的事情,并且在搜索中找到了这个答案。不幸的是,Nafe使用的答案ipfw现已被OSX弃用并且不可用;而Kevin Leary的回答确实有点荒谬。所以我不得不做得更好(更清洁),并决定在此分享以供后代使用。这个答案主要基于本要点提到的方法。

如OP所述,将浏览器指向192.168.99.100应该会收到来自本地主机:8000的服务器的响应。单独添加别名ifconfig并没有必要,pfctl要实现此目的pf.conf/etc/pf.conf只需修改文件即可。

首先,我们创建(使用sudo)的新主播的文件(让我们称之为 redirection)在:/etc/pf.anchors/redirection。这基本上是一个普通的文本文件,包含以下行(就像凯文猜疑的答案): 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

仅此而已。只需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

说明:可以通过发出已经是localhost lo0的(默认)别名的ifconfig命令来进行检查127.0.0.1-使用此事实是为了避免必须为localhost添加额外的别名,而只是使用pf.conf文件中的默认地址。

更新:不幸的是,似乎在启动时无法加载文件。我仍在设法获得帮助以进行排序。在此之前,sudo pfctl -f /etc/pf.conf启动后运行即可达到目的。


谢谢,这对我在OS X Sierra中有用。重定向文件以换行符结尾非常重要。
凯德里安

覆盖这样的系统文件似乎不安全System/Library/LaunchDaemons/com.apple.pfctl.plist; 这可能无法在操作系统更新中生存吗?
汤姆


1

从10.5开始,OS X附带了新的面向应用程序的防火墙,而不是ipfw。但是ipfw仍然安装。如果您对其语法有疑问,请查看诸如WaterRoof或的图形前端Flying Buttress

佩特拉HTH


1

规则的顺序很重要,请确保在允许规则之前没有“全部拒绝”之类的内容。


感谢您的建议,但我认为我没有遇到特定问题(ipfw列表仅显示我的规则和65535 allow ip from any to any)。
nafe 2010年

1

您的命令似乎缺少规则号;尝试:

ipfw add 100 fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(如果您不是以root用户身份运行,则必须以sudo前缀)。要检查的另一件事是已启用防火墙:

sysctl net.inet.ip.fw.enable

如果返回值为0(关闭),请使用以下命令将其打开:

sysctl -w sysctl net.inet.ip.fw.enable=1

...,然后安排它在计算机重新启动时重新启用。执行此操作的“适当”方法可能是创建一个启动项目Lingon使其相当容易)。或者只是使用提到的一种GUI工具PEra,并让它处理细节。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.