本文主要讲述一下Linux环境下路由及网关的配置。
Linux系统的route命令用于显示和操作IP路由表(show/manipulate the IP routing table)。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问internet,那么就需要将网关地址设置为该Linux机器的默认路由。需要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;可以在/etc/rc.local中添加route命令来保证该路由设置永久有效。
我们通过route --help查看route命令的基本用法:
# route --help
Usage: route [-nNvee] [-FC] [<AF>] List kernel routing tables
route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.
route {-h|--help} [<AF>] Detailed usage syntax for specified AF.
route {-V|--version} Display version/author and exit.
-v, --verbose be verbose
-n, --numeric don't resolve names
-e, --extend display other/more information
-F, --fib display Forwarding Information Base (default)
-C, --cache display routing cache instead of FIB
<AF>=Use -4, -6, '-A <af>' or '--<af>'; default: inet
List of possible address families (which support routing):
inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
x25 (CCITT X.25)
上面可以看到,我们可以使用route命令来列出或修改当前路由表信息。
下面我们来看一下当前系统的Linux内核路由表信息:
# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default bogon 0.0.0.0 UG 100 0 0 ens33 192.168.79.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0 # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.79.2 0.0.0.0 UG 100 0 0 ens33 192.168.79.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
这里我们简单介绍一下route命令的各输出项:
这里再说明一下网络掩码为0.0.0.0和255.255.255.255时表示的含义: 1) 因为0.0.0.0表示所有地址,例如默认路由0.0.0.0 192.168.79.2 0.0.0.0表示所有地址通过192.168.79.2转发; 2) 255.255.255.255是受限广播地址,但在实际使用中,你会看到用255.255.255.255作为子网掩码,此时它表示单一主机IP地址;
U (route is up): 路由是活动的 H (target is a host): 目标是一个主机而非网络 G (use gateway): 需要透过外部的主机(gateway)来转递封包 R (reinstate route for dynamic routing): 使用动态路由时,对动态路由进行复位设置的标志 D (dynamically installed by daemon or redirect): 由后台程序或转发程序动态安装的路由 M (modified from routing daemon or redirect): 由后台程序或转发程序修改的路由 A (installed by addrconf): 由addrconf安装的路由 C (cache entry): 缓存的路由信息 ! (reject route): 这个路由将不会被接受(主要用来抵御不安全的网络)
1) 主机路由
主机路由是路由选择表中指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H。例如,在下面的示例中,本地主机通过IP地址192.168.1.1的路由器到达IP地址为10.0.0.10的主机:
Destination Gateway Genmask Flags Metric Ref Use Iface ----------- ----------- -------------- ----- ------ --- --- ------ 10.0.0.10 192.168.1.1 255.255.255.255 UH 100 0 0 eth0
2) 网络路由
网络路由是代表主机可以到达的网络。网络路由的Flags字段为G。例如,在下面的示例中,本地主机将发送到网络192.19.12.0的数据包转发到IP地址为192.168.1.1的路由器上:
Destination Gateway Genmask Flags Metric Ref Use Iface ----------- ------- ------- ----- ----- --- --- ----- 192.19.12.0 192.168.1.1 255.255.255.0 UG 0 0 0 eth0
3) 默认路由
当主机不能在路由表中查找到目标主机的IP地址或网络路由时,数据包就被发送到默认路由(默认网关)上。默认路由的Flags字段为G。例如,在下面的示例中,默认路由是指IP地址为192.168.1.1的路由器。
Destination Gateway Genmask Flags Metric Ref Use Iface ----------- ------- ------- ----- ------ --- --- ----- default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
1) route命令
设置和查看路由表都可以用route命令,设置内核路由表的命令格式是:
# route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
其中:
2) route命令使用举例
# route add -host 192.168.1.2 dev eth0 # route add -host 10.20.30.148 gw 10.20.30.40
一般来说,对于主机路由可以不用指定netmask,因为其默认就是255.255.255.255。而网关如果不指定的话,则默认为0.0.0.0(表示未指定)
# route add -net 10.20.30.40 netmask 255.255.255.248 eth0 #添加10.20.30.40的网络 # route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41 #添加10.20.30.48的网络 # route add -net 192.168.1.0/24 eth1
# route add default gw 192.168.1.1
# route del -host 192.168.1.2 dev eth0:0 # route del -host 10.20.30.148 gw 10.20.30.40 # route del -net 10.20.30.40 netmask 255.255.255.248 eth0 # route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41 # route del -net 192.168.1.0/24 eth1 # route del default gw 192.168.1.1
# route add -net 224.0.0.0 netmask 240.0.0.0 reject
增加一条屏蔽的路由,目的地址为 224.x.x.x 将被拒绝
3) 设置包转发
在Centos中默认的内核配置已经包含了路由功能,但默认并没有在系统启动时启用此功能。开启Linux的路由功能可以通过调整内核的网络参数来实现。要配置和调整内核参数可以使用sysctl命令。例如: 要开启Linux内核的数据包转发功能可以使用如下命令
# sysctl -a # 查看所有内核参数
# sysctl -w net.ipv4.ip_forward=1
# echo "1" > /proc/sys/net/ipv4/ip_forward # 临时开启
这样设置之后,当前系统就能实现包转发,但下次启动计算机时将失效。为了使在下次启动计算机时仍然有效,需要将下面的行写入配置文件’/etc/sysctl.conf’文件中:
# vi /etc/sysctl.conf net.ipv4.ip_forward = 1
用户还可以使用如下命令查看当前系统是否支持包转发:
# sysctl net.ipv4.ip_forward
前面我们说道直接通过route命令设置的路由是临时的,如果要在重启服务器之后路由依然生效。那么有如下两种方法:
1) 在/etc/rc.local中添加
这里我们可以直接将命令行操作的命令保存到该文件即可。
2) 在/etc/sysconfig/static-routes文件里面写入
首先我们来参看/etc/init.d/network文件,我们看到有如下一段:
# Add non interface-specific static-routes.
if [ -f /etc/sysconfig/static-routes ]; then
if [ -x /sbin/route ]; then
grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do
/sbin/route add -$args
done
else
net_log $"Legacy static-route support not available: /sbin/route not found"
fi
fi
从这里我们知道,如果要添加不针对特定网络接口的静态路由的话,我们可以将路由信息添加到/etc/sysconfig/static-routes文件中(文件如果不存在,则创建一个)。
前面我们通过命令添加一条路由的命令为:
# route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0
那么,在/etc/sysconfig/static-routes文件中添加格式为:
any -net 192.56.76.0 netmask 255.255.255.0 dev eth0
两种方式添加静态路由对比:
1) rc.local
重启服务器生效; 重启网络服务,则静态路由失效; rc.local是系统启动后最后运行的一个脚本,因此如果有如NFS需要网络才能挂载的服务需求,则该方式不适合;
2) static-routes
重启服务器生效; 重启网络服务生效; 适合需要网络需求的服务;
而对于脚本添加静态路由的方法则和rc.local差不多。这种方法其实也是自己写脚本,放在/etc/rc3.d/目录下,文件名开头设置为S。S意思是启动,数字是顺序(数字越小启动的顺序越靠前),K意思是停止。/etc/rc3.d是文本多用户环境,一般生产都是用这个环境。而其坏处也是:重启网络后失效。
设置Linux网络的方法有两种:
此方法需要重启网络,永久有效。
1) 修改IP地址
# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.30.197 NETMASK=255.255.255.0 GATEWAY=192.168.30.1
2) 修改网关
# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=Aaron GATEWAY=192.168.30.1
3) 修改DNS
# vi resolv.conf nameserver 202.131.80.1 nameserver 202.131.80.5
一般现在这样设置以后都要重启network,所以还涉及到网络重启:
//方法1 # service network restart //方法2 # /etc/init.d/network restart //方法3 # ifdown eth0 # ifup eth0 //方法4 # ifconfig eth0 down # ifconfig eth0 up
一般使用命令修改后可以即时生效,但是重启会失效。
1) 修改IP地址
# ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up
这里up表示立即激活
2) 修改默认路由
# route add default gw 192.168.30.1 eth
3) 修改DNS
# vi resolv.conf nameserver 202.131.80.1 nameserver 202.131.80.5
1) 配置网卡地址
# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 #物理设备名 IPADDR=192.168.1.10 #IP地址 NETMASK=255.255.255.0 #掩码值 NETWORK=192.168.1.0 #网络地址(可不要) BROADCAST=192.168.1.255 #广播地址(可不要) GATEWAY=192.168.1.1 #网关地址 ONBOOT=yes #[yes|no](引导时是否激活设备) USERCTL=no #[yes|no](非root用户是否可以控制该设备) BOOTPROTO=static #[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议)
2) 配置DNS
# vi /etc/resolv.conf nameserver 202.109.14.5 #主DNS nameserver 219.141.136.10 #次DNS
网络配置完成后,都需要重启网络服务:service network restart 或/etc/init.d/networkrestart
3) 单网卡绑定两个IP
Linux的设备配置文件存放在 ‘/etc/sysconfig/network-scripts’ 里面,对于以太网的第一个设备,配置文件名一般为ifcfg-eth0。如果需要为第一个设备绑定多一个IP地址,只需要在 ‘/etc/sysconfig/network-scripts’ 目录里面创建一个名为ifcfg-eth0:0的文件。内容样例如下:
DEVICE=eth0:0 IPADDR=211.100.10.119 NETMASK=255.255.255.0 ONBOOT=on
其中的DEVICE为设备的名称,IPADDR为此设备的IP地址,NETMASK为子网掩码,ONBOOT表示在启动时自动启动(Linux最多支持255个IP别名)。