一台服务器有两个 WiFi 接口,均通过网络管理器配置为热点。
已连接的客户端获得 10.42.0.0/24 和 10.42.1.0/24 范围内的 IP(据我所知,通过dnsmasq
NM 调用)。我需要能够将特定范围分配给特定接口。不幸的是,网络管理器会不可预测地分配它们(因此wlan0
今天可能获得 10.42.0.0,明天获得 10.42.1.0;然后wlan1
获得剩余范围),这会弄乱我的设置,iptables
因为这些接口的路由规则不同。
我尝试了dhcp-range=
选项/etc/dnsmasq.conf
(由于 NM 通过命令行配置,因此不存在dnsmasq
)和一些其他想法,但找不到可行的解决方案。
关于如何控制将哪个 IP 范围分配给哪个接口,您有什么想法吗?
答案1
经过数小时尝试不同的解决方案后,我终于能够使用网络管理器为热点连接指定子网,然后在客户端设备上为某种静态 IP 设置手动 IP。所有 dnsmasq/dhcp 方法均不适用于网络管理器。您必须编辑网络管理器连接文件。这些文件是在以下目录中为每个连接生成的:
/etc/NetworkManager/system-connections
我相信当您创建热点时,会创建一个新的连接文件,名为热点。您需要编辑此文件。确保您正在编辑热点连接文件,否则这将不起作用!更改/添加部分下的以下行[ipv4]
以设置子网。确保它有行method=shared
并使用您想要的任何 IP 地址address1=
,NetworkManager 将为所有连接设备发出同一子网中的 IP。此行的格式为address1=ip/subnetmask,gateway
。网关应与 IP 相同。以下是该[ipv4]
部分应有的样子:
[ipv4]
dns-search=
method=shared
address1=192.168.125.1/24,192.168.125.1
完成后,保存文件并运行以下命令重新启动网络管理器:
sudo service network-manager restart
现在,您连接的设备应该会获得与您输入的 IP 位于同一子网下的 IP 地址。在此示例中,该地址为 192.168.125.x。
要获取静态 IP,请在客户端设备上执行此操作。在同一子网下为此热点连接设置手动 IP,使用在热点连接文件中输入的相同子网掩码和网关。
以下是我的整个热点连接文件,供参考:
[connection]
id=Hotspot
uuid=14032jb9-43c6-41c6-8d56-8b6b0f7xcce9
type=wifi
interface-name=wlan0
permissions=
secondaries=
timestamp=1486816539
[wifi]
mac-address=7C:84:DB:62:7B:3F
mac-address-blacklist=
mac-address-randomization=0
mode=ap
seen-bssids=7C:84:DB:62:7B:3F;
ssid=yournetworkname
[wifi-security]
group=
key-mgmt=wpa-psk
pairwise=
proto=
psk=yourpassword
[ipv4]
dns-search=
method=shared
address1=192.168.125.1/24,192.168.125.1
[ipv6]
addr-gen-mode=stable-privacy
dns-search=
ip6-privacy=0
method=ignore
关于网络管理器中此设置的文档可以在这里阅读:
https://people.freedesktop.org/~lkundrak/nm-docs/nm-settings.html
表 36. ipv4 设置
密钥名称:方法
值类型:字符串
默认值:
值描述:IP 配置方法。NMSettingIP4Config 和 NMSettingIP6Config 都支持“auto”、“manual”和“link-local”。有关其他值,请参阅子类特定文档。通常,对于“auto”方法,“dns”和“routes”等属性指定添加到自动配置返回的信息中的信息。“ignore-auto-routes”和“ignore-auto-dns”属性会修改此行为。对于暗示没有上游网络的方法(例如“shared”或“link-local”),这些属性必须为空。对于 IPv4 方法“shared”,可以通过添加一个手动 IPv4 地址来配置 IP 子网,否则将选择 10.42.x.0/24。
最重要的部分:
对于 IPv4 方法“共享”,可以通过添加一个手动 IPv4 地址来配置 IP 子网,否则选择 10.42.x.0/24。
答案2
您可以通过配置一个手动地址来确定使用的 IPv4 子网,例如
nmcli connection modify $SHARED_NAME ipv4.addresses 192.168.2.5/24
其记录在 中man nm-settings
,请参阅 ipv4.method。
/etc/NetworkManager/dnsmasq.d 用于将 dnsmasq 用作 DNS 插件,而不是用于您的连接共享用例。对于此,它是 /etc/NetworkManager/dnsmasq-shared.d — 至少在 NM 的最新版本中。但您不需要它。
答案3
以下操作似乎可以正常工作 - 这些命令强制网络管理器将选定的 DHCP 范围分配给 Wifi 接入点(10.42.0.x 到 wifiname1;10.42.1.x 到 wifiname2):
nmcli connection modify wifiname1 ipv4.addresses 10.42.0.1
nmcli connection modify wifiname2 ipv4.addresses 10.42.1.1
注:wifinameN (N=1/2)
对应中的文件/etc/NetworkManager/system-connections
。
答案4
在nm-dnsmasq-manager.c
我们可以看到
listen_address = nm_ip4_config_get_first_address(ip4_config);
(大概这是ipv4.addresses
在 NetworkManager 中connection
)
并传递给公用事业nm-dnsmasq-utils.c
作为addr
我们可以看到, 使用一些默认的“智能规则”,addr
强制进入一个,使用及其...这意味着如果您选择,您将获得 192.168.0.1 的服务器(它使用网络地址进行修复),然后它还会将您的掩码配对为更小的掩码。创建后,这将传递给dhcp-range
addr
netmask
192.168.0.0/22
/24
first
last
nm_strv_ptrarray_add_string_printf(cmd, "--dhcp-range=%s,%s,60m", first, last);