了解 WiFi 路由和网关

了解 WiFi 路由和网关

我完全迷路了。我是 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除 和 之外的所有内容,lowlan0使用后者作为 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 的想法来编写路由过程的脚本。但此解决方案允许保留eth0wlan1在 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 wlan1UPnP 发现的路由才能通过良好的界面。

我用过用于测试的 NodeJS 代码。

相关内容