荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: zzt (少年仲永), 信区: Linux
标  题: 虚拟IP
发信站: BBS 荔园晨风站 (Wed Mar 24 13:44:57 1999), 转信

发信人: reden (Offer 快快来啊 ~!), 信区: Linux
标  题: 虚拟IP
发信站: BBS 水木清华站 (Tue Mar 23 13:56:19 1999)

            虚拟IP

               by thhsieh from http://linuxfab.cx


  这几天花了不少时间在研究这个,发现这真是相当实用而且强大,相信是所有

  网管人员都不可不知道的。因此,我试图将它整理成文件,让大家叁考。


  「虚拟 IP 」其实是我自创的名词。在 Linux 中,它指的是 IP-Masq, 而在

  FreeBSD 中,它指的是 NAT service,在我看来二者功能很相近,因此我就用

  这样的名词来统称它们。至於在其他的 UNIX 中能否找到类似的东东,我不清

  楚,如果有人知道的麻烦为我补充一下。关於这项技术,我算是相当後知後觉

  的了,早在一年多前,Linux 就已开始发展,而 FreeBSD 更是在 2.1.X 版发

  展的中期就有了,网路上已有相当多且不错的文件在讨论它们。如果大家觉得

  我这里写得不够详尽可以去各大 BBS 精华区去找资料。


  thhsieh(居士)



   首先来谈谈什麽是「虚拟 IP」。我们都知道在 TCP/IP 的架构下,所有想上网路

   的电脑,不论是用何种方式连上网路,都必须要有一个 *唯一* 的 IP-address。

   举两个最常见的例子: 学校的电脑用网路线连在一起,是经由 ethernet 介面连

   上网路,则该 ethernet 介面必须要有 IP-addr., 如 freebsd.phys.ntu.edu.tw

   的 ethernet IP 为 140.112.52.20 。另一个常见的网路介面为 PPP, 通常是用

   在 modem 拨接上,当您从家里透过 modem 拨接上远端的 modem server 时,有

   些 server 会从中建立起远端与您的电脑间的 PPP 连线协定,於是,您的电脑就

   会有一个 PPP 介面,而它的 IP-addr. 则由远端 server 指定给您 (这一切都是

   全自动进行) ,於是您就可以透过 modem (PPP) 对外连线,就好像您的电脑直接

   接在网路上一样。


   在我们系上的计算机室,目前有两部机器可以做 PPP modem server (但规定只有

   老师才能使用) ,一是 freebsd.phys, 另一是 linux.phys。 freebsd.phys 用

   的是一条独立电话线,可以 24 小时全天候服务;而 linux.phys 用的是机房的

   电话分机,故只有下班才能用。按照上头所述,如果同时要提供两个 modem 的

   PPP 拨接服务,就必须要有两个空的 IP-addr. 留下来,以便 PPP 连线建立时设

   定给用户的电脑。因此,在过去计算机室就为此保留了两个 IP: 140.112.52.250

   及 140.112.52.252, 让 ppp server 使用。然而,这样一来就造成了 IP 的浪

   费,很明显的,当无人拨进来时这两个 IP 根本没有人使用,而且 modem server

   也不是无时无刻都会有人要拨进来。这时候,所谓的「虚拟 IP 」就派上用场

   了。


   简单的说,虚拟 IP 就是假的 IP, 也就是未经注册的 IP, 但 server 端有能力

   将这假的 IP 变成真的 IP 送往网际网路,通行无阻,就好像有真的 IP 一样。

   以下是简单的架构图:



   也就是说,在实做上我们必须将网路分成两块,一块就是使用虚拟 IP 的电脑群,

   它们不能与使用真正已注册过的 IP 的电脑 (或 Internet) 混在一起。而二者之

   间的桥梁要靠一部拥有 IP-Masq 的 Linux 或 NAT 的 FreeBSD 连起来。注意到用

   做「桥梁」的 server 拥有两个 (以上) 的网路介面,分别接 local net 与

   internet,该 server 即称之为 "gateway" 或 "router",这些不同的网路介面可

   以有不同的IP-addr.。所以,我们常说某某的电脑的 IP 是多少,其实不是百分之

   百正确,如果该电脑拥有多个网路介面的话,那它不同的介面可能会有不同的

   IP-addr.。眼前的例子就是 linux.phys 与 freebsd.phys, 在使用者拨接上来时

   它就会自动建立起ppp0 这个介面,加上原来的 ethernet 介面就是两个。在过

   去,它们的 ppp0 介面与 ethernet 介面的 IP 是设得一样的,以 freebsd.phys

   来说:



   其中 ed0 即为 FreeBSD 的 ethernet 介面。现在要使用虚拟 IP 的技术,我们

   将会设定其 ppp0 为不同 (虚拟) 的 IP。同理,一部电脑如果装两张网路卡同时

   接两个网路,则它就会有两个 ethernet 介面:



   要注意的是,如果 server 中的各网路介面 IP 的号码如果相同,或前几码相同

   (如 freebsd.phys 的例子),则代表它所连接的子网路属同一个网域,否则为不

   同网域。例如 freebsd.phys 的 ed0 是属於 140.112.52.0 这个网域,而拨接上

   来的用户其 gateway 为 140.112.52.20 (ppp0 的 IP), 其本身的 IP 为

   140.112.52.252, 则它们也都属於 140.112.52.0 这个网域。


   前面提过,使用像 140.112.52.252 这种已注册、合法的 IP 来给拨接用户使用

   会造成浪费,因此,底下我们就用虚拟 IP 并透过 FreeBSD 的 NAT 来做拨接服

   务。在 RCF 1597 的定义中,可以不经注册而任意使用的 IP 为:

                           10.0.0.0

                                                    -

                                                       10.255.255.255

                           172.16.0.0

                                                    -

                                                       172.31.255.255

                           192.168.0.0

                                                    -

                                                       192.168.255.255


   依规定,凡是这类的 IP 都不能直接出现在网际网路上,因此当我们私底下

   (不直接连上网际网路) 用这些 IP 时,不必担心与别人冲到。在此,我们的虚

   拟 IP 就选用 192.168.0.0 这一组,则以 FreeBSD 为例,其 PPP 与

   ethernet 的架构就变为:








   也许有人会问,为什麽 FreeBSD 一定要有 NAT? 若没有不是一样可以通吗? 没

   错,一样可以通,但这样一来就违反了规定, 192.168.1.X 就不再是虚拟 IP, 而

   变成真实 IP, 直接连上 internet 了 (仅管 modem 的连线是很短暂的)。 NAT 所

   做的工作,就是将 192.168.1.X 这类虚拟 IP ,变成真实的 IP 出去,让外界永

   远不知道实际上有这些虚拟 IP 存在。举个例子,假设您是在此架构下的用户端,

   您可以经由 FreeBSD (或 Linux) 自由地连往 internet, 不论是 telnet, ftp,

   www ....假设您现在用 telnet 连往 bbs, 则虽然您用的是虚拟 IP, 但如果您去

   看 bbs 的资讯看您是来自何方时,显示却会是真实的 IP (以上头的例子,即为

   140.112.52.20)


   这就是虚拟 IP 最奇妙的地方! 在外界,您永远是以「真实 IP」出现,但人家永

   远不会知道,其实您是来自 Linux/FreeBSD 底下的一部用「虚拟 IP」的电脑。因

   此,我只要在 Linux/FreeBSD server 端注册一个真实 IP, 则透过此技术我可以

   *合法地*在後头串接一大串使用虚拟 IP 的电脑。这麽做,其优点就如前所述,且

   使用虚拟IP 的电脑等於是隐藏在 Linux/FreeBSD server 身後,受到 server 端

   完全的保护。而缺点是,使用虚拟 IP 的电脑不能公开,也就是,它不能架

   server (谁知道世上有这麽一台 www 或 ftp server 存在?),也不能接 mail (在

   外头的电脑怎麽知道mail 要送到这里来?),当然,也不能被外头的电脑 telnet

   进来。请特别注意我这「公开」与「外头」的字眼,事实上使用虚拟 IP 还是可以

   架 server, 接 mail 等,但只有同在同一个虚拟 IP 网域下的机器才知道,因为

   同在一部 Linux/FreeBSDserver 的管理下,它会为大家做好沟通的工作。但外头

   的电脑则不行了。


   再来谈「网域」的问题。例如,利用这样的技术,我们可以将机房中 PPP 拨接

   server规划如下:







   大家会奇怪,这样如果 client 1 与 client 2 若同时上来, IP 不是冲到了吗?

   不会! 第一: client 1 与 client 2 属於不同网域,分别由 freebsd 与 linux掌

   管。第二: freebsd 用 NAT, linux 用 IP-Masq 将这两个网域藏起来了,所以实

   际上它们谁也瞧不见对方。假设双方连上来的人在 bbs 上碰面,则在我们看来,

   如前所述, client 1 是来自 140.112.52.20 这个 IP, 而 client 2 是来自

   140.112.52.122 这个 IP。


   讲了这麽多,我们已可以约略看出虚拟 IP 的应用了。前面所提的 PPP 拨接是一

   个,另一个就是同一实验室里头的电脑。并非所有的电脑都需要对外公开的,尤其

   是用做平行计算的电脑群。现在将十多部甚至一、两百部电脑透过网路连起来做平

   行计算已成风潮,像我们系上有许多老师听说就是此道的高手。但是,如果说一个

   实验室要搞平行计算而申请十多个或上百个 IP 的话,是相当浪费的 (事实上根本

   不可能,因为没那麽多 IP),因此,使用虚拟 IP 技术,可以大大地节省网路资

   源。


   好了,以下我简述实作的方法: 不论是用 Linux 的 IP-Masq 或 FreeBSD 的 NAT,

   其设定的道理都相同,主要有以下四个步骤:


       1.设定好 server 端的网路介面。就我们的例子,一为 ethernet 介面,另一

             即为供 modem 拨接上来的 PPP 介面。其设定方式算是另一个专题,这里


             详述。

       2.设定 Kernel, 使其拥有 IP-Masq (for Linux) 或 IP-Divert (for Fr

             eeBSD) 的能力。於 FreeBSD, 还要同时起动 natd server。

       3.设定 IP-Firewall rule ,建立虚拟 IP 与真实 IP 之间的连线。

       4.设定 client 端以使用 server 端的虚拟 IP。就我们的例子而言,如果原本


             client 端已能顺利地由 modem 拨接上线,则理论上 server 端改用虚拟
 IP

             後 client 不需要改变任何设定,原因是 client 端的 IP 与 gateway
