AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 827832
Accepted
Bogd
Bogd
Asked: 2017-01-23 07:06:33 +0800 CST2017-01-23 07:06:33 +0800 CST 2017-01-23 07:06:33 +0800 CST

OpenVPN 路由到服务器后面的 LAN

  • 772

我有一个使用 OpenVPN 配置的站点到站点 VPN。隧道似乎很好(我可以从一端ping到另一端),但我无法让两端的网络相互看到。

我的拓扑如下:

Net1 (192.168.13.0/24)
 |
 | 
 |
192.168.13.35
ens160
-----------
OVPN Client
-----------
tun0
10.13.10.2
 |
 |
10.13.10.1
tun0
-----------
OVPN Server
-----------
ens160
10.1.121.6
 |
 |
Net2 (10.1.121.0/26)

我可以从客户端ping到服务器:

srv# ping 10.13.10.2
PING 10.13.10.2 (10.13.10.2) 56(84) bytes of data.
64 bytes from 10.13.10.2: icmp_seq=1 ttl=64 time=5.46 ms
64 bytes from 10.13.10.2: icmp_seq=2 ttl=64 time=5.01 ms

我可以从客户端到 Net1(当然,在添加适当的路由之后):

client#ping 10.1.121.8
PING 10.1.121.8 (10.1.121.8) 56(84) bytes of data.
64 bytes from 10.1.121.8: icmp_seq=1 ttl=63 time=48.0 ms

但是,我完全无法反其道而行之(从服务器对客户端网络-Net2- 执行 ping 操作)。我什至无法从服务器访问 Net2 上的客户端 IP:

server#ping 192.168.13.35
PING 192.168.13.35 (192.168.13.35) 56(84) bytes of data.
^C
--- 192.168.13.35 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2014ms

我确实有适当的路线:

server# ip route
default via 10.1.121.1 dev ens160 onlink 
10.1.121.0/26 dev ens160  proto kernel  scope link  src 10.1.121.6 
10.13.10.0/24 dev tun0  proto kernel  scope link  src 10.13.10.1 
192.168.13.0/24 via 10.13.10.2 dev tun0 

client# ip route
default via 192.168.13.1 dev ens160 onlink 
10.1.121.0/24 via 10.13.10.1 dev tun0 
10.13.10.0/24 dev tun0  proto kernel  scope link  src 10.13.10.2 
192.168.13.0/24 dev ens160  proto kernel  scope link  src 192.168.13.35 

IPTables 没有阻止任何东西(一切都设置为 ACCEPT):

client# iptables -L -vn
Chain INPUT (policy ACCEPT 56 packets, 3839 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 40 packets, 4343 bytes)
 pkts bytes target     prot opt in     out     source               destination   

server# iptables -L -vn
Chain INPUT (policy ACCEPT 736 packets, 75398 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   168 ACCEPT     all  --  tun0   *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT 4 packets, 236 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    84 ACCEPT     all  --  tun0   *       0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 449 packets, 43393 bytes)
 pkts bytes target     prot opt in     out     source               destination 

如果我在隧道接口上运行 tcpdump,我会看到 ICMP 数据包离开客户端,但看不到它们在服务器上传入:

server# ping 192.168.13.35
PING 192.168.13.35 (192.168.13.35) 56(84) bytes of data.
16:57:40.262004 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 1, length 64
16:57:41.269165 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 2, length 64
16:57:42.277154 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 3, length 64
16:57:43.285163 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 4, length 64

client# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes

两个端点都是 Ubuntu 16.04 Server LTS(x64,大部分默认安装)。

我以为我对 Linux 网络有所了解,但是……看来我错了 :) 。我不知道为什么这不起作用,而且我已经没有什么可以尝试的想法了。谁能指出我正确的方向?

谢谢!

vpn tcpdump ip-routing ubuntu-16.04 linux-networking
  • 2 2 个回答
  • 11717 Views

