Iptables

設置 Raspbian 網橋時遇到問題

  • March 15, 2019

我正在嘗試將樹莓派設置為無線接入點和路由器之間的網橋(原因是我想將設備連接到 AP 並tc在 pi 上使用來模擬糟糕的網路)。路由器連接到 pi at eth0,AP 連接到 pi at eth1(usb 到乙太網適配器)。

我正在使用dhcpcddnsmasq嘗試完成此操作。但是,即使我可以將設備連接到 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 正確轉發流量,但似乎並非如此。

我檢查了dhcpcddnsmasq服務的狀態,但沒有看到任何看起來像錯誤的東西。

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 設置為橋接器的教程dnsmasqdhcpcd並嘗試通過參考手冊頁來調試此問題,iptables但無濟於事。

設置後,pi重新啟動。

查看連結教程(https://pimylifeup.com/raspberry-pi-wifi-bridge/)後,我可以得出結論,這不是一個橋接教程,而是一個 NAT/路由器教程。甚至其中的一條評論也指出:

另外,需要注意的是,這個設置是一個 wifi 客戶端 NAT 路由器,從技術上講不是一個網橋。

因此,要實際使用橋接器,請遵循橋接器教程。既然是 Raspbian,Debian 的BridgeNetworkConnections應該夠用了。提到的 bridge-utils 包並不真正需要它的(過時的)brctl命令,它可以完全替換為現代iproute2ip 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 應用到eth1ifb0保持eth0不受干擾。我的答案中有更多資訊:Simulation of packet loss on bridged interface using netem

引用自:https://unix.stackexchange.com/questions/503126