我想转发请求从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
上运行的回应)
所以我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上使用ifconfig
和pfctl
命令来实现这个function。 通过以下方法,我在本地机器上成功将127.0.0.1:3000
映射到mydomain.com
。
在命令行中input以下两条命令,将连接转发到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
,你会看到托pipe在你本地主机端口上的服务器(例如127.0.0.1:3000
)。 基本上这个过程将一个<ip>:<port>
映射到一个新的<ip>
这样你就可以映射一个主机那个IP。
这对我很好:
将以下行添加到启动文件中,如下所述: 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
等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.conf
的pf.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
就可以了。