Linux ip forward


Linux 默認帶有 ip forward 功能,只不過因為各種原因,默認的配置把該功能關閉了。本文通過 demo 來演示 Linux 的 ip forward 功能,具體場景為:開啟 Linux 的 ip forward 功能,讓 Linux 稱為具有路由能力的主機,從而支持在兩個局域網之間轉發數據包。演示環境的網絡結構如下圖所示:

本示例的演示環境為 Vmware Workstation,三台虛機的操作系統均為 Ubuntu 16.04。

配置虛機 computer1 的網卡

添加一個新的 network adapter(可以理解為虛機添加了一塊網卡),並選擇網絡連接方式為 "Custom:Specific virtual network",筆者選擇的虛擬交換機為 VMnet10:

應用上面的配置后,通過 ip addr 命令查看,筆者的虛機中多出了一個名為 ens38 的網卡:

下面我們來配置 ens38 的 IP 信息,打開並編輯 /etc/network/interfaces 文件,添加下面的內容:

auto ens38
iface ens38 inet static
address 192.168.1.5
netmask 255.255.255.0

保存上面的文件,然后重啟 networking 服務:

$ sudo systemctl restart networking

然后就可以看到 ens38 被分配了 IP 192.168.1.5:

配置虛機 computer2 的網卡

和虛機 computer1 相同,我們也為虛機 computer2 添加一塊虛擬網卡,需要注意的是,請選擇一個不同的虛擬交換機(筆者選擇的是 VMnet11):

筆者系統中新的網卡名稱也是 ens38,以同樣的方式設置該網卡的 IP 為 192.168.2.5,具體過程不再贅述:

配置 linux router 的網卡

為虛擬機 linux router 添加網卡,連接到虛擬交換機 VMnet10:

通過 ip addr 命令查看,發現新增了網卡 ens38,配置該網卡的 IP 地址為 192.168.1.254。注意,該網卡的 IP 與 computer1 的 IP 在同一個網段中(192.168.1.0/24)。
接着為 linux router 添加另一塊網卡並連接到虛擬交換機 VMnet11:

通過 ip addr 命令查看,發現新增了網卡 ens39,配置該網卡的 IP 地址為 192.168.2.254。注意,該網卡的 IP 與 computer2 的 IP 在同一個網段中(192.168.2.0/24)。也就是說 linux router 主機有一塊網卡連接網絡 192.168.1.0/24,另一塊網卡連接網絡 192.168.2.0/24:

在 /etc/network/interfaces 文件中添加的內容如下:

auto ens38
iface ens38 inet static
address 192.168.1.254
netmask 255.255.255.0

auto ens39
iface ens39 inet static
address 192.168.2.254
netmask 255.255.255.0

此時從 computer1 ping 192.168.1.254 是連通的:

從 computer2 ping 192.168.2.254 也是連通的:

但是 computer1 與 computer2 不能相互連通。

配置 linux router 的 ip forward

ip forward 屬於 linux 內核的功能,我們可以通過修改內核的參數來啟用或禁用該功能。先通過下面的命令查看 ip forward 功能是否啟用:

$ cat /proc/sys/net/ipv4/ip_forward

如果返回值為 1,說明該功能已經啟用,否則就是沒有啟用。Ubuntu 系統默認沒有啟用該功能,所以我們需要通過修改配置來啟用它。
其實非常簡單,編輯文件 /etc/sysctl.conf,去掉 net.ipv4.ip_forward=1 前面的注釋:

修改 /etc/sysctl.conf 文件后需要執行指令 sudo sysctl -p 后新的配置就會生效。通過這種方式修改后的配置會一直生效,包括重啟系統。如果想臨時測試一下 ip forward 功能,可以通過下面的命令臨時修改一下配置:

$ sudo sysctl -w net.ipv4.ip_forward=1

這樣在系統重啟后,配置就恢復為默認值了。

配置 linux router 的 iptables 規則

除了 ip forward,還需要為 linux router 主機添加適當的 iptables 規則:

$ sudo iptables -A FORWARD -i ens38 -o ens39 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i ens39 -o ens38 -j ACCEPT

添加這兩條 iptables 規則后,iptables 就能夠按照相應的規則的在我們設置的網卡之間(ens38 和 ens39)轉發數據包了。

為 computer1 和 computer2 添加路由規則

最后,我們需要為 computer1 和 computer2 添加合適的路由信息。
computer1 上的默認路由信息是不能把數據包路由到網絡 192.168.2.0/24 的。我們需要手動添加對應的路由信息:

$ sudo ip route add 192.168.2.0/24 via 192.168.1.254 dev ens38

這樣就完成了所有的配置。

檢查結果

讓我們從 computer1(192.168.1.5) ping computer2(192.168.2.5) 試試:

$ ping -c 3 192.168.2.5

從 computer1 可以成功 ping 到 computer2,說明我們配置的 linux ip forward 已經開始工作了!

參考:
How to Turn a Linux Server into a Router to Handle Traffic Statically and Dynamically – Part 10


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM