答案1
无需第三个公共 IP 或 VPN,我就能实现我想要的目标。
我使用具有广泛规则的 DNAT 和 SNAT。许多来源建议使用 MASQUERADE,但如果有多个面向互联网的接口可用,则度量较低的接口将同时获得本地和 PPP 流量并中断路由。 MASQUERADE 不允许指定特定的源 IP,但 SNAT 可以。
我添加了以下 iptables 规则:
-A FORWARD -i enp3s0 -o ppp0 -j ACCEPT
-A FORWARD -i ppp0 -o enp3s0 -j ACCEPT
-t nat -A PREROUTING -i enp3s0 -j DNAT --to-destination 10.0.5.2
-t nat -A POSTROUTING -s 10.0.5.2 -j SNAT --to-source <enp3s0's ip>
IP转发已启用:
echo 1 > /proc/sys/net/ipv4/ip_forward
理想情况下,脚本可以在 DHCP 配置之后配置 SNAT 规则源 ip。在我的例子中,ip 是无限期归属的,所以静态规则就可以了。
编辑:在 dirkt 的建议并在错误的接口上捕获一些传出数据包后,我添加了一个新的网络命名空间。打开界面的完整脚本现在是:
ip netns add bridged
ip link set enp3s0 netns bridged
ip netns exec bridged ip link set dev enp3s0 up
ip netns exec bridged dhclient enp3s0
ip netns exec bridged iptables -A FORWARD -i enp3s0 -o ppp0 -j ACCEPT
ip netns exec bridged iptables -A FORWARD -i ppp0 -o enp3s0 -j ACCEPT
ip netns exec bridged iptables -t nat -A PREROUTING -i enp3s0 -j DNAT --to-destination 10.0.5.2
ip netns exec bridged iptables -t nat -A POSTROUTING -s 10.0.5.2 -j SNAT --to-source [my internet ip]
ip netns exec bridged echo 1 > /proc/sys/net/ipv4/ip_forward
stty -F /dev/ttyUSB1 raw
stty -F /dev/ttyUSB1 1000000
ip netns exec bridged pppd /dev/ttyUSB1 1000000 10.0.5.1:10.0.5.2 local noauth debug nodetach dump nocrtscts passive persist maxfail 0 holdoff 1
我不确定为什么 DHCP 默认情况下不在新命名空间中运行,但现在只需调用 dhclient 一次就可以了。
防火墙仅在命名空间中关闭:
sudo ip netns exec bridged ufw disable
答案2
IP 是公共的,并根据接口 MAC 通过 DHCP 获得。
这意味着桥接时,ppp 接口需要获得通过 DHCP 获得的第三个公共 IP。这不适用于 ppp。
桥接ppp0
即使 ppp0 不需要公共 IP,它也是一个点对点连接,顾名思义。所以你无法弥合它。
以便可以从公共 IP 访问 RPi CM3+?
最简单的方法是在 Bench PIC 上启用转发,在任一外部 NIC 上启用 NAT ppp0,并添加端口转发规则。 (谷歌,有数百个教程)。这意味着一些RPi 上的端口可以在给定的外部 IP 下进行访问,也可能在不同的端口号下进行访问。并且Rpi可以访问全部互联网的。如果 Rpi 上运行着已知数量的需要访问的服务,那么这将起作用。
如果 RPI有要拥有第三个公共 IP,请在 ppp0 连接之上添加可桥接的 VPN(这将导致额外的开销),然后桥接生成的 tun/tap 接口。