免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3507 | 回复: 0
打印 上一主题 下一主题

linux 数据包转发 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-08 10:13 |只看该作者 |倒序浏览

               
linux数据包转发
   通过一台linux电脑访问网络
配置网卡 ip 地址
ifconfig eth1 0
ifconfig eth1 192.168.4.1
设置包转发策略
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.0.101
开启内核转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
=================================================================
from: http://www.linux-cn.com/html/test/20070411/1710.html
用Linux实现路由器和包过滤防火墙
来源: 作者: 时间:2007-04-11 点击: [收藏] [投稿]
路由器和防火墙
路由器是一种广泛运用在IP网段之间的设备,市场上有许多现成的产品。在应用中,我们经常把路由器跨接在广域网和局域网之间,大多数的路由器产品也就是基于这种需要来设计的。但是随着用户IP网络的扩展,我们需要一种能够在多个以太网络之间进行寻址的路由器,传统的路由器产品中偶尔有几款双以太网络接口的,但是这样的产品价格尤其昂贵,而且要是支持快速以太网络应用的话价格把是天文数字;第三层交换机可以实现这样的功能,但是第三层交换机也不是便宜的家伙。
路由器工作的时候,根据它的某个端口收到的数据包的目的IP地址,查询路由器自己的路由表,然后决定把数据包转发到相应的端口。路由器的路由表有几种:一种是根据路由器自己的每个端口IP地址和子网掩码计算出来的路由,这种路由叫做 “固定路由”;第二种是有系统管理员种设置的到某个子网需要通过某个下一级路由器的路由,这种叫“静态路由”;还有就是在网络环境中让每个路由器都把自己的路由信息广播出去,让路由器之间进行互相学习,这样学到的路由就叫做“动态路由”。路由器还会把目的地址不在自己路由表中的数据包固定转发给一个预先设定IP地址,这样的路由设置又叫“默认路由”。在路由匹配的过程中,一般有这样的优先级:固定路由>静态路由>动态路由>默认路由。
路由器只会查看IP数据包的目的地址,也就是说原则上它是“照单全收”,而且全部转发,除非真的发不出去了。如果让路由器在转发数据包的时候,加一项检查,检查数据包的来源和数据包要求的应用层服务类型,根据预先设计的规则来判定这个数据包是应该转发还是作别的处理,这样这个路由器就不再是一个单纯意义上的路由器,而是一种类型的防火墙——包过滤防火墙。
包过滤防火墙可以检查数据包的来源、源端口、目的地址、目的端口,使用的传输层协议类型等项目,根据检查的项目的内容来匹配一个规则表,当符合规则表中的定义的时候,就执行规则表事先定义的操作。一般来说,规则表可以定义这样的操作:ACCEPT(通过)、NAT(MASQ地址转换)、DENY(丢弃)、REJECT(拒绝,同时回送‘不可用’消息给源端)。
当然目前市场上也能买到支持包过滤防火墙的现成产品,但是价格问题还是我们不得不考虑的重要因素。尤其大多数产品都有许多许可证、性能等方面的限制。
Linux操作系统应运IP网络而生,除了Linux价格上的优势之外,更吸引人的是它内建的强大的网络功能,除了做各种Internet上的应用服务之外,Linux还提供了完整的路由器功能和防火墙功能。而它所带来的系统造价和功能的比例是相当诱人的,为什么不一试呢?
----------------------------------------------------
Linux系统的准备
相对于现成的路由器产品,我们把这样的路由器称为“软路由器”,当然这样做出来的路由器性能绝对不会比“硬件路由器”的性能差,我们只要明白比如很多“25××”系列的路由器才只是采用25M主频的摩托罗拉68030CPU(性能相当于 Intel 80386)我们就知道了。
用来做“软件路由器”的Linux系统主机硬件配置要求并不是太高,用作三五个局域网之间的路由选择,数百台计算机的话,选用奔腾133以上的主机就足够了,当然现在的市场上赛杨2或者奔腾4或者其他的CPU也不是很贵;配置64M 内存,有条件的话可以配置到128M也无所谓;硬盘就不要太大了,否则也是浪费.
关键在于网络适配器的配置,Linux系统支持大多数市场上能见到的以太网络适配器,PCI卡的安装比较简单,只要内核支持,在开机的时候有多少卡都会被系统正确的识别出来。下面是我在实际使用过的能够正常工作的网卡:
★Intel EtherExpress Pro PCI100M
★RealTek 8029/8139 PCI 10M/100M
★D-link 系列 (使用Tulip 2114X驱动) PCI 10M
★ACCTON EN1207 (使用Tulip 2114X驱动) PCI 100M
★3COM全系列 (PCI/ISA 10M/100M)
★AMD PC-NET 32 PCI 10M
★大部分NE2000兼容网卡,Topstar、Dlink、ACCTON、SN2000等等
★HardLink PCMCIA 笔记本专用网卡 10M
当然Linux能支持的网卡远远不止这些。
把网卡驱动加挂到Linux中有几种方法,最常用的是用modprobe系统工具加挂一个内核模块,比如加载一个NE2000兼容网卡的驱动可以这样:
  #modprobe ne io=0x300
