通过 IPv6 OpenVPN 连接将 VPS 的静态 IP 连接到动态 LAN 上的邮件服务器?

通过 IPv6 OpenVPN 连接将 VPS 的静态 IP 连接到动态 LAN 上的邮件服务器?

是的,我知道。呃!

我有一个小办公室,我们正在努力减少网络开支。

由于客户审核要求,我们运行自己的邮件服务器,并希望保持这种状态。为此,我们需要两个静态 IP。到目前为止,我们已经与 ISP 签订了针对办公网络的“静态 IP 业务计划”。服务不太好。

我想将办公室连接切换到我能找到的最便宜/最快的动态计划;有很多选择。但这意味着放弃邮件服务器的静态 IP。

我们在云端还有一个小型 VPS,用于搭建一个简单的网站。它没有足够的资源来托管我们的邮件服务器,但它确实有 2 个静态 IP。

我想建立一个“隧道”,使用 VPS 的静态 IP 作为我们邮件服务器的公开可见 IP 地址,并连接到实际的邮件服务器 - 现在在我们的 LAN 上,使用动态 IPv4 后面的 NAT。

经过大量的阅读,我想到的方法是使用 OpenVPN 将办公室的邮件服务器(使用本地 OpenVPN 客户端)连接到在 VPS 上运行的 OpenVPN 服务器 - 全部通过由隧道代理(HE.net)提供的“静态”IPv6,并且独立的我们的 ISP。

我设法设置了 IPv6 隧道。以及 OpenVPN 服务器和客户端。我甚至可以通过 IPv6 在两者之间建立连接

此时,我陷入了困境——我完全迷失在路由中(我想!),需要让 VPS 上的外部 IPv4 地址与邮件服务器通过 IPv6 链接监听的内部 IPv4 地址进行通信和监听。

