如何管理系統路由表

乞丐並不會妒忌百萬富翁,可是他確定會妒忌收入更高的乞丐。 -- 羅素

1 路由原理

從圖示中能夠看出:可以操做系統路由表的的有三個實體:linux

  • 路由守護程序 routed
  • 路由命令 route
  • netstat命令

其中,netstat命令只能讀取路由信息沒法直接對系統路由表進行操做。git

增刪路由表信息,只能由路由守護程序 routed與路由命令 route提供。二者的區別在於:docker

守護程序 routed提供動態路由管理功能,即經過實際網絡情況操做動態路由信息。bash

路由命令 route 則提供了供系統管理員修改靜態路由信息的接口。網絡

下面分別就:linux系統與mac系統進行命令對比介紹。app

2 路由表查詢

2.1 Linux

# 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 iptcp

2.2 MacOS

$: netstat -rn

該系統不支持ip命令。google

3 路由表操做

3.1 Linux

# 格式: 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

3.2 MacOS

不支持ip命令, 提供獨立的route命令。更多幫助參考 man routespa

# 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

4 路由規則

除了咱們常說的系統路由表之外,系統中還有一個路由規則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的輸出,不難發現,這三張路由表,又稱爲路由規則。只不過路由規則路由表的基礎上增長了優先級的概念。優先級能夠從具體路由表條目前的數字得出。數字越低,優先級越高

4.1 自定義路由規則

由此規則,咱們就能夠增長本身的路由規則.按照各自要求設置優先級,以及具體路由表。

實際在操做ip rule時,咱們經常是將數據包進行標記處理,經過對應標記來設置相應的路由表。

4.1.1 對數據包進行標記

例如,咱們機器上有雙網卡,eth0與eth1,咱們對於全部服務進程發出的數據包,經過匹配具體服務的端口號進行標記,以下例子:

對全部來源端口是8080的數據輸出包進行標記處理,設置標記2

$: iptables -t mangle -A OUTPUT -p tcp --sport 8080 -j MARK --set-mark 2

4.1.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

4.2 查看路由規則信息

$: ip route list table 2

更多文章可直接訪問我的BLOG:GitDiG.com

相關文章
相關標籤/搜索