其实大多数的PCI网卡并不需要指定IO地址范围,就像加载一个ACCTON的EN1207c网卡可以这样:
  #modprobe tulip
把网卡驱动编译到Linux内核中是一种最高效的做法,在编译Linux内核的时候,使用
  #make menuconfig
代替很多老资料上提到的“#make config”,这样就会得到一个菜单,在菜单中“Network Device”选项下选定指定的网络适配器的驱动程序,编译完成以后就会得到一个完整的支持相应网卡的Linux内核。
对于很多系统只能识别一个的网卡,把第二个以后的网卡参数写在/etc /lilo.conf中是最佳做法,这里有一个系统中安装呢4块网卡,一个是PCI的RealTek 8139,另外3个是NE2000,这样的话系统就识别8139网卡以后就不会自动识别后面的三个ISA卡,我们需要在/etc/lilo.conf中加上这样一句:
 append=-ether=3,0x240,eth1 ether=11,0x300,eth2 ether=4,0x260,eth3-
在编译内核的过程中,我们可以在Network option中选择“optimize as router not host”,这样系统就会按照路由器而不是主机的方式进行优化,同时,还可以根据具体的需要选择上“ Fast switching”和“ Forwarding between high speed interfaces”以及“ advanced router”。如果我们还计划在这个机器上实现包过滤防火墙,那么选择上“ firewalling”和“ IP: masquerading”以及与“IP MASQ”相关的选择项。
注意查看开机的系统提示或者使用dmesg命令可以看到系统是不是正常识别并且启动相应的网卡的驱动程序,在上面例子中提到的具有一个Realtek8139网卡,三个NE2000网卡的机器上我们能够看到这样的情况:
  rtl8139.c:v1.07 5/6/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/r
  tl8139.html
  eth0: RealTek RTL8139 Fast Ethernet at 0x6000, IRQ 9, 00:e0:4c:dd:5f:85.
  ne.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)
  NE*000 ethercard probe at 0x240: 00 40 05 1f 60 9a
  eth1: NE2000 found at 0x240, using IRQ 3.
  NE*000 ethercard probe at 0x300: 00 40 05 22 08 65
  eth2: NE2000 found at 0x300, using IRQ 11.
  NE*000 ethercard probe at 0x260: 00 40 05 23 59 0f
  eth3: NE2000 found at 0x260, using IRQ 4.
然后是配置每个网络端口的IP地址,当然我们可以使用操作系统的一些对话框来配置第一个网卡的参数,但是一个有经验的网络管理员一般是不这样做的,因为这样不能配置其他的网卡,我们必须学会用这个命令来配置第一块网卡:
#ifconfig eth0 10.3.3.3 netmask 255.255.255.0 broadcast 10.3.3.255
第二块网卡的名字就是eth1,其他依次是eth2,eth3等等。由于计算机体系结构的限制,在一个普通PC主板上只有一个PCI控制器,而一个PCI控制器最多只能同时支持4个PCI设备,当然某些专用服务器上可能有支持两个以上的PCI控制器。ISA网卡的安装受到系统中断号的限制,单CPU的系统中只有16个可用的IRQ号,扣除硬盘、内存、键盘、显示卡等硬件已经所剩无几,所以一般也是安装4个卡,当然,双CPU的系统可以有256个中断号可用,这样就宽裕了许多。另外,我们还需要打开Linux系统的IP转发开关,这一点非常容易,执行这一条指令:
echo 1 > /proc/sys/net/ipv4/ip_forward
当然这些配置命令最好是放到/etc/rc.d/rc.local中,这样就不用每次开机以后重新配置了。
----------------------------------------------------
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
----------------------------------------------------
只有一种情况例外,由于IP伪装回来的数据包不经过中转链,所以不需要再中转链中只需要为IP伪装设置一个单向的规则,比如说把所有从10.3.2.0/25来访问172.16.0.0/16的数据包都做一个伪装,那么就可以这样设置:
  #ipchains -A forward -s 10.3.2.0/25 -d 172.16.0.0/16 -j MASQ
