Ubuntu IPTables 端口转发和 NAT

Ubuntu IPTables 端口转发和 NAT

过去几天我一直在处理一个我无法理解的问题,它解决了路由问题。

设置和上下文:

网络图

如下图所示,我的目标是从“源虚拟机”调用“远程目标”。数据包需要通过“路由器虚拟机”,然后通过 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

相关内容