※ 引述《petitbleu (*大卷儿*)》之铭言:
: ※ 引述《gowrite (gowrite)》之铭言:
: : /*
: : If the host on which the server is running is multihomed (as in this example)
: : , the server can specify that it wants only to accept incoming connetions
: : that arrive destined to one specific local interface.
: : 这段话是不是说 ,
: : 如果 server 本身有多重 IP , 不论是
: : public IP 12.106.32.254
: : 或
: : private IP 192.168.42.1
: : 都可以设定为外来连线的连线接口 (local interface)
: : 但是如果连 WAN 的 IP 指定成 192.168.42.1 那应该连不进来吧?
: : client 发出连线的时候 , 应该是找都找不到
: : 所以 192.168.42.1 是单纯指 LAN 端的其他设备可以连到 server 的选择吗?
: : 这段话这样理解是对的吗??
: : */
谢谢P大,看完你的讲解,我慢慢有理解了,
我想进一步的询问,
想确定有正确理解你的讲解,并搞清楚我之前是卡在哪边不懂,避免之后再跌跤
: 这段是说,如果你的 server 有 n 个 IP address (n >= 1)
: 你可以让 server 只接受从某个特定 IP address 进来的连线
: 跟是不是 public IP 无关
: 这是相对于一般如果你不特别指定,服务就会绑在 * 上
: 也就是走任意 IP 进来都可以
: 以上面的例子来说,你今天想在 port 5678 提供服务
: 可以指定它在 192.168.42.1:5678 或是 12.106.32.254:5678
如果是指定 IP 的情况:
指定情况一: server 指定 listening socket { 12.106.32.254:5678 , *.* }
======================================================================
这时候 client 端,
想从 140.120.120.120:1500 发 connection request 给 12.106.32.254:5678
连线就可以建立
connected socket pair { 12.106.32.254:5678 , 140.120.120.120:1500 }
可以建立连线的原因是
因为 server 指定 12.106.32.254:5678 且 12.106.32.254 是 public IP
但是如果同样的 client 端
从 140.120.120.120:1500 发 connection request 给 192.168.42.1:5678
会无法建立连线,
无法建立连线的主要原因 "不是" 因为 192.168.42.1:5678 是 private IP,
而是 server 指定了 listening socket 的 local IP 是 12.106.32.254:5678
这样理解对吗???
另外一种指定情况:
指定情况二: server 指定 listening socket { 192.168.42.1:5678 , *.* }
=====================================================================
这时候 client 端,
从 140.120.120.120:1500 发 connection request 给 192.168.42.1:5678
会无法建立连线,
无法建立连线的原因是
就算 server 指定了 listening socket 的 local IP 是 192.168.42.1
但是因为 140.120.120.120 无法从 WAN route 到 private IP 所以无法建立连线
另外同样的 client 端,
从 140.120.120.120:1500 发 connection request 给 12.106.32.254:5678
也一样无法建立连线,
是因为 server 指定 192.168.42.1:5678 当成 listening socket
所以就算 server 有 12.106.32.254:5678 这个 public IP,也一样不能用
这样理解对吗???
: 如果不指定则是 *:5678
: 至于这样做之后,谁能 access 到这些服务
: 则取决于它碰不碰得到这个 IP address
: 所以如果是跑在 192.168.42.1:5678 上,就只有 LAN 能用到它
: 因为外面的世界没有 route 到你的 192.168.42.1
: 只有你的 LAN 192.168.42.0/24(或有时候是 192.168.0.0/16 不一定)
: 能直接连到 192.168.42.1
最后不指定的情况:
不指定的情况:server 不指定 local IP ,
因此 listening socket { *:5678 , *.* }
========================================================================
这时候 client 端
从 140.120.120.120:1500 发 connection request 给 12.106.32.254:5678
可以建立连线
connected socket pair { 12.106.32.254:5678 , 140.120.120.120:1500 }
原因是 server 没有指定 local IP,且 12.106.32.254 是 public IP
另外同样的 client 端
从 140.120.120.120:1500 发 connection request 给 192.168.42.1:5678
会无法建立连线
原因是 192.168.42.1:5678 是无法从 WAN route 到的 private IP
除非 client 端是 192.168.0.0/16 网段中的其中一个 private IP network device
就可以找到 192.168.42.1:5678 并建立连线
请问这样理解对吗???
学到这边谢谢 P 大提点指导
谢谢
<(_ _)>
: : 另外第二段话
: : /*
: : This is a one-or-any choice for the server. The server cannot specify a list
: : of multiple addresses.
: : The wildcard local address is the "any" choice. the wildcard address was
: : specified by setting the IP address in the socket address structure to
: : INADDR_ANY before calling bind.
: : 这边这段话又说
: : 如果不是选择指定对外 IP , 那就是选择 any IP
: : 可是如果在这个例子的话 , 一个 public IP , 一个 private IP
: : 那 FTP server 会自动确认自己目前所拥有的 IP 是哪一个网段,
: : 哪一个 public IP, 哪一个是 private IP ,
: : 然后再指定外来的 request connection 要跟哪一个 IP 连线吗?
: : */
: : 关于这一小段话 , 不太理解 , 希望有人可以解点解惑
: : 谢谢。
: 承上,跟 public or private 没有关系
: 它是说你要嘛完全不指定 IP address, 要嘛只能指定一个
: 不能说我要指定这两个 IP address
: 底层不提供这种选择
: FTP 或其它 server 通常不会帮你决定要在哪个 IP address 上提供服务
: 但你可以自己设定要用哪一个,或通常走默认是 any
: 外面或里面能不能连到,只是看它有没有 route 到你的 any IP 而已
: 如果是跑在 * 上,不管从外面里面都可以连上
: 当然以 FTP 来说还是可以用验证挡掉
: 这边就要看用途来决定要怎么做了