设定

             是每次在 PPP 连线建立时即全自动进行 (由 server 端控制)。但如果

             client 端是用 ethernet 与 server 端连线的话,则必须进行这一步的


             定。


   以下我就简述第 2, 3 步的实作, Linux 与 FreeBSD 分别讲,同时也讲一下使用

   了虚拟 IP 之後, client 端所呈现的网域环境 (第 4 步)。


   有一点要稍作补充: 不论是 IP-Masq 或 IP-Divert & NAT, 其设计上都是基於

   IP-Firewall 的。所谓 IP-Firewall 即俗称「防火墙」,是一种相当强大的网路

   防护系统,它可以在网路封包的层级直接控制封包的传输,如是否让来自某 IP的

   封包进入、通过、输出此 Firewall server。在很多私人网路中,其网域与外界网

   路之间常常会装设一台 Firewall server, 以限定、或完全隔绝内外网路的流通,

   以达到保护内部网路的目的。因此,如有外来的入侵者想入侵内部网路的话,则第

   一步就是要突破 Firewall server 这一关,而这通常是很不容易办到的。文件上

   说, IP-Masq *也许是* 比起 IP-Firewall 安全等级更高的防护,我猜原因可能

   是内部网路的虚拟 IP 是靠 IP-Masq server 建立起来的,如果外来入侵者在千辛

   万苦之後终於破坏了 server, 但这也等於破坏了 IP-Masq 的架构,也就等於整个

   虚拟 IP 网路都不存在了 (连不通),他还是无法进而入侵内部网路的电脑。正因

   为 IP-Masq 或 IP-Divert 是架构在 IP-Firewall 之上,因此我们必须要有第 3

   步的「设定 IP-Firewall rule」,而且设定这一步时要特别小心,如果设错了有

   可能造成 server 端网路完全不通。



   Linux Masq


  我们从第二步设定 Kernel, 并打开 IP-Masq 的功能开始。文件上说只要是

  Kernel-2.0.x 的版本再加 patch 皆可,我这里所用的 Kernel 版本为 2.0.34, 完全


  不需 patch 即可使用,所以建议用这个版本 (或以上)的 kernel。在 make config


  时,请打开以下的选项 (节录自 IP-Masquerade MiniHOWTO):


           * Prompt for development and/or incomplete code/drivers

             CONFIG_EXPERIMENTAL

             - 如此您即可选取 *正在实验中的* IP-Masq 功能。


           * Enable loadable module support

             CONFIG_MODULES

             - 如此您可使用 kernel 的模组功能。


           * Networking support

             CONFIG_NET


           * Network firewalls

             CONFIG_FIREWALL


           * TCP/IP networking

             CONFIG_INET


           * IP: forwarding/gatewaying

             CONFIG_IP_FORWARD


           * IP: firewalling

             CONFIG_IP_FIREWALL


           * IP: masquerading (EXPERIMENTAL)

             CONFIG_IP_MASQUERADE

             - 虽然它被归类为 experimental, 但您一定要选它。


           * IP: ipautofw masquerade support (EXPERIMENTAL)

             CONFIG_IP_MASQUERADE_IPAUTOFW

             - 建议您选这个。


           * IP: ICMP masquerading

             CONFIG_IP_MASQUERADE_ICMP

             - 支援 ICMP 的封包,主要用於从虚拟 IP ping 外头的世界,可选

               可不选。


           * IP: always defragment

             CONFIG_IP_ALWAYS_DEFRAG

             - 强烈建议您选这个。


           * Dummy net driver support

             CONFIG_DUMMY

             - 建议您选这个。


  Compile 完 kernel 与 module 之後,重新启动电脑,请将 IP-Masq 所需的 module


  入。例如,我希望虚拟 IP 可以对外用 ftp 传档,则我就必须载入 ftp 的 module:



          modprobe ip_masq_ftp


  如此,使用虚拟网路的机器就拥有 telnet, ftp, www, ping .... 等这几项基本能力


  了。除此之外, kernel 还提供其他的 module 以支援如 IRC, Raudio 等网路功能,


  可以选择性地载入。这些可以写在开机启动档中在系统开机时一并完成。接下来是第
 3

  步,设定 IP-Firewall rule。在 Linux 是用 ipfwadm 这指令,这指令的用法相当多


  样,详细用法请见 man ipfwadm, 在这里只简述简单用法。 ipfwadm 在设定封包流通


  的规则主要有三个:


          ipfwadm -I ....         (设定流入 server 的封包)

          ipfwadm -O ....         (设定流出 server 的封包)

          ipfwadm -F ....         (设定由某网域经由本 server 流向另一网域的封


  包)


  如在之後加上 -l 的叁数,则会列出目前已设定的 rule 。例如在 linux.phys 中,


  设定的 rule 为:


  $ /sbin/ipfwadm -I -l

  IP firewall input rules, default policy: accept

  type  prot source               destination          ports

  deny  all  127.0.0.0/8          anywhere             n/a

  deny  all  127.0.0.0/8          anywhere             n/a

  $ /sbin/ipfwadm -O -l

  IP firewall output rules, default policy: accept

  $ /sbin/ipfwadm -F -l

  IP firewall forward rules, default policy: deny

  type  prot source               destination          ports

  acc/m all  192.168.1.0/24       anywhere             n/a


  "default policy" 意思是,如果封包没有受限与其他的 rule, 则 kernel 就以此预


  值处理它。以 "Input rules" 为例,凡是来自 127.x.x.x 网域的封包完全被档在

  server 之外 (deny), 而其他的封包则可以被 server 接受。原因是 127.x.x.x 是属


  於 loop back 设定用的,按规定任何公开的电脑都不能将 IP 设成这个,而在此设这


  个 rule 主要是预防某些粗心大意的系统管理者误设了这样的 IP, 而该电脑又试图与


  我们的 server 连线。


  由於 linux.phys 使用的是 Debian-2.0 系统,在 kernel 起动 IP-Firrewall 功能


  时,系统在每次重开机後都会自动设好以上的 "Input, Output rules", 使其 defau