而这样的设置并不需要反向的规则。 这是一个禁止10.3.2.0/25的网络的计算机访问202.102.247.50的telnet端口(TCP23)的设置:
#ipchains -A forward -s 10.3.2.0/25 -d 202.102.247.50/32 -p tcp 23 -j DENY
当然,在进入链或者在外出链上做的规则对于中转数据一样有效,这样的设置可以禁止10.3.2.0/25网段上的IP地址访问OICQ(UDP8000端口):
 #ipchains -A input -s 10.3.2.0/25 -d 0.0.0.0/0 -p udp 8000 -j DENY
在进入链上的规则要优先于中转链上的规则,而外出链上的规则优先级是最低的。删除规则有两种做法,一个是先数出改规则在表中的位置,然后用命令:
  #ipchains -D 链名 序号
来删除它,比如说删除中转链的第5条规则可以这样写:
  #ipchains -D forward 5
还有一种办法就是把建立规则中的“-A”直接改成“-D”来删除由这条“-A”的命令创建的规则:
 #ipchains -D input -s 10.3.2.0/25 -d 0.0.0.0/0 -p udp 8000 -j DENY
这样的话这个子网的计算机又可以访问OICQ了。而用命令ipchains -F可以清除系统全部的规则表,但是不会改变链的默认规则。
用命令ipchains -L -n可以查看系统目前的规则表:这是前面所说的4个网卡的防火墙实际的规则表,当然,看起来它是比较复杂的:
  d# ipchains -L -n
  Chain input (policy ACCEPT):
  target prot opt source destination ports
  DENY all ------ 202.102.247.0/25 10.3.2.4 n/a
  DENY all ------ 172.16.0.0/16 10.3.2.4 n/a
  DENY all ------ 172.16.0.0/16 10.3.253.3 n/a
  DENY all ------ 202.102.247.0/25 10.3.253.3 n/a
  Chain forward (policy DENY):
  target prot opt source destination ports
  MASQ all ------ 202.102.247.0/25 10.3.253.1 n/a
  ACCEPT all ------ 10.3.2.0/24 10.3.253.0/24 n/a
  ACCEPT all ------ 10.3.253.0/24 10.3.2.0/24 n/a
  ACCEPT all ------ 10.3.2.0/24 202.102.247.0/25 n/a
  ACCEPT all ------ 202.102.247.0/25 10.3.2.0/24 n/a
  ACCEPT all ------ 10.3.2.0/24 172.16.0.0/16 n/a
  ACCEPT all ------ 172.16.0.0/16 10.3.2.0/24 n/a
  ACCEPT all ------ 10.3.253.0/24 172.16.0.0/16 n/a
  ACCEPT all ------ 172.16.0.0/16 10.3.253.0/24 n/a
  ACCEPT all ------ 10.3.253.0/24 202.102.247.0/25 n/a
  ACCEPT all ------ 202.102.247.0/25 10.3.253.0/24 n/a
  ACCEPT all ------ 10.3.253.0/24 10.56.0.0/16 n/a
  ACCEPT all ------ 10.56.0.0/16 10.3.253.0/24 n/a
  ACCEPT all ------ 172.16.0.0/16 202.102.247.0/25 n/a
    ACCEPT all ------ 202.102.247.0/25 172.16.0.0/16 n/a
  ACCEPT all ------ 10.56.32.0/25 202.102.247.0/25 n/a
  ACCEPT all ------ 202.102.247.0/25 10.56.32.0/25 n/a
  ACCEPT all ------ 202.102.247.0/25 10.68.0.0/16 n/a
  ACCEPT all ------ 10.68.0.0/16 202.102.247.0/25 n/a
  ACCEPT all ------ 172.16.0.0/16 10.68.0.0/16 n/a
  ACCEPT all ------ 10.68.0.0/16 172.16.0.0/16 n/a
  ACCEPT all ------ 10.3.253.0/24 10.68.0.0/16 n/a
  ACCEPT all ------ 10.68.0.0/16 10.3.253.0/24 n/a
  MASQ all ------ 202.102.247.0/25 10.3.253.1 n/a
  MASQ all ------ 172.16.0.0/16 10.3.253.1 n/a
  MASQ all ------ 192.168.0.0/16 10.3.253.1 n/a
  MASQ all ------ 10.56.32.0/24 10.3.253.1 n/a
  MASQ all ------ 202.102.247.0/25 202.102.247.128/25 n/a
  MASQ all ------ 172.16.0.0/16 202.102.247.128/25 n/a
  MASQ all ------ 192.168.0.0/16 202.102.247.128/25 n/a
  MASQ all ------ 10.56.32.0/24 202.102.247.128/25 n/a
  MASQ all ------ 172.16.0.0/16 0.0.0.0/0 n/a
  MASQ all ------ 10.56.32.0/25 0.0.0.0/0 n/a
  MASQ all ------ 192.168.0.0/16 0.0.0.0/0 n/a
  ACCEPT all ------ 10.3.253.0/24 0.0.0.0/0 n/a
  ACCEPT all ------ 0.0.0.0/0 10.3.253.0/24 n/a
  Chain output (policy ACCEPT):
