設置 Raspbian 網橋時遇到問題
我正在嘗試將樹莓派設置為無線接入點和路由器之間的網橋(原因是我想將設備連接到 AP 並
tc
在 pi 上使用來模擬糟糕的網路)。路由器連接到 pi ateth0
,AP 連接到 pi ateth1
(usb 到乙太網適配器)。我正在使用
dhcpcd
並dnsmasq
嘗試完成此操作。但是,即使我可以將設備連接到 AP 並且它提供了一個 ip 地址(dhcpcd.conf
在連接到 AP)。我在以下位置啟用了 ipv4 轉發
/etc/sysctl.conf
:
net.ipv4.ip_forward=1
dhcpcd.conf
對於我添加的預設值:# eth1 is connected to the AP interface eth1 # This is the ip address of the Raspberry Pi static ip_address=10.0.0.100/24 # This is the ip address of the router static routers=10.0.0.1
我的
dnsmasq.conf
樣子是這樣的(我不完全確定介面是否正確,我已將其設置為連接到 AP 的介面,但將其更改為eth0
似乎沒有任何區別):interface=eth1 listen-address=10.0.0.100 bind-interfaces server=8.8.8.8 server=8.8.4.4 domain-needed bogus-priv dhcp-range=10.0.0.110,10.0.0.130,4h
我執行這些命令來添加 iptable 規則(然後我將 iptables 保存到一個文件中,並在啟動時通過 恢復它們
rc.local
):sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE sudo iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
根據我的閱讀,上面的規則應該是通過 pi 正確轉發流量,但似乎並非如此。
我檢查了
dhcpcd
和dnsmasq
服務的狀態,但沒有看到任何看起來像錯誤的東西。
dhcpcd
地位:● dhcpcd.service - dhcpcd on all interfaces Loaded: loaded (/lib/systemd/system/dhcpcd.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/dhcpcd.service.d └─wait.conf Active: active (running) since Tue 2019-02-26 12:02:43 GMT; 29min ago Main PID: 368 (dhcpcd) CGroup: /system.slice/dhcpcd.service └─368 /sbin/dhcpcd -q -w Feb 26 12:02:43 raspberrypi dhcpcd[368]: eth0: offered 10.0.0.140 from 10.0.0.1 Feb 26 12:02:43 raspberrypi dhcpcd[368]: eth0: probing address 10.0.0.140/24 Feb 26 12:02:47 raspberrypi dhcpcd[368]: eth0: using IPv4LL address 169.254.202.179 Feb 26 12:02:47 raspberrypi dhcpcd[368]: eth0: adding route to 169.254.0.0/16 Feb 26 12:02:48 raspberrypi dhcpcd[368]: eth0: leased 10.0.0.140 for 86400 seconds Feb 26 12:02:48 raspberrypi dhcpcd[368]: eth0: adding route to 10.0.0.0/24 Feb 26 12:02:48 raspberrypi dhcpcd[368]: eth0: adding default route via 10.0.0.1 Feb 26 12:02:49 raspberrypi dhcpcd[368]: eth0: deleting route to 169.254.0.0/16 Feb 26 12:02:50 raspberrypi dhcpcd[368]: eth0: no IPv6 Routers available Feb 26 12:02:50 raspberrypi dhcpcd[368]: eth1: no IPv6 Routers available
dnsmasq
地位:● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2019-02-26 12:02:43 GMT; 33min ago Main PID: 401 (dnsmasq) CGroup: /system.slice/dnsmasq.service └─401 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -r /run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,19036,8,2,49aac11d7b6f6446702e54a1607371607a1a41855200fd2ce1cdde32f24e8fb5 --trust-anchor=.,20326,8,2,e06d44b80b8f1d39a95c0b0d7c65d0 Feb 26 12:02:50 raspberrypi dnsmasq-dhcp[401]: DHCPDISCOVER(eth1) a0:f3:c1:6d:2f:1b Feb 26 12:02:50 raspberrypi dnsmasq-dhcp[401]: DHCPOFFER(eth1) 10.0.0.129 a0:f3:c1:6d:2f:1b Feb 26 12:02:50 raspberrypi dnsmasq-dhcp[401]: DHCPDISCOVER(eth1) a0:f3:c1:6d:2f:1b Feb 26 12:02:50 raspberrypi dnsmasq-dhcp[401]: DHCPOFFER(eth1) 10.0.0.129 a0:f3:c1:6d:2f:1b Feb 26 12:02:58 raspberrypi dnsmasq-dhcp[401]: DHCPDISCOVER(eth1) a0:f3:c1:6d:2f:1b Feb 26 12:02:58 raspberrypi dnsmasq-dhcp[401]: DHCPOFFER(eth1) 10.0.0.129 a0:f3:c1:6d:2f:1b Feb 26 12:02:58 raspberrypi dnsmasq-dhcp[401]: DHCPREQUEST(eth1) 10.0.0.129 a0:f3:c1:6d:2f:1b Feb 26 12:02:58 raspberrypi dnsmasq-dhcp[401]: DHCPACK(eth1) 10.0.0.129 a0:f3:c1:6d:2f:1b TL-WR702N Feb 26 12:35:05 raspberrypi dnsmasq-dhcp[401]: DHCPREQUEST(eth1) 10.0.0.124 f4:5c:89:8e:aa:a1 Feb 26 12:35:05 raspberrypi dnsmasq-dhcp[401]: DHCPACK(eth1) 10.0.0.124 f4:5c:89:8e:aa:a1 george
在此狀態下,
TL-WR702N
是 AP,george
是連接到 AP 的設備。我很困惑我哪裡出錯了。我正在關注將 pi 設置為橋接器的教程
dnsmasq
,dhcpcd
並嘗試通過參考手冊頁來調試此問題,iptables
但無濟於事。設置後,pi已重新啟動。
查看連結教程(https://pimylifeup.com/raspberry-pi-wifi-bridge/)後,我可以得出結論,這不是一個橋接教程,而是一個 NAT/路由器教程。甚至其中的一條評論也指出:
另外,需要注意的是,這個設置是一個 wifi 客戶端 NAT 路由器,從技術上講不是一個網橋。
因此,要實際使用橋接器,請遵循橋接器教程。既然是 Raspbian,Debian 的BridgeNetworkConnections應該夠用了。提到的 bridge-utils 包並不真正需要它的(過時的)
brctl
命令,它可以完全替換為現代iproute2和ip link
(如果實際需要)bridge
,但它的bridge-utils-interfaces
外掛用於ifupdown的配置。因此,最後可以使用類似於以下內容的方式完成配置:
iface eth0 inet manual iface eth1 inet manual auto br0 iface br0 inet dhcp bridge_ports eth0 eth1
不要在真實介面上放置任何 IP,因為它們現在成為橋接埠,它們的第 3 層設置將被忽略。也不是很重要,但網橋應該繼承其第一個介面的 MAC 地址。因此,如果它真的很重要並且您更願意使用 eth1 的 MAC,請將其放在
bridge_ports
命令中的第一位(這可能也會更改路由器的 DHCP 提供)。現在更改
eth0
在各種設置中的任何引用,以將介面聲明為br0
,但您可能甚至不需要它,因為例如您不再需要dnsmasq
. 就是這樣。一些額外的資訊:
- 如果您曾經使用
iptables
替代或附加ebtables
嘗試在兩個介面之間進行過濾(提示:您可能不應該,它現在是一個網橋,而不是路由器,但它是有狀態透明防火牆網橋所需要的),請注意,如果啟動橋過濾和 IP 過濾層之間特殊互動的br-netfilter :基於 Linux 的橋上的 ebtables/iptables 互動。如果不知道,這可能會導致難以調試的結果。- 許多
tc qdisc
效果(如netem
)僅在傳出方向(出口)上起作用。由於您介於兩個介面eth0
和之間eth1
,因此您可以考慮始終可以為特定的預期操作找到一個出口介面,但如果它完成了,eth0
那麼 RPi 本身可能會在網際網路端受到影響,這可能不是所希望的. 您可以通過將中間功能塊設備(ifb0
)附加到 來避免這種情況eth1
:這會人為地在入口和網路程式碼的其餘部分之間插入一個介面。eth1
因此,從傳入數據流的角度來看,這個介面現在是一個出口介面,並且可以愉快地接受出口特性,如netem
. 對於任何其他解釋,它都是入口流的一部分。然後,您現在可以將 TC 應用到eth1
並ifb0
保持eth0
不受干擾。我的答案中有更多資訊:Simulation of packet loss on bridged interface using netem