lt

  policy 为 accept, 如此该 server 才能自由自在地对外连线、或接受外来的连线。


  时 "Forward rules" 的 default policy 亦为 accept, 即外头的网路可以自由地经


  本 server 连线到内部网路、反之亦然。现在要使用 IP-Masq 以连接内部的虚拟 IP


  与外部的真实 IP, 我们必须改变此设定:


          ipfwadm -F -p deny

          (将其 default policy 设成 deny, 从此以後内外网路无法自由连线)




          ipfwadm -F -a m -S 192.168.1.0/24 -D 0.0.0.0/0

          (将来自 192.168.1.x (内部、虚拟) 网域的封包,经由 IP-Masq (m)

          传送到外部网路的任何地方 (0.0.0.0/0), 当然,在此之前我们必须

          先设好第一步,让 PPP 介面接管 192.168.1.x 这个网域)


  如此一来,虚拟 IP 与外头的世界就正确地建立连线了。这两行可以直接写入开机

  启动档中以自动执行。



    FreeBSD natd



  同样的,我们先来看看第二步。重新 compile kernel 时,请将以下选项写入设定档


  (节录自 man natd):


          options IPFIREWALL

          options IPDIVERT


  并在 /etc/rc.conf 中写入这一行


          gateway_enable=YES


  以便在重开机时开启 gateway 的功能。与 Linux 最大的部同是, Linux 的 IP-Mas