其中,我把对于某些主机的访问限制设置在了进入链中,这样优先级高一些。同样我们可以把建立规则的命令写入/etc/rc.d/rc.local中,但是一旦我们把一个防火墙系统调试成功以后,我们还需要把已经建立的规则记下来,重新写到 rc.local中,这样的操作是很容易出错的。其实我们可以用命令ipchains-save 把规则表保存到一个文件,就像这样:
  #ipchains-save >/root/ipchains
  把现在正在运行的规则表保存到了/root/ipchains文件当中去了,然后把恢复规则表的命令:
  /sbin/ipchains-restore 192.168.0.255
信息子网:202.102.247.0-->202.102.247.63
其中信息子网和Internet互联,出口网关地址是202.102.247.33
首先需要在防火墙上设置出口路由:
  route add default gw 202.102.247.33
防火链的设置如下:
  ipchains -P forwar DENY
  ipchains -A forward -b -s 192.168.0.0/24 -d 202.102.247.0/26 -j ACCEPT
  ipchains -A forward -s 192.168.0.0/24 -d 0.0.0.0/0 -j MASQ
在湖南省xxx高等专科学校的校园网络上,我们一共有9个子网,5个互联出口,中间就使用了Linux+ipchians的防火墙来进行互联和访问控制,使用了4台这样的主机,有些机器上的路由表和规则表已经配置得比较复杂。但系统的投资很小,实际使用的效果也很好。
()
=================================================================================
from: http://www.linuxeden.com/forum/archiver/tid-152757.html
linux路由器制作及问题探讨
[原创] linux路由器制作及问题探讨
1。单纯做linux小路由器很简单方法如下:
(1)在一个双网卡的机器上装上linux。
(2)装上linux的内核支持包转发,RED HAT linux 7.2以上默认支持,不用另外配置内核进行编译。
(3)给双网卡配是IP地址,保证两网卡的地址不在同一网段。有两种方法可实现ifconfig 临时,ifcfg-eth0,ifcfg-eth1。eth0,eth1是在/etc/modules.conf中建立与对应驱动模块的关系。用 ifdown eth0,ifdown eth1关掉接口,然后用ifup eth0,ifup eth1起动生效。
(4)路由表不用配置,自动生成的就可以。
(5)打开内核的包转发功能,有两种方法echo 1 > /proc/sys/net/ipv4/ip_forwardsysctl
-w net.ipv4.ip_forward = 1可以在命令中使用,也可以为了自动化加入rc.local中。
(6)客户机做IP的设定,注意两边的客户机的网关设定一定指向自己的网关,否则不通。
(7)测试成功。
2。linux路由器防火墙、IPTABLES及linux路由转发之间的关系。
(1)linux 路由转发是基础,IPTABLES在linux路由转发的基础上对转发的包制定了规则。linux路由器防火墙利于IPTABLES对进入本机及本机发出的数据包进行了限制。他们之间是有逻辑关系的。
(2)他们之间的关系,并不是严格的上下层关系,具体表现在在没有打开linux路由转发时,IPTBALES照样可以用,只是对本机进入或本机出去的包起作用,此时IPTABLES上制定的规则不起作用(包根本不能转发)。linux路由转发的打开与否与linux路由防火墙无关,linux路由防火墙只是对进出本机的包起作用。
(3)他们之间的依赖关系。具体表现在IPTBALES对转发包的规则依赖于linux路由包转发是否打开。linux路由防火墙对IPTABLES严格的依赖关系,没有IPTABLES就没有linux路由防火墙。本来linux路由防火墙就是IPTABLES的一个具体应用。
(4)默认状态下,IPTABLES是策略是ACCEPT的,当然也包括转发规则(FORWARD)。从以上可以看出防火墙与包转发无关,所以配好路由不在需其它设定即可通。
3。linux小路由器地址伪装及适应问题。
上面讲到,两个客户机想通信,要求网关都之指新做的这台路由上,可是在一些情况下做不到。这时可以用地址伪装实现。
比如我做了一台新linux路由器,这时他可以与其它科室的一台机可以通信(因为我的新linux路由器一块网卡与其在一个网段嘛),我的另一台客户机通过我做的新linux路由在另一个网段。这时如果我能把其它科室的机器与我的机器网关都设成我的新linux路由器就可以通信了,可是没有这种权限啊!!!
我可以在新linux路由器上通过地址伪装得以实现。
如果实现我可以访问他,他不能访问我可以这么做:
iptables -t nat -A POSTROUTING -o eth0 -s 你的IP地址段/子网掩码表示 -j MASQUERADE
如果实现他可以访问我,可以加上:
iptables -t nat -A POSTROUTING -o eth1 -s 他的IP地址段/子网掩码表示 -j
MASQUERADE
原理及分析:
如果我没有做地址伪装时,我的数据包通过了新的linux路由器,转发到了他的机器,可是因为我的IP地址不与他在同一网段,他利于网关发到了其它的地方。所以只有你对的数据包没有回来的,通过在新的linux路由器抓包可以看的很清楚。
在做了地址伪装后,数据包源地址是新的linux路由器上的地址,因为发过去后是与他在同一网段内,所以不用网关转发,直接发到新的linux路由器,然后就可以返回来。通过在新的linux路由器上抓包也可以看的很清楚。
strongcool 发表于 2006-12-11 18:47
很喜欢哦,顶一下
shencheng2004 发表于 2006-12-26 19:33
敬佩,好贴,值得一学
blackspace 发表于 2006-12-27 09:13
有专门的路由发行版,just一个软盘
=================================================================================
from: http://blog.chinaunix.net/u/29478/showart_258937.html
ip数据包经由路由转发的时候源ip,目的ip是否改变
ip数据包经由路由转发的时候源ip,目的ip是否改变?最近面试网络方面的经常问到这个问题,答案是不能改变的,除非做了nat转换才能改变,不过mac地址是变化的,因为发送端开始不知道目的主机的mac地址,所以每经过一个路由器mac地址是变化的。

目的mac地址是如何得到的?

TCP/IP里面是用的ARP协议。比如新建了一个内网,如果一台机器A找机器B,封装FRAME时(OSI的第二层用的数据格式),要封装对方的MAC,开始时A不知道B的MAC,只知道IP,它就发一个ARP包,源IP是自己的,目的IP是B的,源MAC是自己的,目的MAC是广播的。然后这个请求包在内网内被广播,当其他机器接到这个包时,用目的IP和自己的IP比较,不是的话就丢弃。B接到时,发现IP与自己的一样,就答应这个包的请求,把自己的MAC送给A。如果B是其他子网的机器,那么路由器会判断出B是其他子网,然后路由器把自己的MAC返回给A,A以后再给B发包时,目的 MAC封装的是路由器的。
=================================================================================
=================================================================================
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/47395/showart_1818437.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP