我以为来自另一个子网的数据包总是被拒绝。但是当我在两个不同的子网(s1 和 s2)中拥有两个主机(h1 和 h2)和一个激活了 ip_forward 并可以访问这两个子网的路由器(r)时,我可以从 h2 ping h1。我理解数据包是如何路由到 h1 的,但我不明白为什么 h1 会接受来自另一个子网的数据包。如果进行了伪装,我一切都清楚了。但如果没有伪装,我就无法理解。
这是否意味着在 TCP/IP 协议中,来自另一个子网的数据包如果到达主机,就会被接受?那么没有路由器的问题只是发送主机没有发送目的地在另一个子网的数据包?
答案1
是的,你说的很对——如果一个主机收到一个 IP 数据包,并且它具有到源的有效路由路径,它只是做出响应。显然,中间可能有防火墙,这可能会阻止流量。
排除动态路由协议等更高级的主题,情况相当简单。如果没有链路类(直接)或基于网关(间接)的路径,最终会使用最宽的默认(0.0.0.0/0) 路线。想想看,你会发现这一切都是有道理的。:-)
正如@MichaelHampton 已经指出的那样,这正是互联网的工作原理。NAT 只是一个附加功能(在 IP 协议诞生多年后才创建),通常用于连接本地地址类(检查RFC1918) 到 WAN,从而节省可公共路由的地址。
答案2
每当您想要连接 2 个或更多网络时,您都会使用路由器。这些网络上的主机必须知道此路由器并正确使用它从一个网络连接到另一个网络,除非您使用类似 的东西桥接这些网络brctl
,这将“将路由器转换为交换机”。如果您的路由器机器已ip_forward
打开,则它不会阻止任何内容,并且如果它知道如何做,它将路由所有内容,或者返回“不可路由的地址”。除非您使用 告诉一个/几个阻止规则用于iptables
正常路由或ebtables
桥接。