我需要一位专家来配置NAT重定向(iptables)来维护客户端的源地址。目前,我的服务器正常工作,但所有客户端都与我的vLAN的私有IP一起出现。
我的服务器重定向操作示例:
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:
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:
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)没有路由返回数据包到互联网。
发布于 2019-06-05 14:51:33
我知道解决你问题的两种方法:
您可以在没有DNAT规则的VPS主机上使用SNAT规则中的其他端口范围。基于这些端口号,VPS-5通过正确的主机返回答复。
简短的例子:
VPS-5上的附加端口号,其他主机将从客户端将数据包转发到该端口号。让我们猜一下VPS-1将数据包转发给VPS-5 tcp/10001、VPS2 -到VPS-5 tcp/10002等等。VPS主机上,您只需要一条规则就可以将流量转发到VPS-5的特定端口。因此,在VPS-1上,该规则如下所示:# 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>:10001VPS-5上,您需要更复杂的配置。其中的诀窍是,VPS5接收转发请求的端口号也指向VPS主机,通过该主机应该路由答复。VPS-5上,每个其他VPS主机都需要单独的路由表和路由规则。VPS-1和VPS-2的例子:# 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-5 host
iptables -t mangle -A PREROUTING \
-m conntrack --ctstate NEW \
-p udp --dport 10001 \
-j CONNMARK --set-mark 0x1# vps-5 host
iptables -t nat -A PREROUTING \
--dst <vps-5-ip> -p udp --dport 10001:10004 \
-j REDIRECT --to-ports 85# 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-5。VPS-示例:
# 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上,还应该配置额外的路由表和路由规则,以便通过右侧主机进行应答:# vps-5 host
ip route add 0/0 dev <vps-1-tun-iface> table 1
ip rule add fwmark 1 lookup 1 pref 10001iptables -t mangle -A PREROUTING \
-m conntrack --ctstate NEW \
-i <vps-1-tun-iface> \
-j CONNMARK --set-mark 0x1iptables -t nat -A PREROUTING \
-i <vps-1-tun-iface> \
-p udp --dport <srv-port> \
-j DNAT --to-destination <srv-listen-ip>iptables -t mangle -A OUTPUT \
-j CONNMARK --restore-markiptables -t filter -A INPUT \
-m conntrack --ctstate ESTABLISHED,RELATED
-j ACCEPT
...
iptables -t filter -A INPUT \
-p udp --dport <srv-port>
-j ACCEPThttps://serverfault.com/questions/970143
复制相似问题