将所有流量从 eth0 路由到 wlan0

将所有流量从 eth0 路由到 wlan0

我有一个 WiFi 接入点,通过 wlan0 上的 Raspberry Pi 连接到该接入点。我在 Raspberry Pi 上设置了一个 DHCP 服务器来提供 eth0 上的地址。我有一个旧的路由器设置连接到 eth0,然后它只是传输自己的接入点并执行一些其他操作。

它看起来有点像这样:

[main wifi AP] <-wlan0-> [raspberry pi] <- pi's eth0 -> (router/client)

DHCP 服务器给出的地址很好,但我在将流量从 eth0 路由到 wlan0 时遇到问题(不确定这是否有意义)。我也可以毫无问题地 ssh 进入 pi。

我正在使用 iptables 的一些规则来尝试执行此操作,但它似乎根本不起作用。我无法连接到本地网络之外的任何地址。例如,无论我在 Pi 和笔记本电脑之间使用路由器,我都无法连接到主 AP 通过 DHCP 向我的 Raspberry Pi 提供的 DNS 服务器。

这是转储iptables-save

# Generated by iptables-save v1.4.21 on Wed Feb 24 01:11:24 2016
*nat
:PREROUTING ACCEPT [1:32]
:INPUT ACCEPT [1:32]
:OUTPUT ACCEPT [7:432]
:POSTROUTING ACCEPT [5:336]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Wed Feb 24 01:11:24 2016
# Generated by iptables-save v1.4.21 on Wed Feb 24 01:11:24 2016
*filter
:INPUT ACCEPT [3:140]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5:308]
-A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o wlan0 -j ACCEPT
COMMIT
# Completed on Wed Feb 24 01:11:24 2016

有人知道为什么它无法连接到本地网络之外吗?

答案1

介绍

我将采取一些假设,因为没有足够的信息来制作完整且实用的示例,但更改应该是微不足道的。

假设

  1. RaspberryPi 的 wlan0 连接的网络是 192.168.1.0/24。
  2. RaspberryPi 的 eth0 连接的网络是 192.168.2.0/24。
  3. RaspberryPi 的 wlan0 设备已分配 IP 地址 192.168.1.1 和 eth0 192.168.2.1。

程序

  1. 删除RaspberryPi中所有iptables的东西。
  2. 允许 RaspberryPi 中的 IPv4 转发:

      # Execute as "root"
    echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
    sysctl -p
    
  3. 指示连接到 RaspberryPi 的 wlan0 网络的设备将其用作有线网络的网关。这将允许数据包从 192.168.1.0/24 遍历到 192.168.2.0/24,但对这些数据包的响应将无法返回(在下一点中解决)。

    • 如果您在无线网络中有一台 Linux 计算机,您可以添加一个临时路由,它可以帮助您测试配置,但无法在重新启动和其他事件中幸存(取决于 Linux 发行版,您可能必须编辑不同的文件才能持久建立此配置)。请记住,您必须等到下一个点才能获得成功的测试。简单来说,执行:

      ip route replace 192.168.2.0/24 via 192.168.1.1
      
  4. 指示连接到 RaspberryPi 的 eth0 网络的设备将其用作无线网络的网关。

    • 如果您在有线网络中有一台 Linux 计算机,您可以添加一条临时路由,它可以帮助您全面测试配置,但无法在重新启动和其他事件中幸存(取决于 Linux 发行版,您可以编辑不同的文件以便持久地建立此配置)。执行:

      ip route replace 192.168.1.0/24 via 192.168.2.1
      
    • 如果你想将 RaspberryPi 改为有线网络的默认网关,则上面的命令应更改为:

      ip route replace default via 192.168.2.1
      
    • 此外,您可能希望自动配置此新的默认网关。如果您在 RaspberryPi 中使用 ISC DHCP 服务器来为有线网络提供服务,您可以在“dhcp3.conf”配置文件的开头添加以下行,然后重新启动服务器,以使默认网关配置由 DHCP 提供服务:

      option routers 192.168.2.1
      

答案2

我用我的树莓派几乎完成了你所描述的事情。我用交叉电缆将其直接连接到笔记本电脑的以太网端口。我认为这很重要。我不确定您的配置有什么问题,但我怀疑有一些问题。我在笔记本电脑上运行这个脚本:

#!/bin/bash
/usr/bin/ip link set dev enp9s0 up
/usr/bin/ip addr add 172.16.1.1/24 dev enp9s0
sleep 10

modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
iptables -A FORWARD -o enp9s0 -i wlp0s26f7u3 -s 172.16.1.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

dhcpd -cf /etc/dhcpd.enp9s0.conf enp9s0

enp9s0是以太网端口的名称,wlp0s26f7u3是笔记本电脑上 USB 无线卡的名称。

该文件/etc/dhcpd.enp9s0.conf如下所示:

option domain-name "wlan";
option domain-name-servers 10.0.0.3;
option routers 172.16.1.1;
option ntp-servers 10.0.0.3;
default-lease-time 14440;
ddns-update-style none;
deny bootp;
shared-network intranet {
        subnet 172.16.1.0 netmask 255.255.255.0 {
                option subnet-mask 255.255.255.0;
                pool { range 172.16.1.50 172.16.1.200; }
        }
}

然后我打开 Raspberry Pi 的电源。几秒钟后,我可以使用它arp -a来查看它的硬件地址和IP地址(可能是172.16.1.50),然后ssh进入它。

相关内容