我在网上找到了很多文章,但它们似乎都说“只需在客户端和服务器之间建立 OpenVPN 连接”,根本没有提供太多细节——无论如何我可以理解 :-(——然后没有提到获取地址映射以及入站和出站流量的全部完成。

VPS 和 Office 路由器上都安装了防火墙。我甚至还没有开始考虑需要为 VPN 上的 IMAP 和 SMTP 流量打开什么...

有人可以分享一份文档,或者帮助您顺利完成这里要做的事情以及如何做吗?

作为参考,我的网络布局是:

------------------------------------
| VPS Server                       |
|    eth0:                         |
|       IPv4 = 172.16.10.100       |
|       IPv6 = 2100:...:0444::100  |
|    tun1:                         |
|       IPv6 = 2199:...:1          |
------------------------------------
      |              |
      |              |
      |       ---------------------------------
      |       |    eth1:                      |
      |       |       IPv4 = 172.16.10.63     |
      |       |       IPv6 = 2100:...:0444:2  |
      |       |                               |
      |       | Server-side Gateway           |
      |       |                               |
      |       |    eth0: (PUBLIC IPs)         |
      |       |       IPv4 = x.y.z.63         |
      |       |       IPv6 = 2100:...:0444:1  |
      |       ---------------------------------
      |              |
      |              |
      |       ----------------
     VPN      | Internet/WAN |
      |       ----------------
      |              |
      |              |
      |       ---------------------------------
      |       |    eth0:                      |
      |       |       IPv4 = a.b.c.24         |
      |       |       IPv6 = 2600:...:0123:1  |
      |       |                               |
      |       | Client-side Gateway           |
      |       |                               |
      |       |    eth1:                      |
      |       |       IPv4 = 192.168.1.24     |
      |       |       IPv6 = 2600:...:0123:2  |
      |       ---------------------------------
      |              |                             ------------------------------------
      |              |-----------------------------|  MailServer                      |
      |              |                             |     eth0:                        |
      |              |                             |        IPv4 = 192.168.1.199      |
      |              |                             |        IPv6 = 2600:...:0123:199  |
      |              |                             ------------------------------------
------------------------------------
| Client                           |
|    eth0:                         |
|       IPv4 = 192.168.1.100       |
|       IPv6 = 2600:...:0123:100   |
|    tun1:                         |
|       IPv6 = 2699:...:1          |
------------------------------------

具体目标是让来自互联网/WAN 的消息流量到达 VPS 上的“公共 IP”

IPv4 = x.y.z.63         port 25
IPv6 = 2100:...:0444:1  port 25

立即重定向到监听的“邮件服务器”,并且,

来自邮件服务器的流量被正确地路由到“公共 IP”,看起来好像源自那些外部 IP。

按照我在网上和 OpenVPN 手册中找到的示例,我已经能够使部分想法发挥作用,但是一旦我添加了 IPv6 隧道,我却无法设置客户端路由、推送路由等,也无法让流量流动。

答案1

如果您要在 VPS 服务器上运行 TCP 代理,您应该能够避开 VPN 并通过 IPv6 直接从 VPS 连接到邮件服务器。

Socat 可以在 Linux 上解决这个问题:

socat -d -d -lmlocal2 \
TCP4-LISTEN:25,bind=myaddr1,su=nobody,fork,reuseaddr \
TCP6:mail.domain.local:80,bind=myaddr2

或者在 Windows 上执行 netsh:

netsh interface portproxy add v4tov6 listenport=25 connectaddress=mail.domain.local connectport=25 protocol=tcp

要么将与 VPS 服务器的 IPv4 地址的连接转发到邮件服务器的 IPv6 地址。

如果发送者具有 IPv6 访问权限,这还可以带来跳过 VPS 的额外好处。


如果您执意要使用不带端口转发的 OpenVPN,那么您必须执行以下操作来传输流量:

  • 设置边缘主机的 IPv6 访问权限
  • 在 IPv6 互联网上设置 v4 p2p 隧道
  • 设置路由以允许来自邮件服务器的所有流量通过隧道
  • 设置 NAT,将辅助 v4 地址转换为邮件服务器的私有 v4 地址

假设 IPv4 公有地址为 1.2.3.2 和 1.2.3.3,网关为 1.2.3.1。假设 VPS 站点的 IPv6 公有地址为 [2001:abcd:1::] 假设客户端站点的 IPv6 公有地址为 [2001:abcd:2::] 假设 VPS 边缘的 IPv4 隧道地址为 10.1.100.1,客户端边缘的 IPv4 隧道地址为 10.1.100.2

笔记:这有点像伪代码,但与思科配置非常接近。我手头没有等效的 iptables 和 OpenVPN 配置,但它们应该很容易转换。

VPS 网关:

! gateway acts as a router
ip routing
ipv6 unicast-routing

! interfaces
interface outside
  ip address 1.2.3.2 255.255.255.248
interface inside
  ip address 172.16.10.63 255.255.255.0
  ipv6 address 2001:abcd:1:1::1 /64
interface tunnel6
  ipv6 address 2001:abcd:1::1
  tunnel source 1.2.3.2

! Routing table:
! send traffic for the client net via the openvpn p2p link
ip route 192.168.1.0 255.255.255.0 172.16.10.100
ip route 0.0.0.0 0.0.0.0 1.2.3.1
ipv6 route ::0/0 2001:abcd:1::2

! NAT Table:
! nat the mailserver
static (outside,inside) 1.2.3.4 192.168.1.199 netmask 255.255.255.255

VPS 服务器:

! vps server acts as a v4 router
ip routing

! interfaces
interface inside
  ip address 172.16.10.100
  ipv6 address 2001:abcd:1:1::100 /64

interface tun0
  tunnel source 2001:abcd:1:1::100
  tunnel destination 2001:abcd:2:1::100
  ip address 10.1.100.1 255.255.255.252

! Routing table:
ip route 192.168.1.0 255.255.255.0 10.1.100.2
ip route 0.0.0.0 0.0.0.0 172.16.10.63
ipv6 route ::0/0 2001:abcd:1:1::1

客户端路由器:

! gateway acts as a router
ip routing
ipv6 unicast-routing

! interfaces
interface outside
  ip address from dhcp
interface inside
  ip address 192.168.1.24 255.255.255.0
  ipv6 address 2001:abcd:2:1::1 /64
interface tunnel6
  ipv6 address 2001:abcd:2::1

! routing
ip route 172.16.10.0 255.255.255.0 192.168.1.100
ipv6 route ::0/0 2001:abcd:2::2

客户端边缘:

! client edge acts as a v4 router
ip routing

interface inside
  ip address 192.168.1.100 255.255.255.0
  ipv6 address 2001:abcd:2:1::100 /64
interface tunnel0
  tunnel source 2001:abcd:2:1::100 
  tunnel destination 2001:abcd:1:1::100
  ip address 10.1.100.2 255.255.255.252

ip route 172.16.10.0 255.255.255.0 10.1.100.1

! use pbr to send internet traffic from the mailserver over the vpn
access-list 1 permit 192.168.1.199
route-map pbr-mailserver-vpn permit 10
  match ip address 1
  set ip default next-hop 10.1.100.1
route-map pbr-mailserver-vpn permit 20
  set ip default next-hop 192.168.1.24

邮件服务器:

interface inside
  ip address 192.168.1.199 255.255.255.0

! since our default traffic must be natted to the secondary VPS IP, forward over 
! client edge to vpn
ip route 0.0.0.0 0.0.0.0 192.168.1.100

笔记:如果您的边缘路由器支持 GRE 或其他封装隧道协议,您可以跳过服务器并在路由器上进行隧道传输。但请记住,客户端路由器必须能够根据源地址进行策略路由,以便通过隧道将来自邮件服务器的流量返回。

我再次强调,与从 v4 到 v6 进行端口转发相比,这几乎没有什么好处,而且复杂性增加到了荒谬的程度。它还会引入难以追踪的问题,例如非对称路由、NAT 和多层隧道(这将使 MTU 降低约 400 字节)。

答案2

为什么不让办公室服务器只在 IPv6 上发送入站邮件 (SMTP),并使用 VPS 作为双栈的后备?支持 IPv6 的发件人可以直接发送到办公室服务器,其他人可以发送到 VPS,然后 VPS 会通过 IPv6 将其中继到办公室。

相关内容