我有两台通过 WireGuard 连接的服务器:一台本地服务器(server1
,WireGuard IP 10.0.0.2
)和一台云服务器(server0
,WireGuard IP 10.0.0.1
)。我的目标是将其用作server0
网关来访问服务,server1
而无需暴露本地服务器的公共 IP。例如,server1
应该可以通过 SSH 访问server0:2222
。
设置详细信息:
WireGuard 配置:
- 隧道已正常运行(已通过 验证)。
ssh -p 2222 [email protected]
serve0r
server0
并server1
使用 iptables 转发流量。
- 隧道已正常运行(已通过 验证)。
IPTables 规则:
- DNAT/MASQUERADE 规则:
# For TCP
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 10.0.0.2:2222
iptables -t nat -A POSTROUTING -o wg0 -p tcp -d 10.0.0.2 --dport 2222 -j MASQUERADE
# For UDP (if needed)
iptables -t nat -A PREROUTING -p udp --dport 2222 -j DNAT --to-destination 10.0.0.2:2222
iptables -t nat -A POSTROUTING -o wg0 -p udp -d 10.0.0.2 --dport 2222 -j MASQUERADE
-
- 当前 NAT 表:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:2222 to:10.0.0.2:2222
DNAT udp -- anywhere anywhere udp dpt:2222 to:10.0.0.2:2222
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
MASQUERADE all -- anywhere anywhere
MASQUERADE tcp -- anywhere 10.0.0.2 tcp dpt:2222
MASQUERADE udp -- anywhere 10.0.0.2 udp dpt:2222
SSH 配置:
server1
监听0.0.0.0:2222
(已在 中确认sshd_config
)。
内核转发:
net.ipv4.ip_forward=1
已启用并应用。
问题:
ssh -p 2222 user@<server0-public-ip>
通过进行外部连接会导致连接被拒绝。但是,直接从 进行连接则server0
可以10.0.0.2:2222
。
故障排除完成:
- 验证 WireGuard 连接(成功)。
- 检查
iptables -t nat
规则(看起来正确)。 - 已确认 SSH 正在监听
server1
。
疑似问题:
- IPTables 过滤表:
FORWARD
即使在 NAT 规则之后,该链也可能阻止流量。 - MASQUERADE 规则:冗余或配置错误的
POSTROUTING
规则。
问题:
- 是否缺少允许接口之间(
iptables
例如到)流量的过滤规则(例如链)?FORWARD
eth0
wg0
- 这些规则是否
MASQUERADE
正确处理返回流量的源 NAT?
任何见解都将不胜感激!
事实证明,我在 server0 上的 iptables 配置缺少这两条规则:
第一条规则允许将传入连接从
eth0
(外部接口)转发到wg0
,并将它们转发到端口 上的server1
( ) 。第二条规则允许将返回流量通过转发回客户端。10.0.0.2
2222
server1
eth0
这些规则对于通过 WireGuard VPN 在客户端和服务器 1 之间实现正确的数据包转发是必要的。