首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NAT多重服务器

NAT多重服务器
EN

Server Fault用户
提问于 2019-06-04 22:16:40
回答 1查看 155关注 0票数 3

我需要一位专家来配置NAT重定向(iptables)来维护客户端的源地址。目前,我的服务器正常工作,但所有客户端都与我的vLAN的私有IP一起出现。

我的服务器重定向操作示例:

代码语言:javascript
复制
VPS 1 (Public IP) redirect traffic to VPS 5 (Private IP)
VPS 2 (Public IP) redirect traffic to VPS 5 (Private IP)
VPS 3 (Public IP) redirect traffic to VPS 5 (Private IP)
VPS 4 (Public IP) redirect traffic to VPS 5 (Private IP)

但是,当重定向通信量时,客户端的IP更改为客户机访问的公共服务器的私有IP。

TCPDUMP:

代码语言:javascript
复制
IP 10.0.1.130.61570> 10.0.1.138.85: UDP, length 35
IP 10.0.1.132.63112> 10.0.1.138.85: UDP, length 35
IP 10.0.1.133.63435> 10.0.1.138.85: UDP, length 35
IP 10.0.1.136.63432> 10.0.1.138.85: UDP, length 35

这就是当重定向完成时所有客户端都被分配私有IP的问题,我需要维护客户端的实际IP。

如果我删除"iptables -t nat -A POSTROUTING -j伪装“规则

然后维护客户端的IP,但是服务器用私有IP对客户端的IP进行响应。

TCPDUMP:

代码语言:javascript
复制
IP 10.0.1.138.85> client1.isp.net.61570: UDP, length 45
IP 10.0.1.138.85> client2.isp.net.63112: UDP, length 45
IP 10.0.1.138.85> client3.isp.net.63435: UDP, length 45
IP 10.0.1.138.85> client4.isp.net.63432: UDP, length 45

我想保持真正的IP客户端,但(VPS 5)没有路由返回数据包到互联网。

EN

回答 1

Server Fault用户

回答已采纳

发布于 2019-06-05 14:51:33

我知道解决你问题的两种方法:

简单方式

您可以在没有DNAT规则的VPS主机上使用SNAT规则中的其他端口范围。基于这些端口号,VPS-5通过正确的主机返回答复。

简短的例子:

  • 计划VPS-5上的附加端口号,其他主机将从客户端将数据包转发到该端口号。让我们猜一下VPS-1将数据包转发给VPS-5 tcp/10001VPS2 -到VPS-5 tcp/10002等等。
  • 在每个VPS主机上,您只需要一条规则就可以将流量转发到VPS-5的特定端口。因此,在VPS-1上,该规则如下所示:
代码语言:javascript
复制
# vps-1 host
iptables -t nat -A PREROUTING \
         --dst <vps-1-pub-ip> -p udp --dport <srv-port> \
    -j DNAT --to-destination <vps-5-ip>:10001
  • VPS-5上,您需要更复杂的配置。其中的诀窍是,VPS5接收转发请求的端口号也指向VPS主机,通过该主机应该路由答复。
  • VPS-5上,每个其他VPS主机都需要单独的路由表和路由规则。VPS-1VPS-2的例子:
代码语言:javascript
复制
# vps-5 host
ip route add <connected-subnet> dev <iface> table 1
ip route add 0/0 via <VPS-1-INT-IP> dev <iface> table 1
ip rule add fwmark 1 lookup 1 pref 10001

ip route add <connected-subnet> dev <iface> table 2
ip route add 0/0 via <VPS-2-INT-IP> dev <iface> table 2
ip rule add fwmark 2 lookup 2 pref 10002
  • 标记来自VPS主机的传入连接并将其保存到连接跟踪条目中:
代码语言:javascript
复制
# vps-5 host
iptables -t mangle -A PREROUTING \
         -m conntrack --ctstate NEW \
         -p udp --dport 10001 \
    -j CONNMARK --set-mark 0x1
代码语言:javascript
复制
# vps-5 host
iptables -t nat -A PREROUTING \
         --dst <vps-5-ip> -p udp --dport 10001:10004 \
    -j REDIRECT --to-ports 85
  • 在回复数据包上设置防火墙标记,将其路由回VPS主机:
代码语言:javascript
复制
# vps-5 host
iptables -t mangle -A OUTPUT \
         -m conntrack --ctstate DNAT --ctdir REPLY \
    -j CONNMARK --restore-mark

这种方式只适用于主机之间直接连接的情况。否则你应该用下一种方式。

隧道模式

在某些情况下,服务器不是相互连接的,而是通过一些路由器连接的。在这些情况下,上面描述的方式不会有帮助,因为每个中间路由器都会独立地决定路由。

我所知道的保存客户端源地址并将数据包从前端主机(VPS-1 - VPS-4)重定向到目标主机(VPS-5)的唯一方法是使用隧道。

简化解决方案:*规划额外的ip地址,以便在隧道内使用。*在每个前端主机(VPS-1 - VPS-4)上创建通往VPS-5的隧道。你可以任意挖出你想要的东西。以最简单的方式,您可以使用静态GRE隧道,但它有一些限制,如避免NAT。*在每个前端主机上,您只需要一条规则就可以将流量转发到VPS-5VPS-示例:

代码语言:javascript
复制
# vps-1 host
iptables -t nat -A PREROUTING \
         --dst <vps-1-pub-ip> -p udp --dport <srv-port> \
    -j DNAT --to-destination <vps-5-tun-ip>
  • VPS-5上,还应该配置额外的路由表和路由规则,以便通过右侧主机进行应答:
代码语言:javascript
复制
# vps-5 host
ip route add 0/0 dev <vps-1-tun-iface> table 1
ip rule add fwmark 1 lookup 1 pref 10001
  • 根据输入接口标记传入连接,并将其保存到连接跟踪条目中:
代码语言:javascript
复制
iptables -t mangle -A PREROUTING \
         -m conntrack --ctstate NEW \
         -i <vps-1-tun-iface> \
    -j CONNMARK --set-mark 0x1
  • 如果应用程序不监听隧道ip地址,则应将来自前端主机的传入数据包重定向到侦听地址:
代码语言:javascript
复制
iptables -t nat -A PREROUTING \
         -i <vps-1-tun-iface> \
         -p udp --dport <srv-port> \
    -j DNAT --to-destination <srv-listen-ip>
  • 在回复数据包上设置防火墙标记:
代码语言:javascript
复制
iptables -t mangle -A OUTPUT \
    -j CONNMARK --restore-mark
  • 别忘了允许这些数据包进入过滤器表:
代码语言:javascript
复制
iptables -t filter -A INPUT \
         -m conntrack --ctstate ESTABLISHED,RELATED
    -j ACCEPT
...
iptables -t filter -A INPUT \
         -p udp --dport <srv-port>
    -j ACCEPT
票数 5
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/970143

复制
相关文章

相似问题

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