原始文件:Linux IP Alias mini HOWTO
檔案敘述:如何在 Linux 機器上設定 IP 別名
翻譯日期:1997/10/23
翻譯維護:cwhuang@phys.ntu.edu.tw
----------------------------------------------------------------------------------------------

      本文最後修改日期: January 13th 1997.

    如何在 Linux 機器上設定 IP 別名(aliasing)

   GNU Copyleft 1996/1997 Harish Pillay (h.pillay@ieee.org)

 原始站: http://home.pacific.net.sg/~harish/linuxipalias.html


摘要:

本文說明如何在 Linux 機器上設定並執行 IP 別名.除此之外,還有如何設定在 IP
別名上接收 e-mail.


我的設定:

* 最新的核心 (2.0.27 - 從 ftp://ftp.funet.fi/pub/Linux/kernel/src/v2.0 取得) -
  從 1.3.7x 以後就可以.
* 將 IP Alias 編譯成可載入模組.你在用 "make config" 指令編譯核心時,如果要
  把 IP Masq 編譯成模組(Modules)應會被問到.查看 Modules HOWTO(如果有的話)
  或是查看 /usr/src/linux/Documentation/modules.txt 中的資訊.
* 我在已分配給我的 IP 之外還又要了兩個額外的 IP.
* 一片 D-Link DE620 網路卡(不重要,任何 Linux 支援的網路卡都行).


指令:

* 首先載入 IP Alias 模組(如果你將它編譯進核心可跳過此步驟):

  /sbin/insmod /lib/modules/`uname -r`/ipv4/ip_alias.o

* 再來,建立回繞(loopback)裝置,以及 eth0 界面上以主 IP 號碼為開頭的所有 IP
  號碼:

     /sbin/ifconfig lo 127.0.0.1
     /sbin/ifconfig eth0 up
     /sbin/ifconfig eth0 172.16.3.1
     /sbin/ifconfig eth0:0 172.16.3.10
     /sbin/ifconfig eth0:1 172.16.3.100

  172.16.3.1 是主 IP 號碼,而 .10 及 .100 是別名.比較奇怪的地方是 eth0:x,
  其中 x=0, 1, 2, ... n 在每一不同的 IP 號碼上.主 IP 號碼不需要這個.

* 第三步是建立遞送路徑.首先,遞送到回繞裝置,然後是區域網路,最後是不同的 
  IP 號碼及預設遞送路徑:

     /sbin/route add -net 127.0.0.0
     /sbin/route add -net 172.16.3.0 dev eth0
     /sbin/route add -host 172.16.3.1 dev eth0
     /sbin/route add -host 172.16.3.10 dev eth0:0
     /sbin/route add -host 172.16.3.100 dev eth0:1
     /sbin/route add default gw 172.16.3.200

就這樣了.

在上面的例子中,為了說明我用的是 RFC 1918 所定義的私用 IP 號碼.用你正式或
私有的 IP 號碼來取代它.

上面的例子只展示了三個 IP 號碼.在 /usr/include/linux/net_alias.h 中定義的
最大值是 256.在一片網路卡上 256 個 IP 號碼已經很多了 :-)!

我用 /sbin/ifconfig 看起來像這樣:

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0
          UP BROADCAST LOOPBACK RUNNING  MTU:3584  Metric:1
          RX packets:5088 errors:0 dropped:0 overruns:0
          TX packets:5088 errors:0 dropped:0 overruns:0

eth0      Link encap:10Mbps Ethernet  HWaddr 00:8E:B8:83:19:20
          inet addr:172.16.3.1  Bcast:172.16.3.255  Mask:255.255.255.0
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:334036 errors:0 dropped:0 overruns:0
          TX packets:11605 errors:0 dropped:0 overruns:0
          Interrupt:7 Base address:0x378

eth0:0    Link encap:10Mbps Ethernet  HWaddr 00:8E:B8:83:19:20
          inet addr:172.16.3.10  Bcast:172.16.3.255  Mask:255.255.255.0
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0
          TX packets:0 errors:0 dropped:0 overruns:0

eth0:1    Link encap:10Mbps Ethernet  HWaddr 00:8E:B8:83:19:20
          inet addr:172.16.3.100  Bcast:172.16.3.255  Mask:255.255.255.0
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0
          TX packets:0 errors:0 dropped:0 overruns:0

而 /proc/net/aliases 是

device           family address
eth0:0           2      172.16.3.10
eth0:1           2      172.16.3.100

而 /proc/net/alias_types 是

type    name            n_attach
2       ip              2

當然,/proc/net 的內容是由 ifconfig 指令產生而非用手寫的!


問: 如何在重新啟動機器後保持設定?
答: 不論你是用 BSD 形式或是 SysV 形式(例如 Red Hat)的 init 啟動,你都可以把它
    放在 /etc/rc.d/rc.local 中.下面是我在我的 SysV init 系統(Red Hat 3.0.3 
	及 4.0)中的設定:

   * 我的 /etc/rc.d/rc.local: (修改過只顯示相關的部份)

     #setting up IP alias interfaces
     echo "Setting 172.16.3.1, 172.16.3.10, 172.16.3.100 IP Aliases ..."
     /sbin/ifconfig lo 127.0.0.1
     /sbin/ifconfig eth0 up
     /sbin/ifconfig eth0 172.16.3.1
     /sbin/ifconfig eth0:0 172.16.3.10
     /sbin/ifconfig eth0:1 172.16.3.100
     #setting up the routes
     echo "Setting IP routes ..."
     /sbin/route add -net 127.0.0.0
     /sbin/route add -net 172.16.3.0 dev eth0
     /sbin/route add -host 172.16.3.1 eth0
     /sbin/route add -host 172.16.3.10 eth0:0
     /sbin/route add -host 172.16.3.100 eth0:1
     /sbin/route add default gw 172.16.3.200
     #


