Linux 网络/IPIP 封装
为什么要将 IP 数据报封装在 IP 数据报中?如果您以前从未见过它的应用,这似乎是一件奇怪的事情。好的,以下是一些常见的用例:移动 IP 和 IP 多播。也许最广泛的应用也是最不为人知的,业余无线电。
内核编译选项
Networking options ---> [*] TCP/IP networking [*] IP: forwarding/gatewaying .... <*> IP: tunneling
IP 隧道设备称为 `tunl0`、`tunl1` 等。
"但是为什么呢?". 好吧,好吧。传统的 IP 路由规则规定,一个 IP 网络由一个网络地址和一个网络掩码组成。这会产生一系列连续的地址,这些地址都可以通过单个路由条目进行路由。这非常方便,但这意味着您只能在连接到特定网络时使用特定 IP 地址。在大多数情况下,这都没有问题,但如果您是一个移动网民,那么您可能无法一直保持连接到同一个地方。IP/IP 封装(IP 隧道)允许您通过允许发送到您 IP 地址的数据报被包装起来并重定向到另一个 IP 地址来克服这种限制。如果您知道要在一个不同的 IP 网络上运行一段时间,您可以设置一台机器在您的家庭网络上接受发送到您 IP 地址的数据报,并将它们重定向到您临时实际使用的地址。
192.168.1/24 192.168.2/24 - - | ppp0 = ppp0 = | | aaa.bbb.ccc.ddd fff.ggg.hhh.iii | | | | /-----\ /-----\ | | | | // | | | |---| A |------//---------| B |---| | | | // | | | | \-----/ \-----/ | | | - -
该图说明了使用 IPIP 封装的另一个可能原因,虚拟专用网络。此示例假设您有两台机器,每台机器都具有一个简单的拨号互联网连接。每个主机仅分配一个 IP 地址。在这些机器的后面是配置有保留 IP 网络地址的一些私有局域网。假设您希望允许网络 A 上的任何主机连接到网络 B 上的任何主机,就像它们与互联网正确连接并具有网络路由一样。IPIP 封装将允许您这样做。请注意,封装并不能解决如何让网络 A 和 B 上的主机与互联网上的任何其他主机通信的问题,您仍然需要像 IP 伪装这样的技巧来解决这个问题。封装通常由充当路由器的机器执行。
Linux 路由器 `A` 将使用以下类似脚本配置
#!/bin/sh PATH=/sbin:/usr/sbin mask=255.255.255.0 remotegw=fff.ggg.hhh.iii # # Ethernet configuration ifconfig eth0 192.168.1.1 netmask $mask up route add -net 192.168.1.0 netmask $mask eth0 # # ppp0 configuration (start ppp link, set default route) pppd route add default ppp0 # # Tunnel device configuration ifconfig tunl0 192.168.1.1 up route add -net 192.168.2.0 netmask $mask gw $remotegw tunl0
Linux 路由器 `B` 将使用类似的脚本配置
#!/bin/sh PATH=/sbin:/usr/sbin mask=255.255.255.0 remotegw=aaa.bbb.ccc.ddd # # Ethernet configuration ifconfig eth0 192.168.2.1 netmask $mask up route add -net 192.168.2.0 netmask $mask eth0 # # ppp0 configuration (start ppp link, set default route) pppd route add default ppp0 # # Tunnel device configuration ifconfig tunl0 192.168.2.1 up route add -net 192.168.1.0 netmask $mask gw $remotegw tunl0
命令
route add -net 192.168.1.0 netmask $mask gw $remotegw tunl0
表示:`将发送到 192.168.1.0/24 的任何数据报封装在一个目标地址为 aaa.bbb.ccc.ddd 的 IPIP 封装数据报中`。
请注意,配置在两端都是相互的。隧道设备使用路由中的 `gw` 作为将要放置收到的数据报的 IP 数据报的目标。该机器必须知道如何对 IPIP 数据报进行解封装,也就是说,它也必须使用隧道设备进行配置。
您不必路由整个网络。例如,您可以只路由单个 IP 地址。在这种情况下,您可以使用其家庭 IP 地址配置 `remote` 机器上的 tunl 设备,并在 A 端仅使用主机路由(和代理 ARP)而不是通过隧道设备的网络路由。让我们适当地重新绘制和修改配置。现在我们只有主机 `B`,它希望充当它完全连接到互联网并也是主机 `A` 支持的远程网络的一部分。
192.168.1/24 - | ppp0 = ppp0 = | aaa.bbb.ccc.ddd fff.ggg.hhh.iii | | /-----\ /-----\ | | | // | | |---| A |------//---------| B | | | | // | | | \-----/ \-----/ | also: 192.168.1.12 -
Linux 路由器 `A` 将使用以下配置
#!/bin/sh PATH=/sbin:/usr/sbin mask=255.255.255.0 remotegw=fff.ggg.hhh.iii # # Ethernet configuration ifconfig eth0 192.168.1.1 netmask $mask up route add -net 192.168.1.0 netmask $mask eth0 # # ppp0 configuration (start ppp link, set default route) pppd route add default ppp0 # # Tunnel device configuration ifconfig tunl0 192.168.1.1 up route add -host 192.168.1.12 gw $remotegw tunl0 # # Proxy ARP for the remote host arp -s 192.168.1.12 xx:xx:xx:xx:xx:xx pub
Linux 主机 `B` 将使用以下配置
#!/bin/sh PATH=/sbin:/usr/sbin mask=255.255.255.0 remotegw=aaa.bbb.ccc.ddd # # ppp0 configuration (start ppp link, set default route) pppd route add default ppp0 # # Tunnel device configuration ifconfig tunl0 192.168.1.12 up route add -net 192.168.1.0 netmask $mask gw $remotegwtunl0
这种配置更像是移动 IP 应用程序。如果单个主机希望在互联网上漫游并始终维护一个可用的 IP 地址,您应该参考移动 IP 部分,以获取有关在实践中如何处理它的更多信息。