macOS 端口转发

macOS 端口转发的多种方法

前言

在如下列情况中,可以做端口转发,减少麻烦。

  1. 在 macOS 中,对于 1024 以下的端口,需要使用 root 权限(Unix-like 都有该问题)
  2. 使用虚拟机,不单独对外提供连接时,可以转发到主机的端口,提供对外连接

pfctl

pfctl 命令是 PF 防火墙的配置命令,PF 防火墙(全称:Packet Filter)是 Unix-like 系统上进行 TCP/IP 流量过滤和网络地址转换的软件系统。PF 同样也能提供 TCP/IP 流量的整形和控制,并且提供带宽控制和数据包优先集控制。PF 最早是由 Daniel Hartmeier 开发的,现在的开发和维护由 Daniel 和 openBSD 小组的其他成员负责。

macOS 在 10.10 版本之前使用 ipfw,之后的版本开始使用 pfctl,是由于 macOS 自带的 GUI 防火墙只能针对软件进行放开,且无法针对特定端口入站及出站进行管理。所以使用 pfctl 能解决这类问题。

使用方法

  1. 首先在 /etc/pf.anchors/ 新建一个 http 文件内容如下:
    1
    rdr pass on lo0 inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
  2. 然后使用 pfctl 命令检测配置文件
    1
    $ sudo pfctl -vnf /etc/pf.anchors/http
  3. 如果没有报错(正确的打印了配置信息,没有明显的出错信息),即修改 pf 的主配置文件 /etc/pf.conf,来引入这个转发规则:在 rdr-anchor "com.apple/*" 下,添加如下 anchor 声明:rdr-anchor "http-forwarding"pf.conf 对指令的顺序有严格要求,否则会报出 Rules must be in order: options, normalization, queueing, translation, filtering 的错误,所以相同的指令需要放在一起。
  4. 再在 load anchor "com.apple" from "/etc/pf.anchors/com.apple" 下,添加 anchor 引入:load anchor "http-forwarding" from "/etc/pf.anchors/http"
  5. 最后,导入并允许运行 pf
    1
    $ sudo pfctl -ef /etc/pf.conf
  6. 如果需要开机启动,则需要为 /System/Library/LaunchDaemons/com.apple.pfctl.plist 针对 pfctl 的启动项,新增一个 -e (允许) 参数,这样,pf 规则开机机器可以生效了

socat

Socat 是 Linux 下的一个多功能的网络工具,名字来由是「Socket CAT」。其功能与有瑞士军刀之称的 Netcat 类似,可以看做是 Netcat 的加强版。

Socat 的主要特点就是在两个数据流之间建立通道,且支持众多协议和链接方式。如 IP、TCP、UDP、IPv6、PIPE、EXEC、System、Open、Proxy、Openssl、Socket 等。

安装 socat:

1
$ brew install socat

使用方法

直接执行以下命令就可以完成将访问本机 8888 端口的请求转发至 10.211.55.8 的 8888 端口,ctrl + C 退出

1
sudo socat TCP4-LISTEN:8888,fork TCP4:10.211.55.8:8888

总结

pfctl 的方式,尝试多次没有成功,使用 socat 成功。当时时间紧没有再尝试,后续有需求再完善 pfctl 的方式。

参考文献