我正在尝试创建一个强制门户 wifi 热点。
设置目的:
通过 wlan0 连接到热点的用户绝不应该被允许通过 eth1 访问互联网。
为了让“登录 wifi 网络”出现在 Android、iPhone 和任何可以连接的设备上,我正在尝试路由发送到
http://clients1.google.com/generate_204以及其他操作系统的其他 url,我还没有弄清楚,到我的本地服务器并返回真实服务器将返回的内容。
我使用 dnsmasq 和 hostapd 来实现这一点。
问题:当我在 dnsmasq.conf 中使用 address=/#/127.24.2.1 时,来自内部脚本的互联网请求也会失败。我想我遵循了 dnsmasq 配置手册页,其中说明了如何使用 dnsmasq 仅过滤 wlan0 接口流量。
我接下来该做什么?
该机器有这些接口
eth1 Link encap:Ethernet HWaddr 00:1e:06:30:5b:03
inet addr:192.168.0.107 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::21e:6ff:fe30:5b03/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:37047 errors:0 dropped:0 overruns:0 frame:0
TX packets:1752 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3351437 (3.1 MiB) TX bytes:176100 (171.9 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:796 errors:0 dropped:0 overruns:0 frame:0
TX packets:796 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:284838 (278.1 KiB) TX bytes:284838 (278.1 KiB)
wlan0 Link encap:Ethernet HWaddr 98:de:d0:1b:95:5a
inet addr:172.24.1.1 Bcast:172.24.1.255 Mask:255.255.255.0
inet6 addr: fe80::9ade:d0ff:fe1b:955a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:576 (576.0 B)
DNSMASQ 看起来像这样
interface=wlan0 # Use interface wlan0
listen-address=172.24.1.1 # Explicitly specify the address to listen on
#bind-interfaces # Bind to the interface to make sure we aren't sending things elsewher$
server=8.8.8.8 # Forward DNS requests to Google DNS
domain-needed # Don't forward short names
bogus-priv # Never forward addresses in the non-routed address spaces.
dhcp-range=172.24.1.50,172.24.1.150,12h # Assign IP addresses between 172.24.1.50 and 172.24$
address=/#/172.24.1.1
except-interface=eth1
我使用 nodejs express 服务器并执行此操作
app.get('/generate_204', function(req, res) {
console.log('generate 204 hit');
res.statusCode = 302;
res.setHeader("Location", "/");
res.end();
});
我使用 hostapd 创建了热点,配置如下
# This is the name of the WiFi interface we configured above
interface=wlan0
# Use the nl80211 driver with the brcmfmac driver
driver=nl80211
# This is the name of the network
ssid=Pi3-AP
# Use the 2.4GHz band
hw_mode=g
# Use channel 6
channel=6
# Enable 802.11n
ieee80211n=1
# Enable WMM
wmm_enabled=1
# Enable 40MHz channels with 20ns guard interval
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
# Accept all MAC addresses
macaddr_acl=0
# Use WPA authentication
auth_algs=1
# Require clients to know the network name
ignore_broadcast_ssid=0
# Use WPA2
wpa=2
# Use a pre-shared key
wpa_key_mgmt=WPA-PSK
# The network passphrase
wpa_passphrase=raspberry
# Use AES, instead of TKIP
rsn_pairwise=CCMP
我尝试解释需求,但我不确定解释部分是否做得好。我在 serverfault 上针对同一问题提出了另一个问题,但该问题被标记为离题,阅读它会让你清楚地了解需求。https://serverfault.com/questions/823139/iptables-for-linux-captive-portal-wifi-hotspot
答案1
当我使用 address=/#/127.24.2.1 时,来自内部脚本的互联网请求也会失败
看起来您的内部脚本使用与您的 wifi 客户端相同的本地 dnsmasq 服务器来解析 DNS 名称。
检查您的/etc/resolv.conf
配置,如果存在您的 dnsmasq 服务器地址(127.24.2.1
或127.0.0.1
其他) - 将其删除。而是使用您的 ISP DNS 服务器、Google DNS 或任何其他您喜欢的服务器,这些服务器不会替换任何地址127.24.2.1
。
笔记。如果您的系统使用解析配置生成/etc/resolv.conf
(在解析配置文件出现类似这样的警告# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
),那么您需要编辑配置/etc/resolvconf/resolv.conf.d/
,然后重新生成/etc/resolv.conf
(重新启动网络或更好 - 重新启动整个系统)
另一种可能性:删除包解析配置并编辑/etc/resolv.conf
答案2
如果有人对这个问题的更新(2017年)感到好奇......我能够重新创建该问题并找到解决方案。
禁用 dnsmasq 解析环回接口(在 中/etc/dnsmasq.conf
):
except-interface=lo
添加到 resolvconf 的尾部文件(在/etc/resolvconf/resolvconf.conf.d/tail
)
nameserver 8.8.8.8
重启服务
sudo systemctl restart dnsmasq
sudo resolvconf -u
它的作用
dnsmasq
现在将拒绝本地主机上的任何 DNS 请求,然后本地主机将不得不使用第二个名称服务器(现在是 8.8.8.8)
如果没有/etc/resolvconf/resolvconf.conf.d/
目录怎么办?
您可能安装了 openresolv... 我卸载了 openresolv 并安装了 resolvconf。您会遇到其他问题 - 但这可能与此答案无关。
答案3
如果我理解正确的话,您要做的就是:强制所有设备打开强制门户……?无论您是否提供互联网。只需修改“hosts”文件,也许还有“dhcp”文件。
主办方:
1.2.3.4 clients1.google.com
1.2.3.4 clients3.google.com
1.2.3.4 clients.4.google.com
1.2.3.4 www.msftconnecttest.com
1.2.3.4 mobile-gtalk.l.google.com
DHCP:
config domain
option name 'connectivitycheck.gstatic.com'
option ip '1.2.3.4'
config domain
option name 'clients1.google.com'
option ip '1.2.3.4'
config domain
option name 'clients3.google.com'
option ip '1.2.3.4'
config domain
option name 'clients.4.google.com'
option ip '1.2.3.4'
config domain
option name 'www.msftconnecttest.com'
option ip '1.2.3.4'
别客气。问候