linux两个网段默认网关_Linux下配置多网卡多网关
原標題:Linux下配置多網卡多網關
大家好,今天給大家介紹一下Linux下配置多網卡多網關的方法。@Hi-Linux
場景一 多運營商線路
比較典型的一種場景:一臺 Linux 服務器上有三個網口并接入三個不同運營商的網絡,以實現不同運營商用戶訪問其對應的網絡線路,來減少網絡延時。
服務器及對應網絡信息如下:
一臺 Ubuntu 16.04 server,這里一共使用三塊網卡。假定網絡信息如下:
網卡名稱
IP
網關
備注
enp0s5
192.168.100.212
192.168.100.1
電信線路
enp0s6
192.168.110.213
192.168.110.1
聯通線路
enp0s7
192.168.120.214
192.168.120.1
教育網線路
這里 IP 只是為了區分各運營商線路做的示例,實際情況請以運營商給出的網絡信息調整。
下面我們來看如何實現這樣的需求:
在 Linux 下一臺多網卡服務器不能同時配置兩個及以上的默認網關,因為默認網關(Default Gateway)只能配置一個,通過 gateway 參數配置的網關在這里實際為默認路由。
這里通過配置 Linux 下策略路由來實現,通過原線路返回的策略路由可以實現多線多 IP 同時在線。讓從同一運營商過來的請求由原運營商線路返回,比如:電信IP過來的請求按照電信路由返回,從網通IP過來的求從網通路由返回。
配置網絡
首先配置三塊網卡的基本網絡信息。$ vim /etc/network/interfacesauto enp0s5iface enp0s5 inet staticaddress 192.168.100.212netmask 255.255.255.0auto enp0s6iface enp0s6 inet staticaddress 192.168.110.213netmask 255.255.255.0auto enp0s7iface enp0s7 inet staticaddress 192.168.120.214netmask 255.255.255.0
重啟網絡$ /etc/init.d/networking restart
查看配置好的網絡情況$ ip a|grep enp0s2: enp0s5: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 192.168.100.212/24 brd 192.168.100.255 scope global enp0s53: enp0s6: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 192.168.110.213/24 brd 192.168.110.255 scope global enp0s64: enp0s7: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 192.168.120.214/24 brd 192.168.120.255 scope global enp0s7
查看各網卡當前路由$ ip route show192.168.100.0/24 dev enp0s5 proto kernel scope link src 192.168.100.212192.168.110.0/24 dev enp0s6 proto kernel scope link src 192.168.110.213192.168.120.0/24 dev enp0s7 proto kernel scope link src 192.168.120.214 增加路由表
Linux 中的路由由路由規則和路由表組成。路由規則指定當數據包滿足規則時,應轉交到哪個路由表;路由表根據數據包的信息,選擇下一跳。
可通過 ip rule 看當前的路由策略,如:
$ ip rule0: from all lookup local32766: from all lookup main32767: from all lookup default
從這里也可以看出在內核中最多支持 32768 條路由規則。這里的 main 表是系統主要的路由表,所有的路由規則都寫在這個表中。
查看 main 表$ ip route list table main192.168.100.0/24 dev enp0s5 proto kernel scope link src 192.168.100.212192.168.110.0/24 dev enp0s6 proto kernel scope link src 192.168.110.213192.168.120.0/24 dev enp0s7 proto kernel scope link src 192.168.120.214
Linux 中支持 256 張路由表,編號為 0 到 255,可直接使用編號操作,也可使用編號的別名操作,編號和其別名的對應關系在 /etc/iproute2/rt_tables 文件中。
默認有 local,main,default 三個路由表,這三個路由表的名稱命名就來自 /etc/iproute2/rt_tables。
$ cat /etc/iproute2/rt_tables## reserved values#255 local254 main253 default0 unspec## local##1 inr.ruhep
注:數字范圍為0-255,但0、255、254、253是保留的,不能使用。
增加三個路由表
在 /etc/iproute2/rt_tables 配置文件里面添加三個不同的路由表別名。增加三個路由表分別是: enp0s5:ChinaTel、enp0s5:ChinaCnc、enp0s5:ChinaEdu。
$ echo "101 ChinaTel" >> /etc/iproute2/rt_tables$ echo "102 ChinaCnc" >> /etc/iproute2/rt_tables$ echo "103 ChinaEdu" >> /etc/iproute2/rt_tables
因為這三個路由表的只是用來響應來自不同接口的,所以只需要每個路由表里面建立默認網關即可。
$ ip route add default via 192.168.100.1 dev enp0s5 table ChinaTel$ ip route add default via 192.168.110.1 dev enp0s6 table ChinaCnc$ ip route add default via 192.168.120.1 dev enp0s7 table ChinaEdu
如果要指定某一源 IP,可以加上 src 參數。
$ ip route add default via 192.168.100.1 dev eth0 src 192.168.100.212 table ChinaTel
查看新增路由表中內容$ ip route show table ChinaTeldefault via 192.168.100.1 dev enp0s5$ ip route show table ChinaCncdefault via 192.168.110.1 dev enp0s6$ ip route show table ChinaEdudefault via 192.168.120.1 dev enp0s7
增加路由原路返回規則,使來自不同的口的走不同的路由表。$ ip rule add from 192.168.100.212 table ChinaTel$ ip rule add from 192.168.110.212 table ChinaCnc$ ip rule add from 192.168.120.212 table ChinaEdu
注意:此處原路是廣義上的說法,并不是請求的路徑與響應的路徑完全相同。
如果要指定規則優先級,可以加上 pref 參數。pref 即路由表內序號,如果不加 pref,則將在已有的規則最小序號前插入。
$ ip rule add from 192.168.100.212/32 table ChinaTel pref 100
查看新增的路由規則$ ip rule0: from all lookup local32763: from 192.168.120.212 lookup ChinaEdu32764: from 192.168.110.212 lookup ChinaCnc32765: from 192.168.100.212 lookup ChinaTel32766: from all lookup main32767: from all lookup default
如果需要修改某一條路由規則,可根據優先級刪除指定路由規則后重新增加:
$ ip rule del prio 32767
至此訪問三個網段中的任意一個地址都能夠連通了。即便是服務器上本身的默認路由都沒有設置,也能夠讓外面的用戶正常訪問。如果你要在默認路由表增加一個默認路由,可以使用如下命令:
$ ip route add default via 192.168.100.1 dev enp0s5$ ip route show table maindefault via 192.168.100.1 dev enp0s5192.168.100.0/24 dev enp0s5 proto kernel scope link src 192.168.100.212192.168.110.0/24 dev enp0s6 proto kernel scope link src 192.168.110.213192.168.120.0/24 dev enp0s7 proto kernel scope link src 192.168.120.214
main 表是系統主要的路由表,所有的默認路由規則都寫在這個表中。命令匯總 # 清空路由表ChinaTel$ ip route flush table ChinaTel# 為路由表 ChinaTel 添加默認路由 192.168.100.1$ ip route add default via 192.168.100.1 dev enp0s5 table ChinaTel# 根據源 IP 決定路由表$ ip rule add from 192.168.100.212 table ChinaTel# 清空路由表ChinaCnc$ ip route flush table ChinaCnc# 為路由表 ChinaCnc 添加默認路由 192.168.110.1$ ip route add default via 192.168.110.1 dev enp0s6 table ChinaCnc# 根據源 IP 決定路由表$ ip rule add from 192.168.110.212 table ChinaCnc# 清空路由表ChinaEdu$ ip route flush table ChinaEdu# 為路由表 ChinaEdu 添加默認路由 192.168.120.1$ ip route add default via 192.168.120.1 dev enp0s7 table ChinaEdu# 根據源 IP 決定路由表$ ip rule add from 192.168.120.212 table ChinaEdu 測試
驗證從 192.168.100.212 的包的路由選擇$ ip route get 8.8.8.8 from 192.168.100.212# 結果為8.8.8.8 from 192.168.100.212 via 192.168.100.1 dev enp0s5cache
驗證從 192.168.110.213 的包的路由選擇$ ip route get 8.8.8.8 from 192.168.110.213# 結果為8.8.8.8 from 192.168.110.213 via 192.168.110.1 dev enp0s6cache
驗證從 192.168.120.214 的包的路由選擇$ ip route get 8.8.8.8 from 192.168.120.214# 結果為8.8.8.8 from 192.168.120.214 via 192.168.120.1 dev enp0s7cache
外部測試$ ping 192.168.100.212$ ping 192.168.110.213$ ping 192.168.120.214
以上幾個 IP 均能 Ping 通。
保存路由設置
以上的路由設置會在系統或網絡重啟后被清理。因此需要將它保存下來,以防止系統或網絡重啟后失效。
方法一(推薦)
ip route save 可保存表的信息,如果表的項非常多,這個操作起來非常簡單;ip rule 沒有專門的保存命令,這里通過腳本實現。
先保存指定路由表的信息,這里以 ChinaTel 為例:
$ ip route save table ChinaTel > /root/route-ChinaTel.rules
恢復時可使用
$ ip route flush table ChinaTel && ip route restore table ChinaTel < /root/route-ChinaTel.rules
對規則的保存可使用以下的小腳本
$ vim ip-rule-dump.sh#!/bin/sh# ip-rule-dump.sh# 參數: table 編號或別名,無參數時 dump 除 local 之外的全部規則# 獲取 table 別名if [ -n "$1" ]; thenname=$(grep -v '^[[:blank:]]*#' /etc/iproute2/rt_tables |grep "[[:blank:]]*$1[[:blank:]]" | head -n 1 | awk '{print $2}')[ -z "$name" ] && name="$1"fi[ -z "$name" ] && name=".*"# 獲取并使用別名過濾規則ip rule show | grep -v "^0:" | grep -oP "from.*[[:blank:]]$name[[:blank:]]$" |sed -e 's/lookup/table/g'
給腳本賦予權限并保存指定的路由規則
$ chmod +x ip-rule-dump.sh$ ./ip-rule-dump.sh ChinaTel > /root/rule-ChinaTel.rules
對規則的恢復可使用以下的小腳本
$ vim ip-rule-restore.sh#!/bin/sh# ip-rule-restore.sh# 參數: dump 文件路徑if [ -n "$1" ] && [ -f "$1" ]; thencat $1 | while read line; dosudo ip rule add $linedonefi
給腳本賦予權限并恢復指定的路由規則
$ chmod +x ip-rule-restore.sh$ ip rule del table ChinaTel >/dev/null 2>&1 || :$ ./ip-rule-restore.sh /root/rule-ChinaTel.rules
開機加載
如果需要在網卡準備完成就加載,就需要在 /etc/network/interfaces 的對應網卡上,加上 post-up 的操作了,這里以加載電信路由信息為例:
$ iface enp0s5 inet static...post-up ( ip rule del table ChinaTel >/dev/null 2>&1 || : ) && bash /root/ip-rule-restore.sh /root/rule-ChinaTel.rules && ip route flush table ChinaTel && ip route restore table ChinaTel < /root/route-ChinaTel.rules
方法二
直接把命令加入啟動腳本中,以防止網絡重啟或系統重啟后配置失效。
配置 networking 啟動腳本文件 在結尾 exit 0 之前增加如下內容:
如果是 ubuntu/debian,網絡啟動腳本是 /etc/init.d/networking
如果是 RedHat/centos,網絡啟動腳本是 /etc/rc.d/init.d/network這里以 ubuntu 為例:
$ vi /etc/init.d/networkingip route flush table ChinaTelip route add default via 192.168.100.1 dev enp0s5 table ChinaTelip rule add from 192.168.100.212 table ChinaTelip route flush table ChinaCncip route add default via 192.168.110.1 dev enp0s6 table ChinaCncip rule add from 192.168.110.212 table ChinaCncip route flush table ChinaEduip route add default via 192.168.120.1 dev enp0s7 table ChinaEduip rule add from 192.168.120.212 table ChinaEduexit 0
退出并重啟網絡測試是否生效
$ /etc/init.d/networking restart 場景二 給指定網段分別設置網關
這種方法使用的是默認路由表,增加到指定網段的路由。
使用 route 指令$ route add -net 192.168.100.0/24 gw 192.168.100.1 dev enp0s5$ route add -net 192.168.110.0/24 gw 192.168.110.1 dev enp0s6$ route add -net 192.168.120.0/24 gw 192.168.120.1 dev enp0s7
參數說明
-net 設置到某個網段的路由
-host 設置到某臺主機的路由
gw 出口網關 IP地址
dev 出口網關 物理設備名
使用 ip 指令# 推薦使用 replace 指令$ ip route replace 192.168.100.0/24 via 192.168.100.1 dev enp0s5 onlink$ ip route replace 192.168.110.0/24 via 192.168.110.1 dev enp0s6 onlink$ ip route replace 192.168.120.0/24 via 192.168.120.1 dev enp0s7 onlink# 直接使用 add 指令,會報 RTNETLINK answers: File exists 錯。如果要使用 add 指令,可先刪除原默認的路由規則后再增加。$ ip route del 192.168.100.0/24$ ip route add 192.168.100.0/24 via 192.168.100.1 dev enp0s5 onlink
注意:一塊網卡只能設置一個網關,多個網關會發生沖突而無法成功配置。
如需增加默認路由,可使用以下指令:
使用 route 指令$ route add default gw 192.168.100.1 dev enp0s5
使用 ip 指令$ ip route add default via 192.168.100.1 dev enp0s5
如有多余的配置,可使用下面的命令進行刪除路由。
使用 route 指令$ route del -net 192.168.100.0/24 gw 192.168.100.1或者$ route del -net 192.168.100.0/24 dev enp0s5
使用 ip 指令$ ip route del 192.168.100.0/24 參考文檔
http://www.google.com
http://www.cnblogs.com/fengyc/p/6533112.html
https://github.com/ttop5/ttop5.github.io/issues/11
http://longwind.blog.51cto.com/419072/806302
http://blog.csdn.net/moreorless/article/details/5397427
http://memoryboxes.github.io/blog/2014/12/30/linuxshuang-wang-qia-shuang-lu-you-she-zhi/
如果你覺得內容很贊,還等什么?快快長按打賞吧,iOS的土豪們也是可以的喲!
責任編輯:
總結
以上是生活随笔為你收集整理的linux两个网段默认网关_Linux下配置多网卡多网关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机 滑动_真的滑动屏,华为手机柔性屏新
- 下一篇: 分支定界法上下界_分支定界(Branch