q的

  运作完全是在 kernel 中进行,而 FreeBSD 的 NAT 还需要跑一只 natd 的程式来运
作。

  请在 /etc/services 加入一行:


          natd          6668/divert  # Network Address Translation socket


  然後在开机时执行这个程式:


          natd -interface ed0


  其意义为: 所有来自虚拟 (内部) 网路的封包,经转换後经由 ed0 (ethernet) 介面
对外

  传送。


  第二步我们要设定 IP-Firewall rule 。在 FreeBSD 要用 ipfw 指令。使用 ipfw -
a

  show 会列出目前所有的 rule:


  # /sbin/ipfw -a show

  01000        318      30934 allow ip from any to any via lo0

  01010          0          0 deny ip from 127.0.0.0/8 to 127.0.0.0/8

  06000     177084   47865019 divert 6668 ip from any to any

  65000     241446   67969713 allow ip from any to any

  65535          0          0 deny ip from any to any


  与 Linux 的 ipfwadm 不一样,在 FreeBSD 中不特别区分 Input, Output, Forewar
d这

  三项,也没有 default policy, 但它每一个 rule 都有一个号码,代表 rule 的比对


  序。进来的封包会按此顺序一个个地比对,一旦比对符合就按此 rule 来处理。以上


  rule 其意义是:


  01000:  允许封包经由 lo0 (loop back) 互传

  01010:  拒绝 127.0.0.0/8 到 127.0.0.0/8 的封包 (作用与上述 Linux 的 rule 类
似)

  06000:  使用 IP-Divert 建立虚拟与真实 IP 的连线

  65000:  允许所有的封包自由流通 (如此 server 本身便能自由对外连线、接受连线
)

  65535:  拒绝所有的封包


  在 freebsd.phys 系统中,用的是 FreeBSD-2.2.5 作业系统,当启动 IP-Firewall之


  後,除了 06000 那个 rule 以外,其他的 rule 系统每次重开机时便会帮我们自动建


  立。而要使用 IP-Divert & natd, 我们必须自行建立 06000 这个 rule:


  /sbin/ipfw add 06000 divert natd all from any to any


  其中 06000 这个数字就决定了此 rule 在整个 rule table 的安插顺序。请注意顺序


  常重要! 它一定要在 65000 之前,否则的话,来自虚拟 IP 的封包因为满足65000 r
