乞丐並不會妒忌百萬富翁,可是他確定會妒忌收入更高的乞丐。 -- 羅素
從圖示中能夠看出:可以操做系統路由表的的有三個實體:linux
routed
route
netstat
命令其中,netstat
命令只能讀取路由信息沒法直接對系統路由表進行操做。git
增刪路由表信息,只能由路由守護程序 routed
與路由命令 route
提供。二者的區別在於:docker
守護程序 routed
提供動態路由管理功能,即經過實際網絡情況操做動態路由信息。bash
路由命令 route
則提供了供系統管理員修改靜態路由信息的接口。網絡
下面分別就:linux
系統與mac
系統進行命令對比介紹。app
# netstat $: netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 172.16.15.253 0.0.0.0 UG 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 ... # ip route $: ip route list default via 172.16.15.253 dev eth0 169.254.0.0/16 dev eth0 scope link metric 1002 172.16.0.0/20 dev eth0 proto kernel scope link src 172.16.5.102 ...
ip
命令是一個很是強大網絡管理命令,不單單是操做路由表。更多功能請參閱 man ip
或者 tldr ip
。tcp
$: netstat -rn
該系統不支持ip
命令。google
# 格式: ip route { add | del | change | append | replace } ROUTE # add $: ip route add 192.168.0.0/24 via 172.16.15.253 dev eth0 # del $: ip route del 192.168.0.0/24 via 172.16.15.253 dev eth0 # get 指定目的IP的路由信息 $: ip route get 172.18.0.10 172.18.0.10 dev br-6e39d6696d98 src 172.18.0.1 cache
不支持ip
命令, 提供獨立的route
命令。更多幫助參考 man route
spa
# add $: sudo route add -net 192.168.0.0/24 192.168.255.9 # del $: sudo route del -net 192.168.0.0/24 192.168.255.9 # get 指定目的IP的路由信息, 支持域名查詢 $: route get www.google.com route to: 74.125.24.105 destination: default mask: 128.0.0.0 gateway: 192.168.255.5 interface: utun1 flags: <UP,GATEWAY,DONE,STATIC,PRCLONING> recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 0 0 0 0 0 0 1500 0
除了咱們常說的系統路由表之外,系統中還有一個路由規則route rule
的概念。操作系統
IP Rule 子命令主要用於控制管理 ip 的路由規則。 所謂 rule
看起來更像是 table
.
這個規則主要管理控制的是路由表[IP Route Table]。即,所謂路由規則,就是路由表。
不妨先看看,默認狀況下,系統有哪些路由表:
$: ip rule [list] 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
默認狀況下,系統提供了 local
, main
, default
三張路由表。
再來看看這三張路由表的具體路由信息:
local
路由表,主要記錄了本地
$: ip route list table local broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 broadcast 172.17.0.0 dev docker0 proto kernel scope link src 172.17.0.1 ...
main
路由表,
$: ip route list table main default via 192.168.0.253 dev eth0 169.254.0.0/16 dev eth0 scope link metric 1002 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 ...
能夠和ip route
的輸出對比一下,能夠看出ip route
命令就是默認輸出main
路由表信息
再看看default
路由表, 能夠看出,默認狀況下,該表是空的。
ip rule
子命令做爲管理路由表的規則,有什麼具體意義呢?具體路由表中的路由信息又是如何路由的呢?
再看看ip rule list
的輸出,不難發現,這三張路由表
,又稱爲路由規則
。只不過路由規則
在路由表
的基礎上增長了優先級
的概念。優先級
能夠從具體路由表
條目前的數字得出。數字越低,優先級越高。
由此規則,咱們就能夠增長本身的路由規則
.按照各自要求設置優先級,以及具體路由表。
實際在操做ip rule
時,咱們經常是將數據包進行標記處理,經過對應標記來設置相應的路由表。
例如,咱們機器上有雙網卡,eth0與eth1,咱們對於全部服務進程發出的數據包,經過匹配具體服務的端口號進行標記,以下例子:
對全部來源端口是8080的數據輸出包進行標記處理,設置標記2
$: iptables -t mangle -A OUTPUT -p tcp --sport 8080 -j MARK --set-mark 2
既然數據包已經有了標記,既能夠具體按標記設置路由規則了。同上的例子,咱們首先增長一條路由規則。
# 標記2的數據包按照2號路由規則表路由 $: ip rule add priority 10000 fwmark 2 table 2
再給2號路由規則表添加具體的路由信息:
//取 eth1 的默認網關地址 $: gateway=`netstat -rn | grep eth1 | grep H | awk '{print $2}'` // 添加一條默認路由,使用該規則的包,默認經過網卡eth1進行路由 $: ip route add default via $gateway dev eth1 table 2
$: ip route list table 2
更多文章可直接訪問我的BLOG:GitDiG.com