使用freebsd模拟路由器转发

来源:百度文库 编辑:神马文学网 时间:2024/04/28 17:22:34
[来源:网上转载 (http://www.chinaunix.net) | 作者:网友(wangrujun) | 时间:2007-05-27 | 浏览:50 人次 ]
上网,大家都用natd。不过如果遇到内网中有人使用h.232或sip之类的voip协议,就会出问题。因为上述两种协议无法穿越natd
下面详细说明使用freebsd模块路由器转发的过程,并说明freebsd4与freebsd5在应用中的不同之处。
概述:
主要使用route命令与ipfw中的fwd命令来完成。fwd子句通常用于做透明代理,它的本质是实现下一跳的转发。
问题:内网中有一台机器需要有互联网真实IP地址,它使用h.232协议,只需要访问到互联网中61.1.1.1的主机。拟分配给它的ip地址是219.1.1.3
说明:无论是dnat和snat都是使用修改ip包中地址来实现与互联网互联,这与h.232协议有冲突。具体原因不赘述,总之natd不符合要求。
解决方案:
互联网
|
|-----------------|   219.1.1.1 00:04:3c:ab:dd:eb  xl0
|   网关 A        |
|-----------------|   192.168.254.254 00:d0:c9:68:16:93     fxp0
|
|-----------------|   192.168.254.250 00:50:04:ba:98:d5     xl1
|   网关 B        |
|-----------------|   219.1.1.2 00:10:5a:85:d5:83  xl0
|
|-----------------|   219.1.1.3
|   客户机器      |
|-----------------|
客户机器需要互联网真实IP地址。网关A是原有互联网网关。网关B是为了实现此项路由转发功能,增加的服务器。
网关A、网关B均为Freebsd。客户机器随意。
方案一:网关A为Freebsd5.3,网关B为Freebsd4
1.  网关B的转发
ipfw add 580 fwd 192.168.254.254 ip from 219.1.1.3 to 61.1.1.1
ipfw add 582 fwd 219.1.1.3 ip from 61.1.1.1 to 219.1.1.3
2.  网关A的转发
ipfw add 580 fwd 219.234.226.225 ip from 219.1.1.3 to 61.1.1.1
ipfw add 582 fwd 192.168.254.250 ip from 61.1.1.1 to 219.1.1.3
3.  在网关A上为客户机器的外部IP做arp代理,代理的mac地址为本机外网网卡mac,使上级路由器将219.1.1.3的包转发到本机。
arp -S 219.1.1.3 00:04:3c:ab:dd:eb pub
可以用netstat -rn | grep 219.1.1.3看到:
219.1.1.3    00:04:3c:ab:dd:eb  UHLS2       0        0    xl0
4.  在网关A上为客户机器的外部IP做主机路由
route add -host 219.1.1.3/32 192.168.254.250
可以用netstat -rn | grep 219.1.1.3看到:
219.1.1.3    192.168.254.250       UGHS        0        7   fxp0
上述做法的说明:
使用ipfw 的fwd命令进行转发的语法,是容易看懂的。下面说明一下arp代理与主机路由
从客户机出发的访问,通过网关B和网关A即可。
但是从外网回来的IP地址,网关A如何才能接收呢?方法是在网关A上使用arp代理,告诉上级路由器219.1.1.3的包发到网关A上来。
然后在网关A上检查到 route add -host 219.1.1.3/32 192.168.254.250生成的路由,即会把包转发到该机器上。
注意事项:
为何必须同时使用
ipfw add 582 fwd 192.168.254.250 ip from 61.1.1.1 to 219.1.1.3 和
route add -host 219.1.1.3/32 192.168.254.250
按道理说,在网关A上应该可以找到192.168.254.250,那么不需要特意增加路由,即能正确的把包转发到192.168.254.250上。这在freebsd4.x上是正确的。
但是在freebsd5.3中,我发现如果不指定路由表,那么这个包最后会被网卡xl0截获(可能是因为arp代理的原因)。被截获后,网关A发出arp请求,最后无法找到219.1.1.3的mac地址(在本机上,arp代理被忽略)。
使用tcpdump来看,结果如下:
[root@ftp1]/root # tcpdump -i xl0 host 219.1.1.3
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on xl0, link-type EN10MB (Ethernet), capture size 96 bytes
10:43:01.052683 IP 219.1.1.3 >; 61.1.1.1: icmp 40: echo request seq 16384
10:43:01.059563 IP 61.1.1.1 >; 219.1.1.3: icmp 40: echo reply seq 16384
10:43:01.059606 arp who-has 219.1.1.3 tell ftp1.tgegroup.com
10:43:02.279858 IP 219.1.1.3 >; 61.1.1.1: icmp 40: echo request seq 16640
10:43:02.287605 IP 61.1.1.1 >; 219.1.1.3: icmp 40: echo reply seq 16640
10:43:02.287635 arp who-has 219.1.1.3 tell ftp1.tgegroup.com
所以,freebsd5的网络实现时,在通过规则检查后,需要目标IP在路由表中的位置。我认为这或许是一个小bug吧。fwd命令并没有得到完美的执行。
方案二:网关A为Freebsd4.10,网关B为Freebsd4.10
1.  网关B的转发
ipfw add 580 fwd 192.168.254.254 ip from 219.1.1.3 to 61.1.1.1
ipfw add 582 fwd 219.1.1.3 ip from 61.1.1.1 to 219.1.1.3
2.  网关A的转发
ipfw add 580 fwd 219.234.226.225 ip from 219.1.1.3 to 61.1.1.1
ipfw add 582 fwd 192.168.254.250 ip from 61.1.1.1 to 219.1.1.3
不需要做任何其它的工作,转发已经完成。fwd命令在背后做了许多工作,使用时更简单。
可以在网关A上用
tcpdump -i xl1 host 61.1.1.1
tcpdump -i xl1 host 219.1.1.3
观察数据包的走向
可以在网关B上用
tcpdump -i xl0 host 61.1.1.1
tcpdump -i xl0 host 219.1.1.3
观察数据包的走向
关于Freebsd5与Freebsd4表现的推测:
我想是因为freebsd5中改变了ipfw在tcp/ip协议栈中的位置,导致了这种结果。freebsd5中的ipfw2,应该更靠近网络接口层而不是网络层。
wangrujun 回复于:2005-06-30 17:16:00
谢谢版主。
做freebsd几年了,就是想加精华留个记号。
不过我这是原创的,能不能加在原创精华里面?
congli 回复于:2005-06-30 17:39:36
好文.
niao7409 回复于:2005-06-30 23:41:31
好文,收藏
authen 回复于:2005-07-01 10:14:43
收藏!
剑心通明 回复于:2005-07-01 16:21:19
请问楼主,单纯的利用route命令是否可以让freebsd来作路由器,我们只有核心交换机,是6509,比较早了,不能做路由,只能把所有的都路由到代理的内网网卡上去,只是利用route命令,能否按照我们内部要访问的地址来路由,比如要访问教育网走教育网的出口,要访问公网走公网的出口?
wangrujun 回复于:2005-07-04 13:52:49
剑心通明: 用route可以单独做路由
我用fwd只是为了在局域网内映射出互联网ip地址而已。
但是你如果要走公网,必须进行地址转换,你要有一个设备做natd的。
剑心通明 回复于:2005-07-04 15:43:27
引用:原帖由 "wangrujun" 发表:
剑心通明: 用route可以单独做路由
我用fwd只是为了在局域网内映射出互联网ip地址而已。
但是你如果要走公网,必须进行地址转换,你要有一个设备做natd的。
我要在一个机器上作,既做route又做natd。用route来写的话,那不是需要很多条route的命令吗,普通的机器能顶得住吗?
wangrujun 回复于:2005-07-05 09:13:45
最好可以对网络进行子网切分,这样的话,只需要几条命令就好了。
我也有机器同时做nat的route的,负载不大。
剑心通明 回复于:2005-07-05 10:17:47
引用:原帖由 "wangrujun" 发表:
最好可以对网络进行子网切分,这样的话,只需要几条命令就好了。
我也有机器同时做nat的route的,负载不大。
几条命令?不够吧?光教育网和公网的地址分开就要很多吧?那么多的命令,会不会要很高档的服务器才能顶住,毕竟路由器的硬件跟pc的是不一样的
wangrujun 回复于:2005-07-05 17:21:17
那你还是用ipfw 的fwd命令来转发吧。
主要是因为 ipfw2支持 table的语法,对于处理大量ip地址有效。
当然,如果你需要针对成千上万的ip地址单独进行路由,考虑一下,即使是中低端的路由器,效率也未必高。不知道你的网络状况,如果可能,最好还是能对网络结构进行一些优化。
剑心通明 回复于:2005-07-06 08:03:39
我用的是ipfilter,没有用ipfw啊,在freebsd下如何写那些route命令啊,写个shell?
from site :http://www.chmhome.com/technology/system/freebsd/20070527/8234_2.html