iptables相当于mac os x

我想转发请求从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上运行的回应)

所以我find了一个方法来做到这一点。 我不知道这是否是首选的方式,但它的工作原理! 在你最喜欢的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的别名似乎是缺less的部分)

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

 10.0.0.1 www.your-domain.com 

我可以在Mac 10.10.2上使用ifconfigpfctl命令来实现这个function。 通过以下方法,我在本地机器上成功将127.0.0.1:3000映射到mydomain.com

在命令行中input以下两条命令,将连接转发到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 ,你会看到托pipe在你本地主机端口上的服务器(例如127.0.0.1:3000 )。 基本上这个过程将一个<ip>:<port>映射到一个新的<ip>这样你就可以映射一个主机那个IP。

这对我很好:

  • 通过系统预置启用防火墙
  • 按照此处所述创buildipfw启动文件: https : //serverfault.com/a/235124/94860
  • 将以下行添加到启动文件中,如下所述: 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仍然安装。 如果您的语法有问题,请查看WaterRoofFlying Buttress等graphics前端。

HTH,PEra

规则的顺序是重要的,确保在允许规则之前没有“拒绝所有”,或者类似的东西。

您的命令似乎缺less一个规则编号; 尝试:

 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 

…然后安排计算机重新启动时重新启用它。 做到这一点的“正确”方式可能是创build一个启动项目 ( Lingon使这很容易)。 或者只是使用PEra提到的GUI工具之一,让它处理细节。

我最近也不得不做类似的事情,并在寻找这个答案。 不幸的是,Nafe的答案使用了ipfw ,现在在OSX中已经被废弃了, Kevin Leary的回答确实有些ha </s>。 所以我不得不做一些更好的(更清洁),并决定在这里分享它的后代。 这个答案在很大程度上是基于这个要点提到的方法。

正如OP提到的,将浏览器指向192.168.99.100应该从localhost:8000的服务器得到响应。 为ifconfig添加一个别名并不是必须的,单独使用pfctl就足够了:为此,需要修改/etc/pf.confpf.conf文件。

首先我们在/etc/pf.anchors/redirection创build(使用sudo)一个新的锚文件(我们称之为redirection )。 这基本上是一个常规的文本文件,并包含以下行(就像在凯文Leary的答案一样): rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000 。 一旦新的锚文件被创build,它需要在pf.conf文件中被引用。 使用sudo打开pf.conf文件,在最后一个rdr-anchor行( rdr-anchor "com.apple/*" )之后添加rdr-anchor "redirection" ,并在load anchor "redirection" from "/etc/pf.anchors/redirection"添加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 

而这几乎是。 只需通过发出sudo pfctl -d来禁用它,然后sudo pfctl -fe /etc/pf.conf来重新启动它就可以重新启动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> 

这应该做到这一点。

警告 :苹果不再允许像这样(不是用sudo,也不用chmod或其他)更改启动恶魔文件。 唯一的方法是鼓捣系统完整性保护设置:启动到恢复模式和启动terminal。 用csrutil status检查SIP状态,通常应该启用。 禁用csrutil disable并在正常模式下重新启动,然后如上所述对plist文件进行更改。 完成后,返回到恢复模式并通过发出csrutil enable来重新启用保护(原因很充分)。

说明: 可以通过发出ifconfig命令来检查127.0.0.1是否已经是localhost lo0的(默认)别名 – 这个事实正被用来避免为localhost添加一个额外的别名,并简单地使用pf.conf的默认地址pf.conf文件。

更新:不幸的是,似乎在启动时加载文件不起作用。 我仍然在努力寻求帮助。 在这之前,在启动后运行sudo -f /etc/pfctl.conf就可以了。