ule,

  系统就以此 rule 处理,而不再往下看有关 IP-Divert 的 rule, 结果是,虚拟 IP
的封

  包未经处理就往外丢,连线无法正确建立,网路不通。



   最後,有两点要特别强调:


       a.在我们的例子中,是要建立 PPP 介面与 ethernet 介面之间的连线,这是两
个不

             同的介面,因此在设定 IP-Masq 或 IP-Divert 的 rule 时,不要特别指
定介面

             (如 Linux 中可以在 ipfwadm 之後加 -W <介面名> 来指定介面,而 Fr
eeBSD 中

             可以在 ipfw 之後加 via <介面名> 来指定介面),如此方能正确建立连
线。

       b.在设定这些 IP-Firewall 的 rule 时,切记一定要在 server 的 console 端


             行! 请不要从远端 telnet 到 server 上设定。原因是如果不小心设定错
误,会造

             成 server 端网路完全不通,这时您唯一的做法还是只有回到 console
端解决。

             除此之外,在 FreeBSD 中由於 IP-Divert 必须配合 natd 程式运作,因
此,当

             natd 正在运作时,切记不要任意砍了它,否则的话可能造成 IP-Divert
 找不到

             natd 处理封包,而使网路整个挂掉 (当然,如果您人在 console 端,可
以很容易

             地将它设回来) 。正确的做法,应该是先移除 IP-Divert 那个 rule, 然
