总结linux路由技术
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