多个接口匹配同一个子网-如何解决这个问题?

多个接口匹配同一个子网-如何解决这个问题?

我有一台带有局域网接口 (eth0) 和广域网接口 (wlan0) 的 raspberry pi 2 - usb wifi 适配器。我的操作系统是 raspbian。我想将我的 raspberry 用作 wifi AP。因此,有必要在我的 wlan0 上运行 ics-dhcp-server。

我想要一个共享的本地网络,这样 PC 和 Wi-Fi 客户端就可以互相看到。因此:

  • PC 通过有线连接连接到路由器 (192.168.254.4) 局域网,其静态 IP 范围为 192.168.254.1 - 192.168.254.99(192.168.254.4 除外)。Raspberry Pi 局域网 IP 为 192.168.254.97。
  • Wi-FI 客户端已连接到我的树莓派,其 IP 范围应为 192.168.254.201 - 192.168.254.250。树莓派 wlan IP 为 192.168.254.200。

互联网使用 MASQERADE 从 LAN 连接到 WLAN。

我的配置是:

/etc/dhcp/dhcpd.conf

subnet 192.168.254.0 netmask 255.255.255.0 {
interface wlan0;
    range 192.168.254.201 192.168.254.250;
    option broadcast-address 192.168.254.255;
        option routers 192.168.254.200;
    default-lease-time 600;
    max-lease-time 7200;
    option domain-name "local";
    option domain-name-servers 8.8.8.8, 8.8.4.4, 64.6.64.6, 64.6.65.6;
host wlan0 {
fixed-address 192.168.254.200;
}
}

/etc/default/isc-dhcp 服务器

INTERFACESv4="wlan0"

/etc/dnsmasq.conf

interface=wlan0
dhcp-range=192.168.254.201,192.168.254.250,255.255.255.0,24h

/etc/dhcpcd.conf

interface eth0
static ip_address=192.168.254.97
static routers=192.168.254.4
# 192.168.254.4 
static domain_name_servers=192.168.254.4
static domain_search=

interface wlan0
static ip_address=192.168.254.200/24
nohook wpa_supplicant
static routers=
static domain_name_servers=
static domain_search=

使用此配置时我尝试启动 isc-dhcp-server 时出现错误:

Multiple interfaces match the same subnet: eth0 wlan0
 Multiple interfaces match the same shared network: eth0 wlan0
 Can't bind to dhcp address: Address already in use

我的配置哪里有错误?

答案1

第一个错误是同一个子网中有多个接口。第二个错误是你是沉重混淆路由器的功能(伪装、提供 DHCP)以及接入点的作用(允许访问同一子网)。从某种意义上说,它们实际上做相反的事情。

  • 路由器连接两个所有的网络。它不连接同一网络的两个部分——毕竟,如果主机“位于同一子网中”,那么字面上地意味着无需通过路由器即可访问。

    因此,如果您想将 Raspberry Pi 用作路由器(带或不带 MASQUERADE),那么两个接口必须使用不同的网络号 - 两边不能相同为 192.168.254.0/24。

    但你说“我想要一个共享的本地网络”,所以你实际上想将您的 Raspberry Pi 用作路由器 – 您想将其用作接入点。

  • 接入点是不是路由器,它是一座桥梁。接入点不需要提供 DHCP,因为它只是将 DHCP 请求转发到您已有的上一个路由器。它也不需要“伪装”任何东西,因为它只处理单个网络。

    如果您希望 Wi-Fi 和以太网都位于 AP 的单个子网中,则必须明确桥接一起。一旦桥接,eth0 和 wlan0 将不再拥有自己的 IP 地址 - 只有桥接器本身“br0”才需要地址。

    (接入点提供 DHCP – 但前提是主路由器不支持。请记住,您需要一个共享网络,并且需要只有一个整个网络的 DHCP 服务器。)

因此,如果你想设置 AP,目前有关于“raspbian bridge”的文章,具体如下:https://www.raspberrypi.org/documentation/configuration/wireless/access-point-bridged.md也可在 Raspbian 上运行。

(但不是 https://www.raspberrypi.org/forums/viewtopic.php?t=132674– 这在谷歌搜索结果中排名很高,但它实际上告诉你如何设置路由器,不是桥梁。请忽略该页面。)

但简而言之,你应该做的是:

  1. 删除“MASQUERADE”防火墙规则(它仅适用于路由器,而不适用于网桥);

  2. 消除两个都来自 dhcpcd.conf 的“接口 eth0”和“接口 wlan0”;

  3. 配置/etc/systemd/network/br0.netdev通过systemd-networkd创建网桥:

    [NetDev]
    Name=br0
    Kind=bridge
    

    别忘了systemctl enable systemd-networkd

  4. 类似地,配置 systemd-networkd 以将 eth0 设置为 br0 的成员。(只有 eth0 - hostapd 本身将处理 wlan0。)

  5. 通过 systemd-networkd 或 dhcpcd(无所谓)为 br0 分配一个 IP 地址。

  6. 告诉 hostapd 将 wlan0 也放入网桥中:

    interface=wlan0
    bridge=br0
    

    (这必须通过 hostapd 完成,因为 wlan0 只有在实际切换到“接入点”模式时才可桥接。)

答案2

感谢你的回答。

我已经完成以下步骤:

  1. 删除了防火墙规则 MASQUERADE

  2. 从中删除接口 eth0 和 wlan0/etc/dhcpcd.conf

  3. 创建/etc/systemd/network/br0.netdev和:

    [NetDev]

    名称=br0

    种类=桥梁

  4. 创建/etc/systemd/network/br0-slave.network和:

    [匹配]

    名称 =eth0

    [网络]

    桥=br0

  5. 创建/etc/systemd/network/br0.network和:

    [匹配] 名称=br0

    [网络]

    地址=192.168.254.106/24

    网关=192.168.254.4

    DNS=192.168.254.4

  6. 我的/etc/hostapd/hostapd.conf现在是:

    接口=wlan0

    #国家=RU

    桥=br0

    驱动程序=nl80211

    #驱动程序=ath9k_htc

    #驱动程序=mt7601u

    ssid=某个名称

    硬件模式=g

    频道=7

    wmm_enabled=0

    macaddr_acl=0

    身份验证=1

    忽略广播 SSID = 0

    wpa=2

    wpa_passphrase=somepass

    wpa_key_mgmt=WPA-PSK

    wpa_pairwise=TKIP

    rsn_pairwise=CCMP

    logger_syslog=-1

  7. 此外,我还在我的/etc/rc.local,所以现在是:

    rfkill 解锁 wifi

    杀死wpa_supplicant

    出口 0

然后重新启动。现在我有一个可以上网的 AP,但是当我尝试使用 Raspberry 连接到任何服务器/站点时,没有连接(无法执行 apt-get install ... 或 ping google.com - 主机无法访问)。此外,我可以在 eth0 上看到旧 ip 地址(192.168.254.105),尽管它已在 /etc/dhcpcd.conf 中注释。我还能在哪里找到旧的 eth0 ip 地址并将其删除?

相关内容