Linux 默認帶有 ip forward 功能,只不過由於各類緣由,默認的配置把該功能關閉了。本文經過 demo 來演示 Linux 的 ip forward 功能,具體場景爲:開啓 Linux 的 ip forward 功能,讓 Linux 稱爲具備路由能力的主機,從而支持在兩個局域網之間轉發數據包。演示環境的網絡結構以下圖所示:linux
本示例的演示環境爲 Vmware Workstation,三臺虛機的操做系統均爲 Ubuntu 16.04。網絡
添加一個新的 network adapter(能夠理解爲虛機添加了一塊網卡),並選擇網絡鏈接方式爲 "Custom:Specific virtual network",筆者選擇的虛擬交換機爲 VMnet10:測試
應用上面的配置後,經過 ip addr 命令查看,筆者的虛機中多出了一個名爲 ens38 的網卡:spa
下面咱們來配置 ens38 的 IP 信息,打開並編輯 /etc/network/interfaces 文件,添加下面的內容:操作系統
auto ens38 iface ens38 inet static address 192.168.1.5 netmask 255.255.255.0
保存上面的文件,而後重啓 networking 服務:3d
$ sudo systemctl restart networking
而後就能夠看到 ens38 被分配了 IP 192.168.1.5:rest
和虛機 computer1 相同,咱們也爲虛機 computer2 添加一塊虛擬網卡,須要注意的是,請選擇一個不一樣的虛擬交換機(筆者選擇的是 VMnet11):code
筆者系統中新的網卡名稱也是 ens38,以一樣的方式設置該網卡的 IP 爲 192.168.2.5,具體過程再也不贅述:router
爲虛擬機 linux router 添加網卡,鏈接到虛擬交換機 VMnet10:blog
經過 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 不能相互連通。
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
這樣在系統重啓後,配置就恢復爲默認值了。
除了 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 上的默認路由信息是不能把數據包路由到網絡 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