我完全迷路了。我是 Linux 网络的真正初学者。
我想要实现的目标:
正如 bobstro 所说,我希望允许连接 wifi 的 UPnP 相机在 wifi 网络之间移动。 RPI 连接到这些网络,相机连接到 RPi。但 RPi 不是接入点。它通过 TCP 或 websocket 连接到服务器,并接收通过相机拍照的命令。然后它通过 websocket 或 TCP 发回图片。
我的情况 :
我的 Raspberry Pi 上有三个接口:eth0、wlan0 和 wlan1(2 个 Wi-Fi USB 适配器)。
wlan1 将用于通过 SSDP 连接到 Wi-Fi 摄像头。
wlan0 将用于与服务器建立 TCP 连接(已知 IP/域名)。我对通过 DHCP 连接到的 Wi-Fi 网络 wlan0 一无所知。它可能会不时发生变化。它并不专门知道网关。
eth0 将用于调试 SSH 访问,以通过我的 MacBook Air 连接共享服务为例。
Server <---> Internet <--wlan0--> RPI <--wlan1--> Camera
|
etho
|
Macbook
目前,这些接口均已上线。这是ifconfig
输出(wlan1 和 eth0 在同一网络上,但将来不会出现这种情况):
eth0 Link encap:Ethernet HWaddr b8:27:eb:8c:e2:10
inet addr:192.168.0.19 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1174 errors:0 dropped:0 overruns:0 frame:0
TX packets:141 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:93616 (91.4 KiB) TX bytes:12342 (12.0 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
wlan0 Link encap:Ethernet HWaddr c0:4a:00:2a:ab:6c
inet addr:192.168.43.44 Bcast:192.168.43.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1142 (1.1 KiB) TX bytes:1145 (1.1 KiB)
wlan1 Link encap:Ethernet HWaddr 74:da:38:0c:c6:f0
inet addr:192.168.2.2 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1480 errors:0 dropped:0 overruns:0 frame:0
TX packets:155 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:222449 (217.2 KiB) TX bytes:29711 (29.0 KiB)
这是输出sudo route -n
:
0.0.0.0 192.168.0.254 0.0.0.0 UG 0 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan1
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.43.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
和这里/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
post-up route del default dev wlan0
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "wifi1"
wpa-psk "psw1"
auto wlan1
allow-hotplug wlan1
iface wlan1 inet dhcp
wpa-ssid "wifi2"
wpa-psk "pwd2"
如果我正确理解过去 24 小时内阅读的内容,我需要做路由工作。但我不明白什么以及如何。
我需要更改默认路由吗?如果是这样,由于在连接到网络之前我不知道 wlan0 或 wlan1 的网关,我该如何做到这一点?这是一个不可能解决的问题吗?
这篇文章可能是重复的;但从昨天开始我没有发现任何有用的东西,所以至少我需要一些帮助来找到原始帖子。 :)
编辑:正如金发姑娘提到的,我的问题很广泛。我真的很抱歉。我对网络一无所知。我不知道如何将其分成更具体的问题。
所以,也许第一次失败的尝试:
我尝试sudo ip route del default
删除默认的 eth0 网关。然后sudo ip route add default dev wlan0
,该命令起作用,但会产生以下路由表:
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 wlan0
而我希望 Raspberry Pi 找到 wlan0 wifi 路由器 IP(我不知道,它可能会改变)并将其用作网关。这将是良好的第一步。
编辑 2:wlan1 现在位于网络 192.168.2.x 上。
答案1
我可以给你一种部分答案,该答案与我如何处理这个问题有关,但需要注意的是,我在启动时不使用网络配置服务;我只是编写自己的脚本来完成我想做的事情。
也就是说,要测试这一点,您只需注释掉/etc/network/interfaces
除 和 之外的所有内容,lo
并wlan0
使用后者作为 DHCP 的默认路由。这应该意味着系统会以这种方式启动。我将让您自行解决此配置,但有一个问题:您必须知道该子网掩码不会与其他子网掩码冲突。所有这些都必须有所不同。大概有两个是在你的控制之下或者可以提前知道的。
第一个是 SSDP 相机子网,这里的一个问题是dhclient
当它已经在 wlan0 上维护一个租约时要为其配置租约。您可能认为这很容易,但环顾四周后,似乎并非如此。你可以尝试这个,但在我看来,有两个可能不太复杂的解决方案:
- 使用静态 IP。这无疑是最简单、最万无一失的方法。
- 使用
dhcpcd
以及/代替dhclient
.我不知道如何做到这一点,但它看起来确实是可能的。
使用静态 IP 更容易,因为这也意味着您可以对其进行硬编码。假设这个子网是192.168.0.0/24
并且ip是192.168.0.101:
ip link set wlan1 up
wpa_supplicant -B -c /path/to/essid/config -i wlan1
ip addr add 192.168.0.101 dev wlan1
ip route add 192.168.0.0/24 via 192.168.0.101
然后与 Mac 的 eth 连接几乎相同,通过它必须易于使用静态IP:
ip link set eth0 up
ip addr add 192.168.1.10
ip route add 192.168.1.0/24 via 192.168.1.10
答案2
据我了解,您希望使用 RPi 允许连接 wifi 的 UPnP 摄像头在网络之间移动,并使用 RPi 连接到每个站点的无线网络。
那是对的吗?是否有某种原因导致您无法在没有 RPi 路由的情况下直接从网络访问摄像机?
您是否在 RPi 上启用了路由?要以交互方式启用路由,请使用:
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
要使其永久生效,请编辑 /etc/sysctl.conf 并取消注释掉 net.ipv4.ip_forward = 1 行。
须藤纳米 /etc/sysctl.conf
# 取消注释下一行以启用 IPv4 数据包转发
net.ipv4.ip_forward=1
查看您的配置,RPi 将通过 DHCP 获取 WLAN0 的地址,这应为其提供默认网关。
您没有描述相机是如何连接的。您想使用 RPi 作为接入点吗?如果是这样,您需要设置 hostapd 并将 RPi 配置为 DHCP 服务器,以便摄像机通过无线连接到 RPi,并分配一个 IP 地址和指向回 RPi 的默认网关。
如果 eth0 接口仅用于诊断用途,您可能不希望将其用作 RPi 上的默认网关。
您需要准确地澄清您想要做什么,而不是告诉我们您如何尝试做到这一点。您所做的可能是错误的方法。
如果有帮助的话,以下是我使用类似配置的 RPi 的方法:
1 个 wifi 接口仅用于配置 RPi。我使用 hostapd 和 dnsmasq 将其配置为接入点。当我第一次将 RPi 放置在站点时,我从 MacBook 连接到此 AP 来配置它。我的 MacBook 被分配了一个 IP 地址和默认网关,通过 dnsmasq 指向 RPi。配置完成后,该接口一般不使用,但可以根据需要访问。
1个wifi接口用于连接每个站点的客户端网络以进行远程访问。我使用 wicd-curses 配置接口并验证是否可以从他们的网络 ping 通它。然后我可以通过 VPN 连接到该站点并访问 RPi。当我连接到站点 WiFi 网络时,我的 RPi 被分配一个通过 DHCP 指向站点 Internet 路由器的默认网关。
有线接口用于连接测试网络。它通过 /etc/network/interfaces 配置有固定的 IP 地址。
我不使用路由,因为我不希望流量在网络之间流动。所有流量均终止于 RPi。但是,使用一些脚本,我可以根据需要打开路由。我有脚本将 RPi 用作网桥或 NAT 路由器,具体取决于我的需要。
如果您可以更完整地描述您想要完成的任务,那么答案应该很简单。
答案3
所以,看来我已经设法找到了一个(临时?)解决方案,wlan0
默认路由在哪里。我不需要知道 wifi 网关。
关键是遵循@goldilocks 的想法来编写路由过程的脚本。但此解决方案允许保留eth0
并wlan1
在 dhcp 上运行。
所以我添加了包含以下内容的文件/etc/dhcp/dhclient-enter-hooks.d/post-wlan0
(及其chmod +x
内容):
# post-wlan0 script
# Goal : activate default route via wlan0 after wlan0 is up
#echo "post-wlan0 start" >> /tmp/testwlan0.debug
if [ "$interface" = "wlan0" ]; then
#echo "wlan0 detected" >> /tmp/testwlan0.debug
if [ -n "$new_routers" ] ; then
#echo "setting route" >> /tmp/testwlan0.debug
sudo ip route del default
sudo ip route add default via $new_routers dev wlan0
fi
fi
实际上,这个脚本是一个钩子,当 dhcp 客户端工作时会触发它。请参阅/etc/dhcp/dhclient-enter-hooks.d/debug
获取更多信息。
因此,当wlan0
启动时,它会删除旧的默认路由并添加一条带有wlan0
路由器 ip ( $new_routers
) 的新路由。
输出sudo route -n
:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.43.1 0.0.0.0 UG 0 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan1
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.43.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
eth0
我可以 ping或wlan1
网络中的设备。我通过 ssh 进行eth0
.
@goldilocks 和 @bobstro:非常感谢您的帮助!您觉得这个解决方案好吗?
我的配置:
/etc/network/interfaces
:
auto lo
iface lo inet loopback
# Connection to the world
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "wifi1"
wpa-psk "pwd1"
# Debugging connection
auto eth0
iface eth0 inet dhcp
# Connection to the future camera
auto wlan1
allow-hotplug wlan1
iface wlan1 inet dhcp
wpa-ssid "wifi2"
wpa-psk "pwd2"
输出ifconfig
:
eth0 Link encap:Ethernet HWaddr b8:27:eb:8c:e2:10
inet addr:192.168.2.2 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1371 errors:0 dropped:0 overruns:0 frame:0
TX packets:494 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:145112 (141.7 KiB) TX bytes:87219 (85.1 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
wlan0 Link encap:Ethernet HWaddr c0:4a:00:2a:ab:6c
inet addr:192.168.43.44 Bcast:192.168.43.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:230 errors:0 dropped:0 overruns:0 frame:0
TX packets:323 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:22412 (21.8 KiB) TX bytes:32270 (31.5 KiB)
wlan1 Link encap:Ethernet HWaddr 74:da:38:0c:c6:f0
inet addr:192.168.0.14 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1942 errors:0 dropped:1 overruns:0 frame:0
TX packets:30 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:305388 (298.2 KiB) TX bytes:3302 (3.2 KiB)
编辑:解决方案使用 UPnP 设备在 中的某处进行了测试wlan1
。我必须添加sudo ip route add 239.255.255.250 dev wlan1
UPnP 发现的路由才能通过良好的界面。
我用过这用于测试的 NodeJS 代码。