linux 高級路由即基於策略的路由比傳統路由在功能上更強大,使用也更靈活,它不僅能夠根據目的地址來轉發路徑而且也能夠根據報文大小、應用或ip源地址來選擇路由轉發路徑從而讓系統管理員能輕松做到:
1、 管制某台計算機的帶寬。
2、 管制通向某台計算機的帶寬
3、 幫助你公平地共享帶寬
4、 保護你的網絡不受DOS的攻擊
5、 保護你的Internet不受到你的客戶的攻擊
6、 把多台服務器虛擬成一台,並進行負載均衡或者提高可用性
7、 限制你的用戶訪問某些計算機
8、 限制對你的計算機的訪問
9、 基於用戶帳號、MAC地址、源IP地址、端口、QOS《TOS》、時間或者content等進行路由
一、高級路由的基礎IP ROUTE2
基本命令:
ip link list 顯示ip鏈路狀態信息
ip address show 除顯示所有網絡地址
ip route show 顯示主路由表信息
ip neigh show 顯示鄰居表
linux系統路由表
linux可以自定義從1-252個路由表,
linux系統維護了4個路由表:
0#表 系統保留表
253#表 defulte table 沒特別指定的默認路由都放在改表
254#表 main table 沒指明路由表的所有路由放在該表
255#表 locale table 保存本地接口地址,廣播地址、NAT地址 由系統維護,用戶不得更改
路由表的查看可有以下二種方法:
ip route list table table_number
ip route list table table_name
路由表序號和表名的對應關系在/etc/iproute2/rt_tables中,可手動編輯
路由表添加完畢即時生效,下面為實例
ip route add default via 192.168.1.1 table 1 在一號表中添加默認路由為192.168.1.1
ip route add 192.168.0.0/24 via 192.168.1.2 table 1 在一號表中添加一條到192.168.0.0網段的路由為192.168.1.2
注:各路由表中應當指明默認路由,盡量不回查路由表.路由添加完畢,即可在路由規則中應用..
二、高級路由重點之一路由規則 ip rule
進行路由時,根據路由規則來進行匹配,按優先級(pref)從低到高匹配,直到找到合適的規則.所以在應用中配置默認路由是必要的..
ip rule show 顯示路由規則
路由規則的添加
ip rule add from 192.168.1.10/32 table 1 pref 100
如果pref值不指定,則將在已有規則最小序號前插入
注:創建完路由規則若需立即生效須執行#ip route flush cache;刷新路由緩沖
可參數解析如下: &n
From -- 源地址
To -- 目的地址(這里是選擇規則時使用,查找路由表時也使用)
Tos -- IP包頭的TOS(type of sevice)域Linux高級路由-
Dev -- 物理接口
Fwmark -- iptables標簽
采取的動作除了指定路由表外,還可以指定下面的動作:
Table 指明所使用的表
Nat 透明網關
Prohibit 丟棄該包,並發送 COMM.ADM.PROHIITED的ICMP信息
Reject 單純丟棄該包
Unreachable丟棄該包, 並發送 NET UNREACHABLE的ICMP信息
具體格式如下:更強大,使用更靈活,它使網絡管理員不僅能
Usage: ip rule [ list | add | del ] SELECTOR ACTION
SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ][ dev STRING ] [ pref NUMBER ]
ACTION := [ table TABLE_ID ] [ nat ADDRESS ][ prohibit | reject | unreachable ]
[ flowid CLASSID ]
TABLE_ID := [ local | main | default | new | NUMBER ]
1.策略路由
基於策略的路由比傳統路由在功能上更強大,使用更靈活,它使網絡管理員不僅能夠根據目的地址而且能夠根據報文大小、應用或IP源地址來選擇轉發路 徑...
#/etc/iproute2/rt_tables 此文件存有linux 系統路由表默認表有255 254 253三張表
255 local 本地路由表 存有本地接口地址,廣播地址,已及NAT地址.
local表由系統自動維護..管理員不能操作此表...
254 main 主路由表 傳統路由表,ip route若沒指定表亦操作表254.一般存所有的路由..
注:平時用ip ro sh查看的亦是此表設置的路由.
253 default 默認路由表一般存放默認路由...
注:rt_tables文件中表以數字來區分表0保留最多支持255張表
路由表的查看可有以下二種方法:
#ip route list table table_number
#ip route list table table_name 路由表添加完畢,即可在策略路由表內添加路由例: #ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4 注:發往子網192.168.1.0/24的數據包通過分類4轉發配合tc使用,后文有介紹講解... #ip route add default via 192.168.1.1 table int1 #ip route add 192.168.1.0/24 via 192.168.1.1 table int2 #ip route add 172.16.0.2/16 via 172.16.0.1 table int3 注:各路由表中應當指明默認路由,盡量不回查路由表.路由添加完畢,即可在路由規則中應用..
#ip rule sh 顯示路由規則
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
進行路由時,正是根據路由規則來進行匹配,按優先級(pref后數值)從高到低匹配,直到找到合適的規則.所以在應用中配置默認路由是必要的..
策略路由一般手工添加路由表,路由表的添加只需編輯rt_tables文件,規定表序號,表名即可..
ip rule規則添加示例:
#ip rule add from 192.168.1.112/32 [tos 0x10] table test2 pref 999 prohibit
#ip rule add to 192.168.1.2 pref 1000 table test1
#ip rule add from 192.168.1.0/24 pref 1001 table test1
#ip rule add [from 0/0] table test1 pref 1003
#ip rule add fwmark 1 pref 1002 table test2 此句型配合iptables -t mangle應用.如先對數據 包作標記: #iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,8080,20,21 -s 192.168.1.0/24 -j MARK --set-mark 1
注:創建完路由規則若需立即生效須執行#ip route flush cache;刷新路由緩沖
可參數解析如下:
From -- 源地址
To -- 目的地址(這里是選擇規則時使用,查找路由表時也使用)
Tos -- IP包頭的TOS(type of sevice)域
Dev -- 物理接口
Fwmark -- 防火牆參數
采取的動作除了指定路由表外,還可以指定下面的動作:
Table 指明所使用的表
Nat 透明網關 Prohibit 丟棄該包,並發送 COMM.ADM.PROHIITED的ICMP信息
Reject 單純丟棄該包
Unreachable丟棄該包, 並發送 NET UNREACHABLE的ICMP信息
具體格式如下:
Usage: ip rule [ list | add | del ] SELECTOR ACTION
SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ][ dev STRING ] [ pref NUMBER ]
ACTION := [ table TABLE_ID ] [ nat ADDRESS ][ prohibit | reject | unreachable ]
[ flowid CLASSID ]
TABLE_ID := [ local | main | default | new | NUMBER ] 2.網卡捆綁(網關linux+多網卡) #modprobe bonding mod=1 miimon=200 primary=eth1 創建bond0,模式為1,主網卡eth1.. #ip addr add dev bond$ 10.0.0.1/24 設置bond0的IP #ifenslave bond0 eth1 eth2 添加綁定的dev 注:mode=0 輪轉均衡(默認模式),此模式MAC頻繁切換導致交換機負載大.. mode=1 主備模式 用primary指定網卡 mode=4 常用 802.3ad模式,動態鏈路采集模式.此模式要求SWITCH捆綁.. miimon=ms 每隔多少毫秒查詢鏈路是否有效. 其它參數如: arp_interval=ms arp_ip_target=*.*.*.* 另一種網卡捆綁固化方式: #vi /etc/modules.conf 加入以下行 alias bond0 bonding 系統在啟動時加載bonding模塊,對外虛擬網絡接口設備為 bond0..
#cd /etc/sysconfig/network-scripts #vi ifcfg-bond0 DEVICE=bond0 IPADDR=11.0.0.1 NETMASK=255.0.0.0 NETWORK=192.168.1.0 BROADCAST=192.168.1.255 ONBOOT=yes BOOTPROTO=none USERCTL=no #vi ifcfg-eth0 DEVICE=eth0 USERCTL=no ONBOOT=yes MASTER=bond0 SLAVE=yes BOOTPROTO=none #vi ifcfg-eth1 DEVICE=eth0 USERCTL=no ONBOOT=yes MASTER=bond0 SLAVE=yes BOOTPROTO=none
#/etc/init.d/network restart 重啟網絡服務驗證網卡的配置信息備份網卡被加上了NOARP標記 #cat /proc/net/bond0/info 查看bond信息 3.網橋(Linux+多網卡) 配置工具 brctlhttp://bridge.sourceforge.net/ 源 碼包名:bridge-utils-*形式 安裝第一步:autoconf 后類同於源碼包安裝.. 例.linu+二網卡eth0 eth1 配置成網橋 配置前去除加入網橋的eth0 eth1的IP #ifconfig eth0/eth1 down #ifconfig eth0/eth1 0.0.0.0 up #brctl addbr br0 #brctl addif br0 eth0 eth1 #ip li set dev br0 up #brctl showmacs br0 顯示網橋MAC
撤網橋: #ip li set dev br0 down #brctl delif br0 eth0 eth1 #brctl delbr br0 網橋接口處亦可進行流量控制,無Ip的linux網橋可有效防御外界的功擊,對linux網橋機的總控安全性高... 貼上一篇網橋應用實例,此實例是網橋的一種擴張應用... 腳本名:start_bridge.sh #!/bin/sh brctl addbr net1
brctl addif net1 eth0
ifconfig eth0 down
ifconfig eth0 0.0.0.0 up
ifconfig net1 192.168.5.1 up
#ip ro del 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.28 ip ro del 192.168.1.0/24
#route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.5.2 ip route add default via 192.168.5.2
echo "1" > /proc/sys/net/ipv4/ip_forward Linux高級路由需結合iptables才能充分體現其功能的強大,實際工作中的應用 多半基於此,當然要熟練掌握Linux高級路由+iptables 還需進一步的加強學習和實踐的應用...
指定ip 192.168.1.2全部數據走VPN網關
VPN_ifname=tap1 #openvpn接口是tap1
VPN_GATEWAY=10.0.0.1 #openvpn網關是10.0.0.1
VPN_ipaddr=10.0.0.2 #openvpn 獲取到的IP地址是10.0.0.2
vpn=100 # 路由table名
ip route add $VPN_GATEWAY dev $VPN_ifname src $VPN_ipaddr table $vpn #指定指定路由表100 中10.0.0.1走tap1
ip route add default via $VPN_GATEWAY table $vpn #指定路由表100默認網關為10.0.0.1
ip rule add from 192.168.1.2/32 table $vpn #添一個規則指定192.168.1.2 使用100表
#ip rule del from 192.168.1.2/32 table $vpn #刪除規則
ip route show table 100 #顯示路由表100
ip rule #顯示規則
openwrt上簡單的負載均衡
wan_gw=$(uci -p /var/state get network.wan.gateway)
wan_ifname=$(uci -p /var/state get network.wan.ifname)
wan_ip=$(uci -p /var/state get network.wan.ipaddr)
wan1_gw=$(uci -p /var/state get network.wan1.gateway)
wan1_ifname=$(uci -p /var/state get network.wan1.ifname)
wan1_ip=$(uci -p /var/state get network.wan1.ipaddr)
echo $wan_ip $wan_ifname $wan_gw
echo $wan1_ip $wan1_ifname $wan1_gw
ip route del default
ip route del default
ip route add default scope global nexthop via $wan_gw dev $wan_ifname weight 1 nexthop via $wan1_gw dev $wan1_ifname weight 1
#ip route add default scope global nexthop dev $wan_ifname nexthop dev $wan1_ifname
#ip route replace default scope global nexthop dev $wan_ifname nexthop dev $wan1_ifname
如果就這樣可以疊加網絡,但會經常出現掉線問題.
要從指定wan過來的請求走wan出,wan1 IP過來的請求從wan1出,這樣就不會出現掉線問題。
wan_table=110
wan1_table=111
ip rule flush
ip route add $wan_gw dev $wan_ifname src $wan_ip table $wan_table #指定指定路由表100 走wan網關
ip route add default via $wan_gw table $wan_table #指定路由表100默認網關為$wan_table
ip rule add dev $wan_ifname table $wan_table #添一個規則指定從$wan_ifname的數據包 使用100表
ip rule add fwmark $wan_table table $wan_table #此句型配合iptables -t mangle應用.如先對數據 包作標記
iptables -t mangle -A PREROUTING -i eth1 -m state --state NEW -j CONNMARK --set-mark $wan_table
#iptables -t mangle -A NWANPRE -i eth1 -m state --state NEW -j CONNMARK --set-mark $wan_table
#iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,8080,20,21 -s 192.168.1.0/24 -j MARK --set-mark 1
示例: 實現鏈路負載平衡.加入缺省多路徑路由,讓ppp0和ppp1分擔負載(注意:scope值並非必需,它只不過是告訴內核,這個路由要經過網關而不是直連的。實際上,如果你知道遠程端點的地址,使用via參數來設置就更好了)。
# ip route add default scope global nexthop dev ppp0 nexthop dev ppp1
# ip route replace default scope global nexthop dev ppp0 nexthop dev ppp1
示例4: 設置NAT路由。在轉發來自192.203.80.144的數據包之前,先進行網絡地址轉換,把這個地址轉換為193.233.7.83
# ip route add nat 192.203.80.142 via 193.233.7.83
示例: 實現數據包級負載平衡,允許把數據包隨機從多個路由發出。weight 可以設置權重.
# ip route replace default equalize nexthop via 211.139.218.145 dev eth0 weight 1 nexthop via 211.139.218.145 dev eth1 weight 1