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