Linux实现路由器
正确配置IP地址等参数以后,系统就自动计算出了每个端口所接的子网的固定路由,在这样的一个例子中我们可以看到:
我们可以用命令“route -n”或者“netstat -r -n”来查看系统目前的路由表,在右边图二所示的例子中,我们可以得到这样的路由表:
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.3.2.4 0.0.0.0 255.255.255.252 U 0 0 0 eth0
10.3.2.128 0.0.0.0 255.255.255.128 U 0 0 0 eth3
10.3.253.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
其中Destination项表示目的网络,其大小可以通过子网掩码(Genmask)计算出来,Flags项表示这个网段是否直接连接的,“U”就是直接可用的意思,Metric是级跳,Ref是优先级参考,Use Interface是连接的端口,Gateway栏目在需要其他路由器转发的时候指明下一级路由器的地址。
使用命令route同时还可以建立或者删除一个静态路由,使用这样的格式:
#route add -net 目标子网地址 netmask 目标子网掩码 gw 下一级路由器的地址
同理,使用:
#route del -net 目标子网地址 netmask 目标子网掩码 gw 下一级路由器的地址
可以设置静态路由,使用:
#route add default gw 网关地址
或者:
# route add -net 0.0.0.0 netmask 0.0.0.0 gw 网关地址
我们把路由设置命令加到/etc/rc.d/rc.local中,以便其能够在下次启动的时候自动的运行所有路由设置命令。 如下是上面例子中提到的4个网络出口的Linux路由器中的静态路由设置命令,这就是在/etc/rc.d/rc.local文件中的片断:
route add -net 202.102.247.0 netmask 255.255.255.192 gw 172.16.80.82
route add -net 10.56.0.0 netmask 255.255.0.0 gw 172.16.80.10
route add -net 192.168.100.0 netmask 255.255.255.0 gw 172.16.80.86
route add -net 192.168.101.0 netmask 255.255.255.0 gw 172.16.80.88
route add -net 10.68.0.0 netmask 255.255.0.0 gw 10.3.2.129
route add -net 172.28.0.0 netmask 255.255.0.0 gw 172.16.80.82
route add default gw 10.3.2.5 (这一条加的是默认路由)
由这些命令创建的静态路由加上原来由IP地址计算出来的固定路由以后,路由表就变成了这样:
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.3.2.4 0.0.0.0 255.255.255.252 U 0 0 0 eth0
202.102.247.0 172.16.80.82 255.255.255.192 UG 0 0 0 eth1
10.3.2.128 0.0.0.0 255.255.255.128 U 0 0 0 eth3
192.168.100.0 172.16.80.86 255.255.255.0 UG 0 0 0 eth1
192.168.101.0 172.16.80.88 255.255.255.0 UG 0 0 0 eth1
10.3.253.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
10.68.0.0 10.3.2.129 255.255.0.0 UG 0 0 0 eth3
172.28.0.0 172.16.80.82 255.255.0.0 UG 0 0 0 eth1
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
10.56.0.0 172.16.80.10 255.255.0.0 UG 0 0 0 eth1
0.0.0.0 10.3.2.5 0.0.0.0 UG 0 0 0 eth0
做防火墙的系统准备
包过滤防火墙比起路由器来说就是在转发数据包的时候多了一个规则表的检测,按照规则表的定义决定数据包的命运。可以说,路由器其实就是一个允许所有数据包正常通过的“防火墙”。
防火墙还有一个很重要的功能就是保护一个内部的子网,以及将内部的私有地址转换成外部的IP地址,这个功能不但可以对内部网络起到保护作用,还可以节省IP地址资源,或者用来使一个本来不能被某设备识别的某网段IP能够实现对它的访问。这样的技术叫做NAT(网络地址翻译),实现的方式很多,直接在路由层次上实现是效率最高的。CISCO的PIX就是这样技术的商用产品的代表。 Linux的IP-MASQ(IP伪装)就是这样技术在Linux上的一个实现。
当一个主机发起一个对其他主机的TCP/IP访问, 它必须在数据包的报头中指明对方的IP地址,以及对方提供连接的TCP/UDP端口,同时它会打开一个临时的端口准备接受返回的数据,然后把它自己的IP地址以及这个临时端口写到IP数据报的报头中。当一个数据包被NAT处理的时候,它的源地址将被替换成防火墙的出端口上的IP(有些防火墙产品使用地址池),同时NAT防火墙上也会在出端口上开放一个临时端口,将这个端口号替换数据包中的源端口号。当回应数据到来的时候,由于外部的主机只能看到NAT防火墙的IP和端口号,它发出的数据的目的地址和端口将是防火墙上的,而数据回来到防火墙以后,防火墙就把原来的内部主机的地址和端口号替换回来,将数据包转到内部网络上传送。
而在NAT防火墙上,还需要建立一个此次地址转换的对应关系表。以便知道随后到来的源、回应数据包应该被怎样的替换回来。
由于包过滤防火墙的所有操作都是根据规则表来的,所以规则表就显得格外的重要。我们使用一个叫ipchains的工具来维护系统规则表,ipchains把规则表叫做防火链。当一个数据包进入Linux机器时,要通过进入链(input)的检查,当一个Linux机器准备发送一个数据包时,这个包又要通过输出链(output)的检查,当作为路由器使用的时候,还要点所有中转的数据包增加一道中转链(forward)的检查,每个链都可以配置自己的规则表。所以,其实一个通过Linux防火墙的数据包需要经过input、forward、output三个规则的检查,当这个Linux作为普通路由器使用的时候,三个链的规则都是ACCEPT(允许通过)。
这是一个需要中转的数据包通过ipchains的过程:
在规则表中,数据包总是先和第一条规则进行匹配,如果不匹配在比较下一条规则,一旦某条规则适应了,就不再比较,直接按此规则执行,所以排列在前面的规则总是优先与排列在后面的规则。
用ipchains建立规则表
使用命令:
ipchains -P 链名 动作
可以改变一个链的默认规则,其中可以使用的链名有“input”、“forward”、和“output”。可以使用的动作有“ACCEPT”、“DENY”、“REJECT”。一般来说,默认规则是当一个数据包不能匹配所有的规则的时候的最后动作,当然这是优先级最低的一条规则了。系统默认的三个链的规则都是允许。也就是“ACCEPT”。一般来说,我们做防火墙的话,主要是控制通过防火墙的数据包,所以我们一般在中转链上设置规则,而把进入链和外出链设置为“ACCEPT”。通常我们需要把所有不匹配规则的数据包禁止,所以我们可以用这样的命令把中转链的默认规则改成“丢弃”:
#ipchains -P forward DENY
增加一条规则使用这样的语法:
ipchains -A 链名 -s 源网络/掩码 -d 目的网络/掩码 -p 传输层协议 端口 -j 动作
源网络和目的网络地址用子网的网络地址来表示,掩码可以使用点分十进制,也可以使用一个表示“1”的个数的数字来代替,比如说“255.255.255.0”可以表示为“24”,用“0.0.0.0/0”可以表示所有的地址,用“IP地址/32”表示一个主机。这个地方的动作可以是“ACCEPT”、“DENY”、“REJECT”,在中转链中要是使用IP伪装的话,动作可以写成“MASQ”。如果不检查传输层协议(tcp/udp/icmp)的话,就不能再检查端口号,这时可以这样写:
ipchains -A 链名 -s 源网络/掩码 -d 目的网络/掩码 -j 动作
这样的设置将对所有的符合源地址和目的地址的数据包生效。比如说我们现在要设置允许子网10.3.2.0/255.255.255.128和子网202.102.247.0/255.255.255.192的互相访问,可以这样设置:
#ipchains -A forward -s 10.3.2.0/25 -d 202.102.247.0/26 -j ACCEPT
但是在实际的使用中这样设置并不会让两个子网通起来,因为网络传输是双向的,只有一个方向通了还不能算是通,由于forward的默认规则已经是DENY,返回的数据包将会因为匹配不了规则而被丢弃,所以我们需要再设置一条反向的许可规则:
#ipchains -A forward -s 202.102.247.0/26 -d 10.3.2.0/25 -j ACCEPT
其实我们可以使用-b的选项来一次设置双向的两条规则:这样的命令等价于刚才的两条命令:
#ipchains -A forward -b -s 10.3.2.0/25 -d 202.102.247.0/26 -j ACCEPT
【相关文章】
| 共2页: 上一页 [1] 2 | ||||
|