Linux系統的route命令用於顯示和操作IP路由表,要實現兩個不同的網段之間的通訊,需要一臺連線兩個網路的路由器,或者同時連線位於兩個網路的閘道器來實現。
在Linux系統中,設定路由通常是為了解決以下問題:該Linux系統在一個區域網中,區域網中有一個閘道器,能夠讓機器訪問Internet,那麼就需要將這臺機器的IP地址設定為Linux機器的預設路由。要注意的是,直接在命令列下執行route命令來新增路由,不會永久儲存,當網絡卡重啟或者機器重啟之後,該路由就失效了;可以在/etc/rc.local中新增route命令來保證該路由設定永久有效。
普通路由表檢視
route -n
第一個Destination是目標地址:
Gateway:閘道器地址,本機所在網段閘道器一律通過0.3出去
Iface:是通過那塊網絡卡出去:我這裡只有一塊網絡卡eth0
具體可以使用下列命令實現:
ip ro add 192.168.3.0/24 via 192.168.0.3
ip ro add 192.168.4.0/22 via 192.168.0.3
ip ro add 192.168.8.0/22 via 192.168.0.3
ip ro add 192.168.50.0/24 via 192.168.0.3
ip ro add 192.168.64.0/22 via 192.168.0.3
高階路由檢視
ip rule show
ip rule show顯示的內容,大體上可以分為三段:
第一段:冒號之前的數字,表示該路由表被匹配的優先順序,數字越小,越早被匹配。這個優先級別範圍是0~4億多。預設0、32766、32767三個優先級別已被佔用。如果在新增規則時沒有定義優先級別,那麼預設的優先級別會從32766開始遞減,可以通過prio ID引數在設定路由表時新增優先順序。
第二段:from關鍵字,這裡顯示的是匹配規則,當前表示的是從哪裡來的資料包,除了from關鍵字外,還有to到、tos、fwmark、dev裝置等等。
第三段:loacl/main/default 這些都是路由表名稱,表示資料包要從那個路由表送出去。local表包含本機路由及廣播資訊,main表就是我們route -n看到的內容,default表,預設為空。
在新增規則時,需要先定義好優先順序、條件及路由表ID,然後才可以新增規則。如下例:
#根據源地址決定路由表
ip rule add from 192.168.10.0/24 table 100
ip rule add from 192.168.20.20 table 110
#根據目的地址決定路由表
ip rule add to 192.168.30.0/24 table 120
ip rule add to 192.168.40.0/24 table 130
#根據網絡卡裝置決定路由表
ip rule add dev eth0 table 140
ip rule add dev eth1 table 150
#此外還可以根據其他條件進行設定,例如tos等等
上面的路由表都是用100、110、120、130等數字表示的,時間一久難免自己也會忘記該路由表的作用,不過iproute提供了一個路由表和名稱的對應表(/etc/iproute2/rt_tables),可以手動修改該表。
高階路由技術:linux雙線策略路由
雙線伺服器有2個外網網絡卡,一個配電信IP, 一個配網通IP.
策略路由讓電信網的資料走電信網絡卡,電信閘道器; 網通的資料走網通的網絡卡,網通閘道器。一個指令碼簡單實現
#!/bin/sh
grep cnc /etc/iproute2/rt_tables > /dev/null
if [ $? = 1 ];then
echo 200 cnc >> /etc/iproute2/rt_tables
fi
grep ctc /etc/iproute2/rt_tables > /dev/null
if [ $? = 1 ];then
echo 201 ctc >> /etc/iproute2/rt_tables
fi
CNC_DEVICE="eth1"
CNC_RULE="cnc"
CNC_NETWORK=`ip ro li | grep ${CNC_DEVICE} |awk '{print $1}'| sed 'q'`
CNC_GATEWAY=`grep "GATEWAY" /etc/sysconfig/network-scripts/ifcfg-${CNC_DEVICE} |awk -F "=" '{print $2}'`
CNC_IPADDR=`grep "IPADDR" /etc/sysconfig/network-scripts/ifcfg-${CNC_DEVICE} |awk -F "=" '{print $2}'`
CTC_DEVICE="eth0"
CTC_RULE="ctc"
CTC_NETWORK=`ip ro li | grep ${CTC_DEVICE} |awk '{print $1}'| sed 'q'`
CTC_GATEWAY=`grep "GATEWAY" /etc/sysconfig/network-scripts/ifcfg-${CTC_DEVICE} |awk -F "=" '{print $2}'`
CTC_IPADDR=`grep "IPADDR" /etc/sysconfig/network-scripts/ifcfg-${CTC_DEVICE} |awk -F "=" '{print $2}'`
if (($# != 0)); then
if [ "$1" != "add" -a "$1" != "del" ]; then
echo "error"
else
ACTION="$1"
fi
fi
ip route add ${CNC_NETWORK} dev ${CNC_DEVICE} src ${CNC_IPADDR} table ${CNC_RULE}
ip route add default via ${CNC_GATEWAY} table ${CNC_RULE}
ip route add ${CTC_NETWORK} dev ${CTC_DEVICE} src ${CTC_IPADDR} table ${CTC_RULE}
ip route add default via ${CTC_GATEWAY} table ${CTC_RULE}
ip rule add from ${CNC_IPADDR} table ${CNC_RULE}
ip rule add from ${CTC_IPADDR} table ${CTC_RULE}
linux 下ipsec 配置gre隧道技術
環境:兩臺linux伺服器,分別在兩地。並且兩臺機器都有實ip與網際網路向連結,能夠互相通訊。組成一個互通的區域網
-------------------------------------INTERNET------------------------------------
| 192.168.100.0/24 | 203.74.199.50 <------> 101.231.125.226 |192.168.0.0/16|
|- - - - | | - - - -|
| eth1 | eth0 | | eth0 | eth1 |
---------------------------------------------------------------------------------
在 203.74.199.50 上建立:
modprobe ipip
ip tunnel add tun1 mode ipip remote 101.231.125.226 local 203.74.199.50 ttl 64
ip link set tun1 mtu 1480 up
ip address add 192.168.200.253 brd 255.255.255.255 peer 203.74.199.50 dev tun1
ip route add 192.168.200.0/24 via 192.168.200.253
在101.231.125.226上建立:
modprobe ipip
ip tunnel add tun1 mode ipip remote 203.74.199.50 local 101.231.125.226 ttl 64
ip link set tun1 mtu 1480 up
ip address add 192.168.100.253 brd 255.255.255.255 peer 203.74.199.50 dev tun1
ip route add 192.168.0.0/16 via 192.168.100.253
#!/bin/bash
##
## 基於 Linux 的 IP 隧道控制指令碼
## Jack.Li
## V0.2
## 2008-10-11 20:06
##
# VPN 遠端裝置IP
REMOTE_ADDR='122.228.192.2'
# VPN 本地出口裝置IP
LOCAL_ADDR='203.74.199.50'
# VPN 本地出口裝置
LOCAL_DEV='eth0'
# VPN 虛擬裝置名
TUN_NAME='tun100'
# VPN 模式,可為 ipip gre
MODE='gre' # ipip gre
# VPN 本地IP
TUN_IPADDR='192.168.254.50'
# VPN 閘道器 IP
TUN_GATEWAY='192.168.254.50'
# 附加路由,以陣列的形式儲存
ROUTE_ADD=('192.168.0.0/16' "10.10.0.0/16" "192.168.254.2")
#####
ACTION="up"
if (($# != 0)); then
if [ "$1" != "up" -a "$1" != "down" ]; then
echo "error"
exit 1
else
ACTION="$1"
fi
fi
if ((`lsmod | grep -c "ip_gre"` == 0));then
modprobe ip_gre
fi
if [ "${ACTION}" = "up" ]; then
if ((`ifconfig | grep -c ${TUN_NAME}` > 0)); then
exit 1
fi
ip tunnel add ${TUN_NAME} mode ${MODE} remote ${REMOTE_ADDR} local ${LOCAL_ADDR} dev ${LOCAL_DEV} ttl 64
ip link set ${TUN_NAME} up
ip addr add ${TUN_IPADDR} dev ${TUN_NAME}
#ip route add ${TUN_GATEWAY} dev ${TUN_NAME}
for((i=0;i<=${#ROUTE_ADD[@]}-1;i++));do
ip route add ${ROUTE_ADD[${i}]} dev ${TUN_NAME} via ${TUN_GATEWAY}
done
fi
if [ "${ACTION}" = "down" ]; then
if ((`ifconfig | grep -c ${TUN_NAME}` > 0)); then
echo "down ${TUN_NAME}"
ip link set ${TUN_NAME} down
ip tunnel del ${TUN_NAME}
fi
fi