服务器端 NAT 更改源地址和目标地址:可能吗?

服务器端 NAT 更改源地址和目标地址:可能吗?

我有一个192.168.2.x带有地址的典型局域网。我想公开一些服务不同的通过wireguard VPN 的主机。

Wireguard 服务器不在我的可公开访问的路由器上运行,而是在配置为公开主机的功能更强大的计算机上运行。 Wireguard 当前配置为使用10.0.0.x地址,服务器使用10.0.0.1.

客户端成功连接到我的 VPN 服务器,使用 IP10.0.0.2并尝试访问 上的服务10.0.0.1。基于端口,我尝试使用(服务器端)DNAT 将数据包转发到(例如)192.168.2.1。这基本上是有效的,使用 tcpdump 我可以看到数据包是通过 src10.0.0.2和 dst发送的192.168.2.1,所以显然它们到达了正确的主机。

然而,10.0.0.x除了我的wireguard服务器之外,网络在任何地方都是未知的(我不想改变它),所以192.168.2.1不知道向哪里发送应答数据包。我想,我需要的是一个服务器端 NAT 变体来更改两个源目标 IP。

这可能吗?

为了减少混乱,我尝试创建一个简单的概述:

VPN Host                                 LAN Service
IPs: 192.168.2.2, 10.0.0.1               192.168.2.1

Incoming Packet 
src: 10.0.0.2 dst: 10.0.0.1:666
masqueraded to:
src: 192.168.2.2 dst: 192.168.2.1:666

                                         receives packet
                                         src: 192.168.2.2 dst: 192.168.2.1:666

                                         sends answer packet
                                         src: 192.168.2.1:666 dst: 192.168.2.2

Receives answer packet:
src: 192.168.2.1:666 dst: 192.168.2.2
de-masqueraded to
src: 10.0.0.1:666 dst: 10.0.0.2

如果这不可能,我还有其他选择吗?请注意,最终我想根据端口将数据包转发到不同的本地服务器。

附加说明:VPN 的全部目的是公开这些服务。 VPN 网络 ( 10.0.0.x) 应由在其 LAN 内公开服务的服务器和使用这些服务的远程客户端组成。

答案1

回答我自己的问题:按照 Iain Brown 对这个问题的回答,我可以成功设置组合 DNAT 和 SNAT: https://superuser.com/questions/1286555/iptables-port-forwarding-with-internal-snat:


经过一番实验后,我想我已经回答了我的问题,所以我应该将其发布在这里,以防其他人发现它有用。是的,这是可能的,而且相当简单,只需获得正确的地址和端口组合即可。

我的脚本的评论:

# summary:
# allow forwarding *to* destination ip:port
# allow forwarding *from* destination ip:port
# nat packets identified by arrival at external IP / port to have
#  *destination* internal ip:port
# nat packets identified by arrival at internal IP / port to have
#  *source* internal network IP of gateway machine

对于问题中的例子:

# allow inbound and outbound forwarding
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 54321 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.10 --sport 54321 -j ACCEPT

# route packets arriving at external IP/port to LAN machine
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:54321
# rewrite packets going to LAN machine (identified by address/port)
# to originate from gateway's internal address
iptables -A POSTROUTING -t nat -p tcp -d 192.168.2.10 --dport 54321 -j SNAT --to-source 192.168.2.5

实际的脚本,因为这应该更容易直接应用:

# EXTIP = external IP of gateway (1.2.3.4)
# EPORT = external port (12345)
# DIP   = destination IP in local network (192.168.2.10)
# DPORT = destination port (54321)
# INTIP = internal IP of gateway (192.168.2.5)

iptables -A FORWARD -p tcp -d $DIP --dport $DPORT -j ACCEPT
iptables -A FORWARD -p tcp -s $DIP --sport $DPORT -j ACCEPT

iptables -A PREROUTING -t nat -p tcp -d $EXTIP --dport $EPORT -j DNAT --to-destination $DIP:$DPORT
iptables -A POSTROUTING -t nat -p tcp -d $DIP --dport $DPORT -j SNAT --to-source $INTIP

相关内容