我有一个叫做袖珍小猎犬我一直试图将它添加到我的本地网络中,但没有成功。我尝试了很多方法,但没有一个完全成功。刚开始的时候,这看起来并不难,但经过几天的争论却没有成功,我必须承认我是个无可救药的白痴。话虽如此,我需要帮助才能让它工作。
本地网络和背景:
以下是我的局域网的粗略草图。192.168.1.0 网络和 OPNsense 防火墙几年来一直运行良好。我现在想添加之间的网络连接袖珍小猎犬以及网络上的其他主机,以及与互联网的连接袖珍小猎犬。
这袖珍小猎犬运行某个版本的 Debian。它只有一个 USB 接口,用于供电和所有外部通信。它显然使用USB 以太网将其 USB 表示为以太网接口。
袖珍小猎犬有两个 (2) 个以太网接口:192.168.6.2 和 192.168.7.2。根据文档,它运行一个 DHCP 服务器,将 192.168.6.1 和 192.168.7.1 分配给主机 - 在本例中为下图所示的 Ubuntu Linux 机器 - 又名苹果电脑。它为自己保留了 192.168.6.2 和 *.7.2。“开箱即用”,我能够SSH
从苹果电脑到袖珍小猎犬, 但袖珍小猎犬无法再进一步了。
与“外面的世界”必须通过苹果电脑WiFi接口为192.168.1.104。
在 macbuntupro 主机上:
当我插上电源时袖珍小猎犬进入我的 Ubuntu 20.04 桌面机(macbuntupro),我可以看到以下内容:
ifconfig
苹果电脑
注意:为了简洁起见,我删除了lo
接口enp2s0
和一些其他细节
seamus@MacBuntuPro:~$ ifconfig
enx606405fa813b: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.7.1 netmask 255.255.255.0 broadcast 192.168.7.255
ether 60:64:05:fa:81:3b txqueuelen 1000 (Ethernet)
enx606405fa813d: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.6.1 netmask 255.255.255.0 broadcast 192.168.6.255
ether 60:64:05:fa:81:3d txqueuelen 1000 (Ethernet)
wlp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.104 netmask 255.255.255.0 broadcast 192.168.1.255
ether 68:a8:6d:2d:d4:d0 txqueuelen 1000 (Ethernet)
route -n
macbuntupro:
seamus@MacBuntuPro:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 600 0 0 wlp3s0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enx606405fa813b
192.168.1.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp3s0
192.168.6.0 0.0.0.0 255.255.255.0 U 101 0 0 enx606405fa813d
192.168.7.0 0.0.0.0 255.255.255.0 U 100 0 0 enx606405fa813b
注意:我不确定169.254.0.0
我开始时目的地是否存在。
使用以下配置苹果电脑可以访问 192.168.1.0 网络上的所有主机,并且可以通过 192.168.1.1 的防火墙/网关访问互联网。所有协议和服务均正常运行,名称解析快速无误。
在袖珍小猎犬通过 SSH 主机苹果电脑:
苹果电脑可以连接到袖珍小猎犬通过 SSH(为简洁起见,已编辑):
seamus@MacBuntuPro:~$ ssh [email protected]
Debian GNU/Linux 10
...
[email protected]'s password:
...
debian@beaglebone:~$
ifconfig
袖珍小猎犬
注意:为了简洁起见,我删除了lo
一些其他细节
debian@beaglebone:~$ ifconfig
usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.7.2 netmask 255.255.255.0 broadcast 192.168.7.255
ether 60:64:05:fa:81:3a txqueuelen 1000 (Ethernet)
usb1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.6.2 netmask 255.255.255.0 broadcast 192.168.6.255
ether 60:64:05:fa:81:3e txqueuelen 1000 (Ethernet)
route -n
袖珍小猎犬:
debian@beaglebone:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.6.0 0.0.0.0 255.255.255.0 U 0 0 0 usb1
192.168.7.0 0.0.0.0 255.255.255.0 U 0 0 0 usb0
路由表中的这些默认条目
pocketbeagle
可能是合适的,甚至是必要的,但当使用默认路由表时macbuntupro
,pocketbeagle
甚至无法到达 192.168.1.104 处的 WiFi 网关。从pocketbeagle
,除 之外唯一可以访问的 IP 地址lo
是 192.168.6.1 和 192.168.7.1。显然,还需要更多的东西。
状态、尝试和错误
使用上述默认设置,我可以ssh
从 macbuntupro 发起连接到袖珍小猎犬。 从袖珍小猎犬我可以 ping 192.168.6.1 和 192.168.7.1(连接的 Ubuntu 端),但除此之外什么也做不了。
我可以花几个小时详细描述我尝试过的一切。我有一些有限的成功,但都不起作用完全地也就是说,我在一些试验中获得了部分连接。在我看来,这是一个路由问题route
,我尝试使用配置静态路由的工具来解决这个问题。我确实尝试connmanctl
在袖珍小猎犬,但它错误地发送了一条我无法解码的难以理解的消息。
网络路由对我来说是一个巨大的盲点——过去几天我至少学到了这么多。经过一番研究,我认为“简单”的方法是启用“IP 转发”。我编辑了文件/etc/sysctl.conf
以启用net.ipv4.ip_forward=1
,然后检查:
seamus@MacBuntuPro:~$ cat /proc/sys/net/ipv4/ip_forward
1
这没有帮助 - 所有尝试联系其他主机从袖珍小猎犬收到了network unreachable
消息。我还检查了ufw
, 在苹果电脑并确认防火墙已正常inactive
。
袖珍小猎犬没有traceroute
(或mtr
或tracepath
),但是我无法 ping 192.168.1.104 的一跳远 WiFi 这一事实表明ip_forward
需要一些“帮助”。
我添加了这条路线袖珍小猎犬&重新测试:
debian@beaglebone:~$ sudo route add -net 0.0.0.0 gw 192.168.6.1
# OR, ALTERNATIVELY:
debian@beaglebone:~$ sudo route add default gw 192.168.6.1
debian@beaglebone:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.6.1 0.0.0.0 UG 0 0 0 usb1
192.168.6.0 0.0.0.0 255.255.255.0 U 0 0 0 usb1
192.168.7.0 0.0.0.0 255.255.255.0 U 0 0 0 usb0
debian@beaglebone:~$ ping 192.168.1.104
PING 192.168.1.104 (192.168.1.104) 56(84) bytes of data.
64 bytes from 192.168.1.104: icmp_seq=1 ttl=64 time=0.388 ms
...
...
# SUCCESS!
debian@beaglebone:~$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
^C
--- 192.168.1.1 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 145ms
# FAILURE!
似乎“IP 转发”不起作用 - 或者至少它没有按照我的期望运行。如果我转发从192.168.6.1到192.168.1.104,并且 192.168.1.104 知道如何到达 192.168.1.1(并且它确实做到了),它似乎会用它来处理转发无法提供从 192.169.1.0 网络上的主机到袖珍小猎犬。显然我忽略了一些东西。
我能够通过在OPNsense 网关/防火墙:
要访问网络 192.168.6.0/24,请转到网关 192.168.1.104
这是一个 GUI 配置,我无法可靠地将其转换为route
命令。不幸的是,虽然这改善了逐步地,这也是一个部分解决方案。它允许袖珍小猎犬到达 192.168.1.1 的网关/防火墙,但互联网上没有任何连接。它还允许 192.169.1.0 网络上的主机连接到袖珍小猎犬,但连接非常脆弱,可能只能维持一两分钟!因此,我禁用了此路由。
我就此打住,重新陈述我的问题:
需要哪些路线才能允许袖珍小猎犬到达局域网和互联网,并允许局域网上的其他主机到达袖珍小猎犬?
或者:
如果我的方法完全错过了机会,请提出更好的方法。
答案1
似乎“IP 转发”不起作用 - 或者至少它没有按照我的期望运行。如果我从 192.168.6.1 转发到 192.168.1.104,并且 192.168.1.104 知道如何到达 192.168.1.1(并且它确实知道),似乎它会将其用于转发给它的数据包?!此设置也无法提供从 192.169.1.0 网络上的主机到 pocketbeagle 的连接。显然我遗漏了一些东西。
配置一个方向的路由并不会自动暗示反向路由。因此,不仅 Pocketbeagle 需要到 LAN 的路由,而且 LAN 上的设备也明确需要到 Pocketbeagle 的路由。
将路由添加到 OPNsense(LAN 网关)确实是实现此目的的一种方法。然而,它不可靠的最可能原因是它会导致三角路由:从 LAN 到 Pocketbeagle 的数据包通过 OPNsense,但从 Pocketbeagle 到 LAN 的数据包不通过。这是因为 Ubuntu 路由器到 LAN 的路由更直接。
严格来说,非对称路由并不坏,但它确实意味着 OPNsense 防火墙的“状态跟踪”永远看不到响应,也永远无法正确地将状态标记为已建立,并在快速超时后忘记它。
因此你可能还需要添加一个防火墙规则在 OPNsense 路由器上,这样它总是允许从 192.168.1.0/24 到 192.168.6.0/24 以及反方向的任何流量。如果 OPNsense 的工作原理与 pfSense 类似,则应选择状态类型:草率以使规则与非对称路由兼容。
更好的方法是直接添加相同的路线在每个 LAN 主机上,而不仅仅是在 OPNsense 网关上。这样,两个方向的数据包都会完全跳过 OPNsense。当然,缺点是您需要在每个主机上手动执行此操作……但您可以尝试使用 DHCP“无类静态路由”选项进行分发,许多操作系统都支持该选项。