Linux

Linux 在介面之間轉發數據包

  • May 12, 2017

我想在不使用 iptables 的情況下在介面之間轉發數據包。我並不反對 iptables 本身,我只是相信對於我的簡單需求來說沒有必要。但是我無法這樣做。我可以嗎?

場景如下:我在主機 A 上有一個無線介面和一個硬連線介面。我的無線網關的 IP 為 10.0.0.1。我的無線介面是 10.0.0.12。

所以我想如果我使用 sysctl 啟用埠轉發,並在網路上為我的有線介面創建一個 IP,然後為連接到有線介面的主機(稱為主機 B)創建一個路由表條目,那麼一切都應該很好, 不?

所以我有:

  • 無線的:

    • 網關 == 10.0.0.1
    • 主機A介面== 10.0.0.12
    • 主機 A 網路遮罩 == 255.255.255.0
  • 有線:

    • 主機A介面== 10.0.0.99
    • 主機 B 介面 == 10.0.0.100,插入主機 A。
    • 主機 B 的路由表條目,網路遮罩為 255.255.255.255。

我可以從主機 A ping 和 ssh 到主機 B。但是當我嘗試從主機 B ping 網關時,我在主機 A 的有線介面上看到了很多這些:

12:56:55.211866 ARP, Request who-has gateway tell 10.0.0.100, length 46
12:56:56.211751 ARP, Request who-has gateway tell 10.0.0.100, length 46
12:56:57.214187 ARP, Request who-has gateway tell 10.0.0.100, length 46
12:56:58.211834 ARP, Request who-has gateway tell 10.0.0.100, length 46
...

有什麼我遺漏的,還是我需要 iptables?

這是我在主機 A 上的路由表:

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.0.1        0.0.0.0         UG        0 0          0 wlp3s0
10.0.0.0        0.0.0.0         255.255.255.0   U         0 0          0 wlp3s0
10.0.0.100      0.0.0.0         255.255.255.255 UH        0 0          0 enp0s25

謝謝萬斯!

順便說一句,在主機 A 上:

# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

您不能有 2 個不同的網路塊具有相同的地址空間。因此,執行 ip_forward 沒有用,因為 ip_forward=1 用於路由。所以要麼你在兩個網路塊中使用不同的網路,要麼如果你真的想要這個設置,設置一個網橋。

如果在 Debian

$sudo apt-get install bridge-utils

vi /etc/network/interfaces

  allow-hotplug wlan0  
     iface wlan0 inet manual

  auto eth0   
     iface eth0 inet manual

  auto br0  
  iface br0 inet static  
  bridge_ports eth0 wlan0  
     address 10.0.0.1  
     netmask 255.255.255.0

$sudo service networking restart

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