我有一个带有 3 个网络适配器的 Linux 盒子,我想对其进行如下配置:
- 适配器 A 连接到计算机 A
- 适配器 B 连接到计算机 B
- 适配器 C 连接到互联网。具体来说,到 someserver.com
我想达到的目标:
- 来自 A 的所有流量都会流向 Internet
- 在适配器 B 上定义特殊的“秘密端口”
- 来自计算机 B 前往“秘密端口”上的“someserver.com”的 TCP 流量将伪装其源 IP,使其显示为来自计算机 A
- 从“someserver.com”返回计算机 A 并到达 #3 中使用的相同端口的 TCP 流量将重定向到计算机 B。
我需要实施路由器或网桥吗?我可以仅通过配置 NetFitler/ip 表来完成此操作还是应该实现一些代码?如果是代码,我应在哪一层与 IP 堆栈集成?
答案1
对于一般访问,您必须使用 MASQUARADE / SNAT(取决于 C 上的 IP 地址是动态还是静态)。
假设目前的情况是你的电脑A有静态 IP 地址a.a.a.a
,并且您的计算机B有静态 IP 地址 b.b.b.b
。两者都有默认网关电脑C。和Someserver.com具有静态 IP 地址r.r.r.r
和秘密端口是pppp
。
你会配置电脑C作为路由器,它有到互联网的默认路由接口C(它已经做到了这一点,要么通过静态配置,要么通过 PPPoE 动态设置等)。这本身就可以完成1.
现在,你有两种可能性:
制作电脑A路由器也是。然后你改变计算机B配置,所以它的默认路由是通过电脑A(并不是电脑C和以前一样),并配置电脑A像这样:
iptables -t nat -s b.b.b.b -d r.r.r.r -p tcp --dport pppp -j SNAT --to a.a.a.a
这将使所有从源 IP
b.b.b.b
到目标 IPr.r.r.r
和目标端口的 TCP 数据包pppp
假装它们来自a.a.a.a
,从而完成3
来自的流量某服务器网站将返回到源地址 (a.a.a.a
),该地址将被解码为电脑A并发送回计算机B。 (从而完成4
)这更容易,但要求计算机 B 运行支持此类 NAT 策略的操作系统。
改变电脑A拥有像
10.0.1.100/24
和这样的私有IP计算机B拥有私有IP10.0.2.100/24
。然后在电脑C做:ip addr add a.a.a.a/nn dev ifaceC ip addr add b.b.b.b/nn dev ifaceC iptables -t nat -s 10.0.1.100 -j SNAT --to a.a.a.a iptables -t nat -s 10.0.2.100 -d r.r.r.r -p tcp --dport pppp -j SNAT --to a.a.a.a iptables -t nat -s 10.0.2.100 -j SNAT --to b.b.b.b
nn
你的网络掩码在哪里,ifaceC
你的名字在哪里接口C。那会把电脑A和计算机B在私人范围内,从而允许电脑C到网络地址转换电脑A到a.a.a.a
(所以它的行为就像以前一样),以及 NAT计算机B要么到a.a.a.a
(如果满足dst=r.r.r.r
, dport=条件)或到(否则)。pppp
b.b.b.b
这不需要任何特殊支持电脑A也不计算机B,但把它们抛在了后面网络地址转换这可能会影响其他一些事情。
答案2
根据您的评论:
@Marki - 计算机 A 和 B 在互联网上。当他们访问 someserver.com 时,他们总是从我的 Linux 机器上访问(例如特定路由)。 A和B合作。有时,我们希望计算机 B 访问 someserver.com,而某些服务器不知道请求来自另一台计算机。
我在这里错过了什么吗?如果将计算机 C 设置为路由器,则来自 A 和 B 的请求将无关紧要。根据 NAT 规则,A 和 B 的私有/公共 IP 地址都将与计算机 C 的公共 IP 地址进行交换。因此,如果 C 是您网络链中的最后一个网关,某个服务器将看到来自 C 的所有请求,C 会将它们路由回 A 和 B。
为此,计算机 C 需要两张网卡,一张连接到专用 LAN,另一张连接到公共 WAN。
下面是 Matija 的数字 2
如果您希望计算机 B 模仿计算机 A,B 必须在到达 C 之前过滤通过 A 的流量。我不明白这对您的“用例”有什么帮助,因为计算机 C 只能看到来自计算机 A 的流量,但无论如何:
某个服务器永远不会看到来自 A 或 B 的私有地址。您在这里的情况有点过分了,因为您所需要做的就是在计算机 C 上启用端口转发,以便所有端口都转发到计算机 B 的私有 IP 地址。
答案3
您可以通过在 A 上安装代理来解决此问题,该代理将侦听 B/SecretPort 并将其转发到 SomeServer。使用 SecretPort 在 A 上选择的答案将转发给 B。