2 个回答

  • Voted
  1. Best Answer
    fossil
    2017-01-23T08:28:00+08:002017-01-23T08:28:00+08:00

    您可能缺少iroute. 除了推送路线之外,您还需要iroute在配置文件中。这是 OpenVPN 手册页的摘录。

    --iroute 网络 [网络掩码]

    生成到特定客户端的内部路由。如果省略网络掩码参数,则默认为 255.255.255.255。该指令可用于将固定子网从服务器路由到特定客户端,无论客户端从何处连接。请记住,您还必须将路由添加到系统路由表中(例如使用 --route 指令)。需要两条路由的原因是 --route 指令将数据包从内核路由到 OpenVPN。一旦进入 OpenVPN,--iroute 指令就会路由到特定的客户端。此选项必须在客户端实例配置文件中使用 --client-config-dir 或使用 --client-connect 脚本动态生成。--iroute 指令还与 --push "route ..." 有重要的交互作用。--iroute 本质上定义了一个由特定客户端拥有的子网(我们称之为客户端 A)。如果您希望其他客户端能够访问 A 的子网,您可以使用 --push "route ..." 和 --client-to-client 来实现这一点。为了让所有客户端都能看到 A 的子网,OpenVPN 必须将此路由推送到除 A 之外的所有客户端,因为子网已经由 A 拥有。OpenVPN 通过不将路由推送到客户端来完成此操作路由。

    您需要在各自的客户端和服务器中进行如下配置条目。

    iroute 192.168.3.0 255.255.255.0

    此外,如果您在多个客户端后面有多个网络,您可能需要检查 CCD。

    客户端配置目录

    该指令设置客户端配置目录,OpenVPN 服务器将扫描每个传入连接,搜索特定于客户端的配置文件(有关更多信息,请参阅手册页)。此目录中的文件可以即时更新,而无需重新启动服务器。请注意,此目录中的更改只会对新连接生效,对现有连接无效。如果您希望特定于客户端的配置文件更改对当前连接的客户端(或已断开连接,但服务器未超时其实例对象的客户端)立即生效,请使用管理终止客户端实例对象接口(如下所述)。这将导致客户端重新连接并使用新的 client-config-dir 文件

    • 2
  2. Bogd
    2017-01-23T13:29:58+08:002017-01-23T13:29:58+08:00

    Fossil 的回答正是我所需要的,我已经接受了。我只想为可能有同样问题的其他人添加一些信息。因为这个问题之前在 serverfault 上被问过,但是答案要么没有提到 iroute(一个例子),要么只有死链接(比如这个)

    所以...首先,我在这里找到了对 iroute 的一个很好的解释(以及为什么需要它) 。但是由于我刚刚提到了链接失效的风险,我还将尝试在下面提及最重要的想法。

    看起来内核路由不足以让流量通过 OpenVPN 隧道。如果您想访问位于 OpenVPN 客户端后面的 LAN,您还需要一个 OpenVPN 内部路由 (iroute)。这是通过在 server.conf 中使用 client-configuration-dir 语句添加的,并将 iroute 语句添加到放置在该子目录中的配置文件中。

    就我而言,我还需要:

    #Inside server.conf
    client-configuration-dir my-config-dir
    
    #Inside my-config-dir/client1 (same name as the client!)
    #Tell OpenVPN that 192.168.13.0/24 is reachable via client1
    iroute 192.168.13.0 255.255.255.0
    

    这也引发了一个有趣的问题——如果 OpenVPN 不能仅使用内核路由工作,乍一看似乎不可能在 ovpn 隧道之上运行路由协议。有没有人得到这样的解决方案(ovpn+rip/ospf)?

    • 1

相关问题

  • 无法通过 Ubuntu VPN 访问外部网络

  • 用 D-LINK DFL-CPG310 防火墙替换 Cisco Pix 防火墙

  • 最好的点对点 VPN?

  • WAN 上的 VLAN

  • 通过 VPN 连接什么是远程服务器 IP?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve