Chinaunix首页 | 论坛 | 博客
  • 博客访问: 171075
  • 博文数量: 65
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-16 08:59
文章分类

全部博文(65)

文章存档

2011年(3)

2010年(3)

2009年(43)

2008年(16)

我的朋友

分类: LINUX

2009-05-21 15:26:58

缺省规则:
[root@ggvtest ~]# ip rule list
0:      from all lookup 255
32766:  from all lookup main
32767:  from all lookup default
[root@ggvtest ~]#
上面列出了规则的优先顺序,
main表的内容
[root@ggvtest ~]# ip route ls
XX.65.xxx.x/30 dev eth1  proto kernel  scope link  src XXX.65.XX.X
1XX.1XX.X1.XXX/26 dev eth0  proto kernel  scope link  src XXX.XXX.XX.XX
169.254.0.0/16 dev eth1  scope link
default via XXX.XX.XXX.5 dev eth1
[root@ggvtest ~]#
查看MAIN表\DEFAULT表\LOCAL表
 
#ip route list table main
#ip route list table default
#ip route list table local
 
简单的源策略路由: 向/etc/iproute2/rt_tables 加数字与名字的关联
#echo 2 john >> /etc/iproute2/rt_tables
#ip rule add from 10.0.0.10 table john
# ip rule ls (查看)
 
为 john 路由表创建成路由项
#ip route add default via 195.96.98.253 dev ppp2 table john
 刷新路由缓存
#ip route flush cache              |-----ISP1 (internet)
                                   |
多重上连ISP的路由     |------IF1-----|
|------|            |
|局域网||-----------|
|_______|           |------IF2-----|
                                   |------ISP2(internet)
 
 这种情况通常会出现两种问题:
1\回应来自某一个ISP的数据包时,仍然使用相同的ISP
2\如何对于通过两个ISP的数据流时行负载均衡
第一块网卡的名字: $IF1  IP地址:$IP1   ISP1的网关地址为:$P1  令$P1的网络地址为:$P1_NET
第二块网卡的名字: $IF2  IP地址:$IP2   ISP2的网关地址为:$P2  令$P2的网络地址为:$P2_NET
创建两个路由表:T1 T2加入到/etc/iproute2/rt_tables中
设置两个路由表中的路由:
ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src  $IP2 table T2
ip route add default via $P2 table T2
接下来,设置MAIN路由表,把包通过网卡直接路由到与卡相连的局域网,不失为一个好办法,注意,"src参数。
他们能够确保选择正确的出口IP。
ip route add $p1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
然后,设置你的缺省路由.
ip route add default via $P1
 
设置路由规则,
ip rule add from $IP1 TABLE T1
ip rule add from $IP2 TABLE T2
 
负载均衡(接上面的试验):
ip route add default scope global nexthop via $P1 dev $IF1 weight 1
nexthop via $P2 dev $IF2 weight 1

通过调整"weight"参数,我们可以指定其中一个ISP优先于另一个ISP
应该指出,由于均衡是基于路由进行的,而路由是经过缓冲的,所以,这样的均衡并不是100%的精确.
GRE和其它隧道:
IP-IN-IP隧道,GRE隧道,非内核隧道(例PPTP).
 
GRE隧道:
通用路由封装(GRE)定义了在任意一种网络层协议上封装任意一个其它网络层协议的协议。
  在大多数常规情况下,系统拥有一个有效载荷(或负载)包,需要将它封装并发送至某个目的地。首先将有效载荷封装在一个 GRE 包中,然后将此 GRE 包封装在其它某协议中并进行转发。此外发协议即为发送协议。当 IPv4 被作为 GRE 有效载荷传输时,协议类型字段必须被设置为 0x800。当一个隧道终点拆封此含有 IPv4 包作为有效载荷的 GRE 包时,IPv4 包头中的目的地址必须用来转发包,并且需要减少有效载荷包的 TTL。值得注意的是,在转发这样一个包时,如果有效载荷包的目的地址就是包的封装器(也就是隧道另一端),就会出现回路现象。在此情形下,必须丢弃该包。当 GRE 包被封装在 IPv4 中时,需要使用 IPv4 协议 47。

  GRE 下的网络安全与常规的 IPv4 网络安全是较为相似的,GRE 下的路由采用 IPv4 原本使用的路由,但路由过滤保持不变 。包过滤要求防火墙检查 GRE 包,或者在 GRE 隧道终点完成过滤过程。在那些这被看作是安全问题的环境下,可以在防火墙上终止隧道。
路由封装(GRE)最早是由Cisco提出的,而目前它已经成为了一种标准,被定义在RFC 1701, RFC 1702, 以及RFC 2784中。简单来说,GRE就是一种隧道协议,用来从一个网络向另一个网络传输数据包。
        如果你觉得它和虚拟专用网(VPN)有些类似,那只是因为:从技术上讲,GRE隧道是某一类型的VPN,但是并不是一个安全隧道方式。不过你也可以使用某种加密协议对GRE隧道进行加密,比如VPN网络中常用的IPSec协议。
        实际上,点到点隧道协议(PPTP)就是使用了GRE来创建VPN隧道。比如,如果你要创建Microsoft VPN隧道,默认情况下会使用PPTP,这时就会用到GRE。
