如何在两个接口之间转发数据包?

vik*_*cks 7 networking linux routing forwarding

我的笔记本电脑(使用 Ubuntu 13.10)eth0通过 ip的有线连接连接到互联网192.168.42.13,它还充当ip的wifi hotspotat (我使用 airbase-ng 来设置 ap)。现在我有一个需要连接到那个 wifi 的 android 设备。我看到我的 android 能够连接到并从我设置的服务器接收以下网络设置。(我使用PlayStore 中的一个名为Net Info II的工具来查看我的 android 上的以下详细信息)。wlan0192.168.1.1hotspotdhcp

# My android network settings (connected to the wlan0 of my laptop):
ip address: 192.168.1.10
subnetmask: 255.255.255.0
gateway   : 192.168.1.254
ap-mac    : xx:xx:xx:xx:xx:xx

# My pc's eth0 configuration
ip address: 192.168.42.13
submetmask: 255.255.255.0
gateway   : 192.168.42.129
iface mac : yy:yy:yy:yy:yy:yy

# My pc's wlan0 (hotspot interface) configuration
ip address: 192.168.1.1
subnetmask: 255.255.255.0
gateway   : 192.168.1.1
iface mac : zz:zz:zz:zz:zz:zz
Run Code Online (Sandbox Code Playgroud)

此线程在这里谈论类似的问题。我知道我需要转发的数据包间eth0wlan0网络到无线AP的设备连接到互联网。现在,我如何转发我收到的数据包wlan0 to eth0,并eth0 to wlan0让我的设备连接到互联网?

use*_*067 7

您首先需要在您的系统上启用 IP 转发。只做一次,使用

sysctl -w net.ipv4.ip_forward=1
Run Code Online (Sandbox Code Playgroud)

或者

echo 1 > /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)

作为根。如果你想让它永久,编辑

/etc/sysctl.conf
Run Code Online (Sandbox Code Playgroud)

并添加一行包含

net.ipv4.ip_forward = 1
Run Code Online (Sandbox Code Playgroud)

这将在重新启动或运行时应用

sysctl -p /etc/sysctl.conf
Run Code Online (Sandbox Code Playgroud)

完成后,您可能需要 NAT 连接,因为您的路由器不太可能知道 192.168.1.0/24 网络可通过 192.168.42.13 访问。如果 192.168.42.13 是静态的,则可以使用

iptables -t nat -A POSTROUTING -i wlan0 -s 192.168.1.0/24 -j SNAT --to-source 192.168.42.13
Run Code Online (Sandbox Code Playgroud)

否则使用

iptables -t nat -A POSTROUTING -i wlan0 -s 192.168.1.0/24 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

检查Ubuntu IptablesHowTo以了解如何在重新启动时保存这些规则。

  • 我不能将 iptables -i 选项与 POSTROUTING 一起使用。这个命令帮了我:`iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE` (5认同)