問: 我如何在具 IP 別名的機器上在不同的 IP 別名號碼上接收電子郵件(在一部用
    sendmail 的機器上)?
答: * 建立(如果還沒有的話)一個檔案,例如叫 /etc/mynames.cw.不需要真的是這個
    名字,也不一定要放在 /etc 目錄下.

    * 在那個檔案中,放上別名 IP 號碼的完整領域名稱.如果別名的 IP 沒有領域名
	稱,你可以用這個 IP 本身.
    
    /etc/mynames.cw:
     ----------------
     # /etc/mynames.cw - include all aliases for your machine here; # is a comment.
     domain.one.net
     domain.two.com
     domain.three.org
     4.5.6.7

    * 在你的 sendmail.cf 檔中,在它定義檔案類別巨集 Fw 的地方,加上:

     .
     .
     .
     ##################
     #   local info   #
     ##################
     .
     .
     # file containing names of hosts for which we receive email
     Fw/etc/mynames.cw
     .
     .
     .

    * 這樣應該就可以了.以測試模式執行 sendmail 以測試新的設定:

     ganymede$ /usr/lib/sendmail -bt
     ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
     Enter < ruleset> < address>
     > 0 me@4.5.6.7
     rewrite: ruleset  0   input: me @ 4 . 5 . 6 . 7
     rewrite: ruleset 98   input: me @ 4 . 5 . 6 . 7
     rewrite: ruleset 98 returns: me @ 4 . 5 . 6 . 7
     rewrite: ruleset 97   input: me @ 4 . 5 . 6 . 7
     rewrite: ruleset  3   input: me @ 4 . 5 . 6 . 7
     rewrite: ruleset 96   input: me < @ 4 . 5 . 6 . 7 >
     rewrite: ruleset 96 returns: me < @ 4 . 5 . 6 . 7 . >
     rewrite: ruleset  3 returns: me < @ 4 . 5 . 6 . 7 . >
     rewrite: ruleset  0   input: me < @ 4 . 5 . 6 . 7 . >
     rewrite: ruleset 98   input: me < @ 4 . 5 . 6 . 7 . >
     rewrite: ruleset 98 returns: me < @ 4 . 5 . 6 . 7 . >
     rewrite: ruleset  0 returns: $# local $: me
     rewrite: ruleset 97 returns: $# local $: me
     rewrite: ruleset  0 returns: $# local $: me
     > 0 me@4.5.6.8
     rewrite: ruleset  0   input: me @ 4 . 5 . 6 . 8
     rewrite: ruleset 98   input: me @ 4 . 5 . 6 . 8
     rewrite: ruleset 98 returns: me @ 4 . 5 . 6 . 8
     rewrite: ruleset 97   input: me @ 4 . 5 . 6 . 8
     rewrite: ruleset  3   input: me @ 4 . 5 . 6 . 8
     rewrite: ruleset 96   input: me < @ 4 . 5 . 6 . 8 >
     rewrite: ruleset 96 returns: me < @ 4 . 5 . 6 . 8 >
     rewrite: ruleset  3 returns: me < @ 4 . 5 . 6 . 8 >
     rewrite: ruleset  0   input: me < @ 4 . 5 . 6 . 8 >
     rewrite: ruleset 98   input: me < @ 4 . 5 . 6 . 8 >
     rewrite: ruleset 98 returns: me < @ 4 . 5 . 6 . 8 >
     rewrite: ruleset 95   input: < > me < @ 4 . 5 . 6 . 8 >
     rewrite: ruleset 95 returns: me < @ 4 . 5 . 6 . 8 >
     rewrite: ruleset  0 returns: $# smtp $@ 4 . 5 . 6 . 8 $: me < @ 4 . 5 . 6 . 8 >
     rewrite: ruleset 97 returns: $# smtp $@ 4 . 5 . 6 . 8 $: me < @ 4 . 5 . 6 . 8 >
     rewrite: ruleset  0 returns: $# smtp $@ 4 . 5 . 6 . 8 $: me < @ 4 . 5 . 6 . 8 >
     >

    注意,當我測試 me@4.5.6.7 時,它將信件送到本地機器上,因為 me@4.5.6.8 會
	被 smtp mailer 拒絕.這是正常的回應.

    * 所有都設定完成了.

希望前面說的對某些人有用.

感謝那些在 Linux 及 IP 別名上做了偉大貢獻的人們.還有特別感謝 Juan Jose 
Ciarlante 澄清我的疑問.還有感謝那些為我找出打字錯誤及提供建議的人!

如果你認為這份文件有用,或有改進的建議的話,請寄電子郵件給我到
h.pillay@ieee.org.

好好享受吧!

有任何問題嗎? 來信到 h.pillay@ieee.org