过去几天我一直在处理一个我无法理解的问题,它解决了路由问题。
设置和上下文:
如下图所示,我的目标是从“源虚拟机”调用“远程目标”。数据包需要通过“路由器虚拟机”,然后通过 VPN 隧道(此处以名称“GatewaySubnet”表示到目标 128.20.20.5)。
Router-VM 是一台拥有两个关联 NIC 的 Ubuntu 机器。
隧道运行正常(从“路由器虚拟机”到“远程目标”的呼叫运行正常)。
但就 Remote-Target 而言,数据包需要具有子网 SNET-AKS(此处为 10.0.9.0/24)中 Nic 的“SRC=”参数 - 因为这是作为源列入白名单的唯一子网。这无法更改。
我的问题:
我需要如何配置路由器虚拟机中的 IPTABLES 以便:
数据包(在端口 9080 上)被正确转发,如下所示:
源虚拟机(10.0.12.4)-> 路由器虚拟机(10.0.25.20 [ETH1]
路由器虚拟机(10.0.25.20 [ETH1])-> 路由器虚拟机(10.0.9.4 [ETH0])
路由器虚拟机(10.0.9.4 [ETH0])-> 远程目标(128.20.20.5)
并返回该请求的答案。
我已执行的命令:
# Public interface
EXTIF="eth1"
EXTIP="10.0.25.20"
# Private interface
VPNIF="eth0"
VPNIFIP="10.0.9.4"
# Target destination
CBTARGETIP="128.20.20.5"
echo "1" > /proc/sys/net/ipv4/ip_forward
$IPTABLES -A FORWARD -i $EXTIF -o $VPNIF -p tcp --syn --dport 9080 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A FORWARD -i $EXTIF -o $VPNIF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $VPNIF -o $EXTIF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t nat -A PREROUTING -i $EXTIF -p tcp --dport 9080 -j DNAT --to-destination $CBTARGETIP
$IPTABLES -t nat -A POSTROUTING -o $VPNIF -p tcp --dport 9080 -d $CBTARGETIP -j SNAT --to-source $VPNIFIP
iptable:
~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
LOG tcp -- anywhere anywhere LOG level warning prefix "filter INPUT: "
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:9080 flags:FIN,SYN,RST,ACK/SYN ctstate NEW
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
LOG tcp -- anywhere anywhere LOG level warning prefix "filter FORWARD: "
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
LOG tcp -- anywhere anywhere LOG level warning prefix "filter OUTPUT: "
~$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:9080 to:128.20.20.5
LOG tcp -- anywhere anywhere LOG level warning prefix "nat PREROUTING: "
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT tcp -- anywhere 128.20.20.5 tcp dpt:9080 to:10.0.9.4
LOG tcp -- anywhere anywhere LOG level warning prefix "nat POSTROUTING: "
目前结果:
对 Source-VM 的调用不成功。
在 Router-VM 上我可以看到
从 eth1 传入的流量被转发到 eth0
此流量被正确路由到目标资源(128.20.20.55)
但:
- 记录 iptable 钩子,似乎 DST= 标签没有被修改为 10.0.9.4,而是保留了 Source-VM 的原始 IP 地址。
我尝试了很多次谷歌搜索 - 但我陷入了困境,我真的非常感谢对任何错误或调试该过程的尝试的提示,因为我无法让它工作。
我非常感激 - 非常感谢!
根据多种条件设置iptables,主要用上面提到的脚本。
答案1
来自的数据包Source-VM
跳过了所需流程中的第二步,因为"DNAT"
规则正在将传入数据包的目的地(应该是您的Router-VM
)直接转换为Remote Target
。
让我们修改"DNAT"
规则,将目标转换为您的 IP "eth0"
(Router-VM ETH0 10.0.9.4)而不是Remote Target
。
因此,对于 iptables 规则:
# Enable IP forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
# Clear previous rules
$IPTABLES -F
$IPTABLES -t nat -F
# Forwarding rules
$IPTABLES -A FORWARD -i $EXTIF -o $VPNIF -p tcp --syn --dport 9080 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A FORWARD -i $EXTIF -o $VPNIF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $VPNIF -o $EXTIF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# NAT rules
$IPTABLES -t nat -A PREROUTING -i $EXTIF -p tcp --dport 9080 -j DNAT --to-destination $VPNIFIP:9080
$IPTABLES -t nat -A POSTROUTING -o $VPNIF -p tcp --dport 9080 -j SNAT --to-source $VPNIFIP