美文网首页
在MacOS上使用1024以下端口

在MacOS上使用1024以下端口

作者: 疯长的胡茬 | 来源:发表于2019-03-21 10:59 被阅读0次

    起因

    MacOS和Linux一样,需要root权限使用低于1024以下端口。因此要在Mac机器上监听80端口或443端口,要么以root用户启动应用,要么使用端口转发。

    在Linux系统中可以通过sudo setcap cap_net_bind_service=+ep <app name>来让非root用户使用1024以下端口(<app name>指要授权监听端口的程序)。

    MacOS没有setcap命令,所以需要通过端口转发来达到目的。新版的MacOS操作系统使用pf(packet filter)设置端口转发。

    简单粗暴的解决方式

    echo "
    rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
    rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
    " | sudo pfctl -ef -
    

    rdr: The packet is redirected to another destination and possibly a different port.
    数据包被重定向到另一个目的地,可能还有一个不同的端口
    rdr rules can optionally specify port ranges instead of single ports.
    规则可以选择指定端口范围而不是单个端口
    rdr ... port 2000:2999 -> ... port 4000 redirects ports 2000 to 2999 (inclusive) to port 4000.
    ... port 2000:2999 -> ... port 4000 重定向端口2000-2999(包含2999)到端口4000
    rdr ... port 2000:2999 -> ... port 4000:* redirects port 2000 to 4000, 2001 to 4001, ..., 2999 to 4999.
    ... port 2000:2999 -> ... port 4000:* 重定向端口2000到端口4000,端口2001到端口4001,...,端口2999到4999

    比较详尽的管理方式

    创建anchor文件

    ⚠️注意,以下示例端口有重复。
    示例一:
    /etc/pf.anchors/http

    rdr pass on lo0 inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
    rdr pass on lo0 inet proto tcp from any to any port 443 -> 127.0.0.1 port 4443
    rdr pass on en0 inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
    rdr pass on en0 inet proto tcp from any to any port 443 -> 127.0.0.1 port 4443
    

    示例二:
    /etc/pf.anchors/tomcat

    rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
    

    示例三:
    /etc/pf.anchors/virtualbox

    rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
    rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 443 -> 127.0.0.1 port 8443
    

    测试anchor文件

    pfctl -vnf /etc/pf.anchors/http
    pfctl -vnf /etc/pf.anchors/tomcat
    pfctl -vnf /etc/pf.anchors/virtualbox
    

    添加到主配置文件

    pf启动时会自动装载/etc/pf.conf文件,因此将anchor文件链接到/etc/pf.conf,转发规则就会自动建立了。pf.conf 对指令的顺序有严格要求,相同的指令需要放在一起,否则会报错 Rules must be in order: options, normalization, queueing, translation, filtering.

    rdr-anchor "http-forwarding"
    load anchor "http-forwarding" from "/etc/pf.anchors/http"
    
    rdr-anchor "tomcat-forwarding"
    load anchor "tomcat-forwarding" from "/etc/pf.anchors/tomcat"
    
    rdr-anchor "virtualbox-forwarding"
    load anchor "virtualbox-forwarding" from "/etc/pf.anchors/virtualbox"
    

    打开pf

    pf默认是关闭的。可以使用以下命令启动pf:

    sudo pfctl -ef /etc/pf.conf
    

    使用 -e 命令启用 pf 服务。使用 -E 命令强制重启 pf 服务:

    $ sudo pfctl -E
    

    关闭pf

    使用 -d 命令关闭 pf:

    $ sudo pfctl -d
    

    设置pf自启动

    修改 LaunchDaemons (《了解LaunchDaemons》)来使 pf 开机自动打开

    <key>ProgramArguments</key>
    <array>
    <string>pfctl</string>
    <string>-e</string>
    <string>-f</string>
    <string>/etc/pf.conf</string>
    </array>
    

    添加的为-e参数,即enable。 有一点一定要注意,-f和etc/pf.conf这两个参数不能被打断,因为-f必须紧跟一个文件参数,所以说添加-e参数时不要打断-f参数,否则开机不会自动启动pf,切记。

    跨接口转发

    如果需要跨接口转发,则需设置系统参数: /etc/sysctl.conf
    开机启动配置,需以 root 身份添加或修改 /etc/sysctl.conf 文件,加入以下两行:

    net.inet.ip.forwarding=1
    net.inet6.ip6.forwarding=1
    

    跨接口转发,本次开机生效:

    • IPv4 的转发
    $ sudo sysctl -w net.inet.ip.forwarding=1
    net.inet.ip.forwarding: 0 -> 1
    
    • IPv6 的转发
    $ sudo sysctl -w net.inet6.ip6.forwarding=1
    net.inet6.ip6.forwarding: 0 -> 1
    

    查看当前转发状态

    $ sudo sysctl -a | grep forward
    net.inet.ip.forwarding: 0
    net.inet6.ip6.forwarding: 0
    

    帮助手册

    开启端口转发之后,即可配置端口转发规则。你可以跟着手册来:

    $ man pfctl
    $ man pf.conf
    

    相关文章

      网友评论

          本文标题:在MacOS上使用1024以下端口

          本文链接:https://www.haomeiwen.com/subject/mffqvqtx.html