为什么要用GRE? 为什么要使用GRE进行隧道传输呢?原因如下:
有时你需要加密的多播传输。GRE隧道可以像真实的网络接口那样传递多播数据包,而单独使用IPSec,则无法对多播传输进行加密。多播传输的例子包括OSPF, EIGRP, 以及RIPV2。另外,大量的视频、VoIP以及音乐流程序使用多播。
你所采用的某种协议无法进行路由,比如NetBIOS或在IP网络上进行非IP传输。比如,你可以在IP网络中使用GRE支持IPX或AppleTalk协议。
你需要用一个IP地址不同的网络将另外两个类似的网络连接起来。
example: 内部网A和B 通过C相连(C是INTERNET),  modprobe gre
A : network:  10.0.1.0 netmask: 255.255.255.0 gateway:10.0.1.1
在C网络上的地址是:172.16.17.18 称之为neta
 
B: network: 10.0.2.0   netamsk:255.255.255.0 gateway:10.0.2.1
在C网络上的地址是:172.19.20.21 称之为netb
 
已知C网络已经连通,我们假定它会将所有的数据包都A传到B,反之
在A网络上输入:
modprobe ip_gre
ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 64
ip link set netb (mtu 1480) up
ip addr 10.0.1.1 (peer 172.19.20.21) dev netb
ip route add 10.0.2.0/24 dev netb
 
第一行:我们添加了一个隧道设备,称之为netb,(为了能够表示出这个隧道通向那里),并且表示要用GRE协议(mode gre),对端地址是:172.19.20.21 ,我们的隧道数据包源地址,172.16.17.18,并且包的TTL字段应该设置为255
第二行,启用该隧道
第三行, 我们给这个新生的网卡一个IP,10.0.1.1
第四行  我们给B网络设备了一条路由
我们再看看B网络的路由:
ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255
ip link set neta up
ip addr 10.0.2.1 dev neta
ip route add 10.0.1.0/24 dev neta

想停止隧道(在A上):
ip link set netb down
ip tunnel del netb
复杂一点的:
----------      -------------      ------------      ----------------      -------
| client | <--> | nat server| <--> | internet | <--> | Linux server | <--> | Lan |
----------      -------------      ------------      ----------------      -------
|client         ip     192.168.100.100/24 gateway 192.168.100.254                |
|nat server:    lan_ip 192.168.100.254/24 wan_ip  123.119.206.165                |
|Linux server:  lan_ip eth0 192.168.200.100/24 wan_ip eth1 123.127.177.210       |
|--------------------------------------------------------------------------------|
这个结构比较麻烦了,因为我们的源地址会被改写一次,这个该如何配置呢。
实际上在linux上配置这个也很简单,只要遵循原则,看见谁,就写谁的方法就没有问题。
比如在我们客户机上看见的一定是 由我们本地的ip(伪)到远程服务器的ip(实),而远程服务器看到的情况却有点不一样,服务器看到的是,客户机经过nat后的ip(实),和本机ip(实)在通讯,根据这个原则,我们写出如下命令。

A:client
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.127.177.210 local 192.168.100.100 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.200.253 brd 255.255.255.255 peer 123.127.177.210 dev tun2

B:Server
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.119.206.165 local 123.127.177.210 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.100.253 brd 255.255.255.255 peer 123.119.206.165 dev tun2

这样隧道就建立起来了。
服务器端配置:
果想让这个client能访问内网的其他机器需要加一个arp 的响应机制及ip转发。
arp -Ds source_ip -i lan_eth pub
sysctl -w net.ipv4.ip_forward=1
如果你做的 vpn_proxy ,不希望他访问你的内网,而仅仅是用来代理上网,那你就需要去掉这个。
arp -d source_ip dev lan_eth
添加一个ip伪装的功能。
iptables -t nat -A POSTROUTING -s 192.168.200.253 -j MASQUERADE
当然如果你二者都需要,那你就都添加就可以了。
客户机配置:
添加一个我们到对方服务器的路由
ip route add 123.127.177.210 via 192.168.100.254
用来保证我们能链接到远程的 Linux Server
如果我们想访问他的内网,我们就需要添加到对方内网的路由,当然这需要服务器给你做arp响应。
ip route 192.168.200.0/24 via 192.168.200.253
如果我们想像 vpn_proxy 一样使用他,那也非常简单,修改默认网关就可以了。
(也许你会觉得这有问题,请仔细想想,这里遍历了2次路由表,保证了链路、数据的畅通)
ip route change default via 192.168.200.253

 
 
 
 
 
 
 
 
 
 
 
阅读(1067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~