後再砍掉

             natd 。


   就以上的设定方式, client 端的虚拟 IP 与网路环境便建立起来了。以下我列示其


   路环境,以供第 4 步的设定叁考:


   1. client 端可用的 IP 为 192.168.1.2 - 192.168.1.254 (192.168.1.1 已被 se
rver

   端所使用)


   2. client 端的 gateway 为 192.168.1.1


   3. client 端的网域为 192.168.1.0


   4. client 端的 netmask 为 255.255.255.0


   5. client 端的 broadcast 为 192.168.1.255


   6. client 端的 name server 仍然可以设成 140.112.52.5



   ***** 以上内容,仅供网管叁考,希望大家爱用虚拟 IP 技术 ****









    Linux 部分:


              1. IP-Masquerade Mini HOWTO

                 (linux.phys:/usr/doc/HOWTO/mini/IP-Masquerade.gz

                  http://www.linux.org.tw/CLDP/mini/IP-Masquerade.html)


              2. Firewall HOWTO

                 (linux.phys:/usr/doc/HOWTO/Firewall-HOWTO.gz

                  http://www.linux.org.tw/CLDP/Firewall-HOWTO.html)


              3. man ipfwadm


              4. Kernel HOWTO

                 (linux.phys:/usr/doc/HOWTO/Kernel-HOWTO.gz

                  http://www.linux.org.tw/CLDP/Kernel-HOWTO.html)


    FreeBSD 部分:


              1. man natd


              2. man ipfw


              3. man divert


              4. Configure Kernel paper

                 (freebsd.phys:/usr/share/doc/smm/02.config)


              5. man rc.conf


    网路理论与概念:


              1. NET-3 HOWTO

                 (linux.phys:/usr/doc/HOWTO/NET-3-HOWTO.gz)


              2. tcp-ip-admin.doc



              (http://twcpro.phys.ntu.edu.tw/~thhsieh/personal/doc/Net/tcp-i
p-admin.doc)


              3. tcp-ip-intro.doc



              (http://twcpro.phys.ntu.edu.tw/~thhsieh/personal/doc/Net/tcp-i
p-intro.doc)



              PPP & Modem server 建制:


              1. PPP HOWTO

                 (linux.phys:/usr/doc/HOWTO/PPP-HOWTO.gz)


              2. man pppd


              3. http://www.freebsd.org/tutorials/ppp/ppp.html


              4. Serial HOWTO

                 (linux.phys:/usr/doc/HOWTO/unmaintained/Serial-HOWTO.gz)


--
1m在江湖中,只要拿起了刀,就是一场1m无涯2m的梦。

m1m※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 159.226.21.168]m


--



日出东方,唯我不败;
    天上地下,唯我独尊。

※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.72]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店