如果你的私用网路里有任何重要的信息,在使用 IP Masquerade 之前请三思。这可能成为你通往网际网路的闸道,反之亦然,也可能成为另一边的世界进入你私用网路的途径。
如果你的 Linux 发行套件已经将下面将提到的所需特性及模块编译进去的话(大部份模块化的核心有你所需的东西),那么你不需要重新编译核心。 不过仍十分建议你读一读此节,因为它包含了其它有用的信息。
tar xvzf linux-2.2.x.tar.gz -C /usr/src
将核心原始码解开至 /usr/src/
,
其中 x 是 2.2 之后的修补层级(确定有一叫 linux
的目录或符号连结)。
下列选项要回答 YES:
* Prompt for development and/or incomplete code/drivers
CONFIG_EXPERIMENTAL
- 这将让你能选择把实验性的 IP Masquerade 程序码编译到核心里去
* Enable loadable module support
CONFIG_MODULES
- 让你能够载入 ipmasq 相关模块如 ip_masq_ftp.o
* 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
CONFIG_IP_MASQUERADE
* IP: ipportfw masq support
CONFIG_IP_MASQUERADE_IPPORTFW
- 建议加入
* IP: ipautofw masquerade support
CONFIG_IP_MASQUERADE_IPAUTOFW
- 可选用
* IP: ICMP masquerading
CONFIG_IP_MASQUERADE_ICMP
- 支持伪装 ICMP 封包,建议加入
* IP: always defragment
CONFIG_IP_ALWAYS_DEFRAG
- 高度建议使用
* Dummy net driver support
CONFIG_DUMMY
- 建议加入
* IP: ip fwmark masq-forwarding support
CONFIG_IP_MASQUERADE_MFW
- 可选用
注意: 这只不过是你跑 IP Masquerade 所需的项目,其它的按照你所需的来选择。
make modules; make modules_install
/etc/rc.d/rc.local
文档
(或其它你认为适当的文档)中以便于每次重开机时自动载入位于
/lib/modules/2.2.x/ipv4/
的模块:
.
.
.
/sbin/depmod -a
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_raudio
/sbin/modprobe ip_masq_irc
(以及其它的模块如 ip_masq_cuseeme, ip_masq_vdolive,
如果你有加上这些修补的话)
.
.
.
重要: IP 转送功能在 2.2.x 版核心中预设是关闭的,请确定你以此指令将其打开:
echo "1" > /proc/sys/net/ipv4/ip_forwarding
对于 Red Hat 的使用者来说,你可以把 /etc/sysconfig/network
中的
FORWARD_IPV4=false
改成 FORWARD_IPV4=true
。
tar xvzf linux-2.0.x.tar.gz -C /usr/src
将核心原始码解开至 /usr/src/
,
其中 x 是 2.0 之后的修补层级(确定有一叫 linux
的目录或符号连结)。
下列选项要回答 YES:
* Prompt for development and/or incomplete code/drivers
CONFIG_EXPERIMENTAL
- 这将让你能选择把实验性的 IP Masquerade 程序码编译到核心里去
* Enable loadable module support
CONFIG_MODULES
- 让你能够载入模块
* 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
- 这虽然是实验性的,但却是 *必须* 的
* IP: ipautofw masquerade support (EXPERIMENTAL)
CONFIG_IP_MASQUERADE_IPAUTOFW
- 建议加入
* IP: ICMP masquerading
CONFIG_IP_MASQUERADE_ICMP
- 支持伪装 ICMP 封包,可选用
* IP: always defragment
CONFIG_IP_ALWAYS_DEFRAG
- 高度建议使用
* Dummy net driver support
CONFIG_DUMMY
- 建议加入
注意: 这只不过是你跑 IP Masquerade 所需的项目,其它的按照你所需的来选择。
make modules; make modules_install
/etc/rc.d/rc.local
文档
(或其它你认为适当的文档)中以便于每次重开机时自动载入位于
/lib/modules/2.0.x/ipv4/
的模块:
.
.
.
/sbin/depmod -a
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_raudio
/sbin/modprobe ip_masq_irc
(以及其它的模块如 ip_masq_cuseeme, ip_masq_vdolive,
如果你有加上这些修补的话)
.
.
.
重要: IP 转送功能在 2.0.34 之后的核心中预设是关闭的,请确定你以此指令将其打开:
echo "1" > /proc/sys/net/ipv4/ip_forwarding
对于 Red Hat 的使用者来说,你可以把 /etc/sysconfig/network
中的
FORWARD_IPV4=false
改成 FORWARD_IPV4=true
。
因为所有其它机器都没有正式指定的位址,必须有个正确的方式来分配位址给这些机器。
节自 IP Masquerade FAQ:
有份 RFC (#1597, 现在可能已过时了) 是有关没有与外界连线的网路该使用什么 IP 位址。有三个数字区块是特别为这个目的而保留的。其中一个我使用的是 192.168.1.n 到 192.168.255.n 之间的 255 Class-C 子网路。
节自 RFC 1597:
第三节: 私用位址空间
网际网路位址指定当局(IANA: Internet Assigned Numbers Authority)
已经保留下列三个区块的 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
我们将称第一个区块为 "24位元区块",第二个为 "20位元区块",
而第三个则称为 "16位元区块"。注意到第一个区块就只是个
class A 网路号码,第二个区块则是连续的 16 个 class B 网路
号码,而第三个区块是一组 255 个连续的 class C 网路号码。
所以,如果你要使用一个 class C 网路的话,那么你的机器应该以 192.168.1.1, 192.168.1.2, 192.168.1.3, ..., 192.168.1.x 来名之。
192.168.1.1 通常是闸道这台机器,在此即你连上网际网路的 Linux 主机。注意 192.168.1.0 以及 192.168.1.255 分别为网路以及广播位址,是保留的。避免在你的机器上使用这些位址。
除了为每台机器设定适当的 IP 位址之外,你也应该设定适当的闸道。一般说来,这是非常直接了当的。你只需简单地输入 Linux 主机的位址(通常是 192.168.1.1)作为闸道位址。
关于领域名称服务,你可以加入任何 DNS 系统。最可能的应该是你 Linux 使用的那一个。你也可以选择性地加上任何网域字尾(domain suffix) 。
在你重新配置这些 IP 位址之后,记得重新启动适当的服务或是重新开机。
下面的配置范例假设你使用一个 Class C 网路并且以 192.168.1.1 作为 Linux 主机的位址。请注意 192.168.1.0 及 192.168.1.255 是保留的。
Ping
你的 linux 主机: 从'开始/执行',输入 ping 192.168.1.1ping
外面的世界。)
HOSTS
文档,如此你可以使用区域网路里的机器名称。在 windows 目录里有个称为 HOSTS.SAM
的范例。
Ping
一下你的 Linux 主机以测试网路连接: 在 'File/Run' 输入: ping 192.168.1.1
ping
到外面的世界)。
[1]Novell NE2000 Adapter
。然后设定 IP 位址于 192.168.1.x (1 < x < 255),然后设定 Subnet Mask 为 255.255.255.0 以及 Default Gateway 为 192.168.1.1。
Ping
一下你的 Linux 主机以测试网路连接: 在 'File/Run' 输入: ping 192.168.1.1
ping
到外面的世界)。
/etc/sysconfig/network-scripts/ifcfg-eth0
,或直接从 Control Panel 里做。/etc/resolv.conf
。
/etc/networks
文档。
ping
指令: ping 192.168.1.1
以测试到你的 gateway 机器的连接性。ping
到外面的世界)。
nwpd 0x60 10 0x300
。
pkunzip tel2308b.zip
config.tel
文档。
myip=192.168.1.x
(1 < x < 255), 以及 netmask=255.255.255.0
。
hardware=packet, interrupt=10, ioaddr=60
。
name=default
host=yourlinuxhostname
hostip=192.168.1.1
gateway=1
name=dns.domain.com ; hostip=123.123.123.123; nameserver=1
注意: 用你 Linux 主机使用的 DNS 的适当信息来取代。
config.tel
文档。
telnet 192.168.1.1
ping
一下你的 Linux 主来来测试网路连线。如果你有 MacTCP Watcher 免费程序,按下 'Ping' 钮,然后在弹出的对话盒中键入你的 Linux 主机的地址(192.168.1.1)。(这只不过是区域网路的连接测试,你还不能 ping
到外面的世界。)
Hosts
文档以便你可以使用你区域网路里机器的主机名称。
这个文档可能已经存在于你的 System Folder 里,而且它应该会包含一些(注解掉的)范例项目而你可以根据你的需要来修改。
ping
一下你的 Linux 主来来测试网路连线。如果你有 MacTCP Watcher 免费程序,按下 'Ping' 钮,然后在弹出的对话盒中键入你的 Linux 主机的地址(192.168.1.1)。(这只不过是区域网路的连接测试,你还不能 ping
到外面的世界。)
Hosts
文档以便你可以使用你区域网路里机器的主机名称。这个文档可能已经或还未存在于你的 System Folder 里。如果有的话,它应该会包含一些(注解掉的)范例项目而你可以根据你的需要来修改。如果还没有的话,你可以从一部正在运作 MacTCP 的系统中取回,或自己建一个(它遵循 Unix 的 /etc/hosts
文档格式,在 RFC 952 中描述)。一旦你建立了这个文档,打开 TCP/IP control panel,按下 'Select Hosts File...' 钮,然后打开 Hosts
文档。
编辑 c:\nwclient\startnet.bat: (here is a copy of mine)
SET NWLANGUAGE=ENGLISH LH LSL.COM LH KTC2000.COM LH IPXODI.COM LH tcpip LH VLM.EXE F:
编辑 c:\nwclient\net.cfg: (将驱动程序改为你的, i.e. NE2000)
Link Driver KTC2000 Protocol IPX 0 ETHERNET_802.3 Frame ETHERNET_802.3 Frame Ethernet_II FRAME Ethernet_802.2 NetWare DOS Requester FIRST NETWORK DRIVE = F USE DEFAULTS = OFF VLM = CONN.VLM VLM = IPXNCP.VLM VLM = TRAN.VLM VLM = SECURITY.VLM VLM = NDS.VLM VLM = BIND.VLM VLM = NWP.VLM VLM = FIO.VLM VLM = GENERAL.VLM VLM = REDIR.VLM VLM = PRINT.VLM VLM = NETX.VLM Link Support Buffers 8 1500 MemPool 4096 Protocol TCPIP PATH SCRIPT C:\NET\SCRIPT PATH PROFILE C:\NET\PROFILE PATH LWP_CFG C:\NET\HSTACC PATH TCP_CFG C:\NET\TCP ip_address xxx.xxx.xxx.xxx ip_router xxx.xxx.xxx.xxx
c:\bin\resolv.cfg:
SEARCH DNS HOSTS SEQUENTIAL NAMESERVER 207.103.0.2 NAMESERVER 207.103.11.9
'ping 192.168.1.1'
。如果收到 ping 封包一切就没问题。
相同的逻辑应可适用于配置其它的平台。查阅上述的小节的说明。 如果你有兴趣写关于其它的作业系统的配置, 请送详细的建立指引到 ambrose@writeme.com 及 dranch@trinnet.net。
到目前为止,你应该已经安装好核心以及其它需要的套件,也载入了你的模块。同时,其它机器的 IP 位址,闸道,以及 DNS 也该全都设定完成。
现在,唯一剩下要做的事是使用 IP 防火墙工具来转送适当的封包给适当的机器:
** 这可以用许多不同的方式来达成。下列的建议与例子对我来说能用,但你可能有不同的主意,详节部份请参考 4.4 节及 ipchains(2.2.x) / ipfwadm(2.0.x) 的线上手册。 **
** 本节仅提供你建立 IP 伪装功能所需的最少规则,一些安全的考量并未包含进去。 强烈建议你花一些时间去研究适当的防火墙规则来加强安全性。 **
Ipfwadm 已经无法在 2.2.x 版的核心中处理 IP 封包的伪装规则,请改用 ipchains。
ipchains -P forward DENY
ipchains -A forward -s yyy.yyy.yyy.yyy/x -j MASQ
其中 x 视你的子网路而定,为下列数字之一,而 yyy.yyy.yyy.yyy 则是你的网路位址。
netmask | x | Subnet
~~~~~~~~~~~~~~~~|~~~~|~~~~~~~~~~~~~~~
255.0.0.0 | 8 | Class A
255.255.0.0 | 16 | Class B
255.255.255.0 | 24 | Class C
255.255.255.255 | 32 | Point-to-point
你也可以使用这种格式 yyy.yyy.yyy.yyy/xxx.xxx.xxx.xxx, 其中 xxx.xxx.xxx.xxx 指定你的子网路遮罩,如 255.255.255.0。
例如,如果我是在一个 class C 子网路上,我得输入:
ipchains -P forward DENY
ipchains -A forward -s 192.168.1.0/24 -j MASQ
或
ipchains -P forward DENY
ipchains -A forward -s 192.168.1.0/255.255.255.0 -j MASQ
你也可以分别对每台机器设定。 例如,如果我想让 192.168.1.2 及 192.168.1.8 能够存取网际网路,但不允许其它机器使用的话,我得输入:
ipchains -P forward DENY
ipchains -A forward -s 192.168.1.2/32 -j MASQ
ipchains -A forward -s 192.168.1.8/32 -j MASQ
不要把你的预设方式(policy)定为伪装(masquerading) - 否则可以操控他们的递送路径(routing) 的人将能够直接穿过(tunnel)你的闸道,以此伪装他们的身分!
同样地,你可以把这些加入 /etc/rc.d/rc.local
文档,任何一个你比较喜欢的 rc 文档,或是在每次你需要 IP Masquerade 时手动执行之。
关于 ipchains 的详细使用方法,请参考 Linux IPCHAINS HOWTO
ipfwadm -F -p deny
ipfwadm -F -a m -S yyy.yyy.yyy.yyy/x -D 0.0.0.0/0
或
ipfwadm -F -p deny
ipfwadm -F -a masquerade -S yyy.yyy.yyy.yyy/x -D 0.0.0.0/0
其中 x 视你的子网路而定,为下列数字之一,而 yyy.yyy.yyy.yyy 则是你的网路位址。
netmask | x | Subnet
~~~~~~~~~~~~~~~~|~~~~|~~~~~~~~~~~~~~~
255.0.0.0 | 8 | Class A
255.255.0.0 | 16 | Class B
255.255.255.0 | 24 | Class C
255.255.255.255 | 32 | Point-to-point
你也可以使用这种格式 yyy.yyy.yyy.yyy/xxx.xxx.xxx.xxx, 其中 xxx.xxx.xxx.xxx 指定你的子网路遮罩,如 255.255.255.0。
例如,如果我是在一个 class C 子网路上,我得输入:
ipfwadm -F -p deny
ipfwadm -F -a m -S 192.168.1.0/24 -D 0.0.0.0/0
因为 bootp 请求封包没有合法的 IP's ,客户端并不知道它的位址,对于在伪装/防火墙上执行 bootp 伺服器的人必须在 deny 之前执行下列指令:
ipfwadm -I -a accept -S 0/0 68 -D 0/0 67 -W bootp_clients_net_if_name -P udp
你也可以分别对每台机器设定。 例如,如果我想让 192.168.1.2 及 192.168.1.8 能够存取网际网路,但不允许其它机器使用的话,我得输入:
ipfwadm -F -p deny
ipfwadm -F -a m -S 192.168.1.2/32 -D 0.0.0.0/0
ipfwadm -F -a m -S 192.168.1.8/32 -D 0.0.0.0/0
常见的错误是像这样的第一行指令
ipfwadm -F -p masquerade不要把你的预设方式(policy)定为伪装(masquerading) - 否则可以操控他们的递送路径(routing) 的人将能够直接穿过(tunnel)你的闸道,以此伪装他们的身分!
同样地,你可以把这些加入 /etc/rc.d/rc.local
文档,任何一个你比较喜欢的 rc 文档,或是在每次你需要 IP Masquerade 时手动执行之。
请阅读 4.4 节有关 Ipfwadm 的详细指引。
在这些工作完成后,现在是试试看的时候了。确定你的 Linux 主机到网际网路的连线是通的。
你可以在其它机器上试著浏览一些'网际网路!!!' 上的网页,看是否能见到。我建议第一次尝试时使用 IP 位址而不要用主机名称,因为你的 DNS 设定有可能并不正确。
例如,你可以使用 http://152.19.254.81/mdw/linux.html 来存取 Linux 文件计划网页 http://metalab.unc.edu/mdw/linux.html
如果你看见 The Linux Documentation Project 的字样,那么恭喜! 它可以运作了! 接著你可以使用主机名称试试看,然后是 telnet, ftp, RealAudio, True Speech,以及任何 IP Masquerade 支持的东西。
到目前为止,我还不曾在上面的设定上发生过问题,而哪些花下时间让这个绝妙功能运作的人完全同意这些设定。