![iptables 伪装无法正常工作](https://linux22.com/image/125440/iptables%20%E4%BC%AA%E8%A3%85%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C.png)
我正在尝试使用 Raspberry Pi 来类似于网桥,通过使用iptables
with MASQUERADE
。尽管我知道有很多技术原因这不是一座桥,但我所需要做的就是将网络流量从硬连线端口获取eth0
到 Pi 连接到的无线网络wlan0
。然而,它似乎不起作用;尽管 Pi 上可以访问互联网,但我希望通过 Pi 连接到网络的计算机上的 DNS 失败。
按照说明进行操作这里,我使用了以下命令:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
wlan0
我希望它在启用后立即工作并运行 ,因此我将其添加到/etc/network/interfaces
一个post-up
子句中。我注意到 Pi 无法从网络上的 DHCP 正确获取网关,因此我在同一条语句中手动设置了该网关。以下是完整内容/etc/network/interfaces
:
auto lo
iface lo inet loopback
iface eth0 inet manual
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
post-up route add default gw 10.110.0.11; echo "1" > /proc/sys/net/ipv4/ip_forward ; iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
/etc/dhcpcd.conf
使用以下命令将 Pi 配置为具有静态 IP :
interface eth0
static ip_address=192.168.0.5/24
static routers=192.168.0.5
static domanin_name_servers=8.8.8.8 8.8.4.4
然后,在我希望接收连接的计算机上,我将其配置为在同一子网中拥有自己的 IP(我选择192.168.0.2
),具有相同的子网掩码 ( 255.255.255.0
),并将网关设置为192.168.0.5
。虽然我可以从计算机上看到 Pi(我可以 ping 并ssh
连接到它),但它似乎没有通过它接收互联网连接;我无法访问任何网站,DNS 查找失败。我该如何解决这个问题?
感谢您的帮助!
答案1
正如您自己所说,使用 NAT(通过 iptables 伪装)不会将 RaspPi 变成网桥。由于技术原因(WLAN 网络上的 3 地址模式),无论在何种硬件上,您都无法桥接 WLAN 和 LAN。
NAT 的作用是假装来自 RaspPi 后面 LAN 的流量确实源自 RaspPi 本身,因此 WLAN 只能看到每个主机(RaspPi)。无线局域网有什么作用不是所做的是以某种方式将第 2 层广播从 WLAN 转发到 LAN。但这是 DHCP 所需要的。
再多的摆弄iptables
也不会为你做到这一点。
所以最简单的选择是在RaspPi上运行DHCP服务器。这就是我所做的,而且效果确实很好。
如果由于某种原因你有要使用通过 WLAN 上的 DHCP 服务器提供的 DHCP 信息,因为它为您的计算机提供了超级特殊的自定义信息,而这些信息只能以这种方式发现(不太可能),因此变得更加棘手。限制仍然是整个程序集必须在 WLAN 上显示为单个主机,但您可以使用WLAN_卡贝尔假装该主机是单身的RaspPi LAN 上的设备。它的工作原理是绕过 Linux 网络堆栈(和 iptables)并直接重写第 2 层帧,在 LAN 和 WLAN 之间转发它们。它还将使您的 RaspPi 在 WLAN 上无法访问。
如果这还不够,而且你有要拥有多个设备,唯一的方法是在 WLAN 上启用 4 地址模式。这需要得到支持全部WLAN 设备本身就有令人头疼的问题,所以这确实是最后的手段。