OS X natd,en0 和 tap0 之间的 nat

OS X natd,en0 和 tap0 之间的 nat

我正在尝试将 tap0 和 en0 接口与 natd 连接起来。(简化的)背景如下:

我在智能手机上运行一个应用程序,在笔记本电脑上运行一个简单的 UDP 服务器。UDP 服务器正在监听 tap 接口,我想用我的智能手机应用程序与服务器对话。(正如我所说,这有点简化,UDP 服务器必须监听 tap 接口,而不能监听 en0。)

我尝试了以下操作:

  • 打开tap0:

    $ su
    $ exec 5<>/dev/tap0   (running in one terminal-tab)
    
  • 设置tap0地址、网络掩码等。

    $ sudo ifconfig tap0 inet 10.1.1.100 netmask 255.255.255.0 broadcast 10.1.1.255
    
  • 启用端口转发

    $ sudo sysctl -w net.inet.ip.forwarding=1
    
  • 启动natd:

    $ sudo /usr/sbin/natd -alias_address MY_EN0_IP \
        -interface tap0 -use_sockets -same_ports -dynamic -clamp_mss \
        -enable_natportmap -natportmap_interface en0 \
        -redirect_port udp 10.1.1.100:50000 50000 -l
    
  • 启动示例 UDPServer,监听 10.1.1.100:50000

Netstat 显示开放的端口:

$ netstat -n | grep 50000
udp4       0      0  10.1.1.100.50000       *.*

当我从智能手机向目标是:MY_EN0_IP:50000 的笔记本电脑发送一个数据包时,我可以看到数据包通过 Wireshark 到达 en0,但笔记本电脑却回复了“ICMP 端口不可达”消息。

我不知道出了什么问题,natd 不应该在 en0 上打开端口 50000、接受数据包并将它们 NAT 到 tap0 接口吗?我遗漏了什么?

答案1

似乎我已经通过使用 pf 和 pfctl 找到了解决方案。这似乎有效:

  • 激活端口转发:

    $ sudo sysctl net.ipv4.ip_forward=1
    
  • 将以下规则添加到 pf.conf(位于 /private/etc/)

    “rdr on en0 proto udp 从任意到任意端口 50000 -> 10.1.1.100 端口 50000”(不带引号,位于“rdr-anchor”正下方)

  • 阅读 pf 规则:

    $ sudo pfctl -f /private/etc/pf.conf
    
  • 激活 pf:

    $ sudo pfctl -e
    

相关内容