首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >端口转发A -> B -> A

端口转发A -> B -> A
EN

Server Fault用户
提问于 2013-02-04 02:57:12
回答 2查看 352关注 0票数 1

我有一个带有lxc容器(A)的主机(B)。A's本地ip地址为10.0.3.1,公共ip地址为1.2.3.4,B's本地ip地址为10.0.3.21。

我需要将1.2.3.4:7999转发到10.0.3.1:7999,并为此创建了以下规则:

代码语言:javascript
复制
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 7999 -j DNAT --to 10.0.3.21:7999
iptables -A FORWARD -p tcp -d 10.0.3.21 --dport 7999 -j ACCEPT

当我从外部世界连接到A (1.2.3.4:7999)时,我正在成功地连接。但是当我试图从B (连接超时)连接到A (连接超时)时,我掉了下来。

我应该创建哪些规则才能从10.0.3.1连接到1.2.3.4:7999?

EN

回答 2

Server Fault用户

发布于 2013-02-04 22:15:27

这里有一个NAT发夹情况,您当前的iptables规则不支持这种情况。当容器发送请求时,数据包如下所示:

代码语言:javascript
复制
10.0.3.21:12345 -> 1.2.3.4:7999

然后网关将数据包发送到此,并将其发送回容器:

代码语言:javascript
复制
10.0.3.21:12345 -> 10.0.3.21:7999

容器接收数据包并发送一个响应,如下所示:

代码语言:javascript
复制
10.0.3.21:7999 -> 10.0.3.21:12345

也就是说,它直接地址到容器本身。但是端口12345不知道有10.0.3.21:7999的连接,因为连接是1.2.3.4:7999,因此响应被忽略。

解决方案也是SNAT网关上的数据包,以便响应返回到网关,然后网关取消两个NAT。尝试添加如下内容:

代码语言:javascript
复制
iptables -t NAT -A POSTROUTING -o lxcbr0 -d 10.0.3.21 -s 10.0.3.21 -j SNAT --to 10.0.3.1
票数 1
EN

Server Fault用户

发布于 2013-02-04 03:20:13

我认为你正在经历的问题是,答案是回到一个不同的界面。

初始请求

代码语言:javascript
复制
S: 1.2.3.4
D: 1.2.3.4

DNAT

代码语言:javascript
复制
S: 1.2.3.4
D: 10.0.3.21

此时,主机A决定使用专用网络接口路由到10.0.3.21

回复

代码语言:javascript
复制
S: (IP of default GW interface on B)
D: 1.2.3.4

来自B的应答包将遍历默认网关,很可能返回到其公共接口上的A,此时由于连接跟踪表中没有匹配的条目,数据包将被丢弃。

溶液

添加以下规则,以确保答复通过与请求相同的路径。

代码语言:javascript
复制
iptables -t nat -I POSTROUTING -s 1.2.3.4 -d 10.0.3.21 -o (interface of 10.0.3.1) -j SNAT --to 10.0.3.1
票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/475065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档