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 / 问题 / 987999
Accepted
Jorge Fuentes González
Jorge Fuentes González
Asked: 2019-10-15 16:41:37 +0800 CST2019-10-15 16:41:37 +0800 CST 2019-10-15 16:41:37 +0800 CST

将一个接口转换为隧道接口

  • 772

我有一台带有 2 个 WAN 接口的服务器,eth1并且eth2. 每个人都有一个连接的路由器,它为他们提供这些 IP:192.168.3.101和192.168.1.101.

问题是我想完全避免流量通过eth1,而是创建一个tun0隧道,所有流量eth1都应该接收。

我可以完全控制我的程序应该使用哪个接口(MPTCP 将使用它可以访问服务器的所有接口),所以我准备了一个简单的 OpenVPN 客户端/服务器配置(绑定到local 192.168.3.101),带有服务器 IP192.168.99.1和客户端 IP 192.168.99.2。有了这个我有一个工作界面,我可以192.168.99.1毫无问题地发送/接收数据。

现在,当我想ifconfig.co使用 interface 向(例如)发送/接收数据时,问题就来了tun0。我虽然它会做的是将数据发送eth1到我的服务器,然后我的服务器将流量重定向到ifconfig.co,但这不是正在发生的事情。它只是断开连接:
拒绝连接

如果我尝试使用接口eth1并且eth2一切都按预期工作。

我已经不间断地阅读/尝试了很多东西大约 7 个小时,现在我真的迷路了。我不确定发生了什么或我做错了什么。

我认为是路由问题,因为当我尝试 tcpdump 上面的命令时,服务器上什么也没有显示。收到零个数据包。这就是我现在所拥有的:
在此处输入图像描述
在此处输入图像描述
在此处输入图像描述

我看到一切都彼此平等,但是eth0/eth1正在工作而tun0不是。

以防万一,这是我的 OpenVPN 配置(一个简单的点对点配置):

;SERVER
dev tun
ifconfig 192.168.99.1 192.168.99.2
secret /etc/openvpn/static.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key

;CLIENT
dev tun
remote XXXXXXXXXXXX
resolv-retry infinite
local 192.168.3.101
lport 0
ifconfig 192.168.99.2 192.168.99.1
secret /etc/openvpn/static.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key

注意:我知道 VPN IP 的约定是10.*,但我不顾一切地更改192.168.*为具有与其他 2 个接口类似的配置。

这一切的原因是解决这个问题的想法:https ://github.com/Ysurac/openmptcprouter/issues/670#issuecomment-533816813

openvpn
  • 1 1 个回答
  • 247 Views

1 个回答

  • Voted
  1. Best Answer
    Nikita Kipriyanov
    2019-10-15T23:31:36+08:002019-10-15T23:31:36+08:00

    您正在尝试实现基于路由隧道模式的解决方案,但您的问题描述在我看来非常适合桥接分接模式。

    OpenVPN 不仅可以隧道 IP 数据包。它还可以对整个以太网数据包进行隧道传输。简而言之,您可以将“mode tun”替换为“mode tap”,并删除 OpenVPN 配置中的所有 IP 地址分配。同时删除所有非默认路由规则。然后,在您的操作系统的帮助下,您可以在 eth1 和 tap 接口之间架起一座桥梁。

    在 Debian (/etc/network/interfaces) 中:

    iface eth1 inet manual
    
    auto br0
    iface br0 inet manual
        bridge_ports    eth1
        bridge_stp      off
        bridge_fd       0
    

    接下来,我们需要指示 OpenVPN 在启动后将 tapX 添加到 br0(这将转到 OpenVPN 配置):

    script-security 2
    up up.sh
    

    为什么需要脚本安全性,请参阅https://community.openvpn.net/openvpn/wiki/OpenVPNBridging

    up.sh 脚本:

    #!/bin/sh
    bridge=br0
    brctl addif "$bridge" "$1"
    ip link set "$1" up
    

    它使用 bridge-utils brctl,因为这个配置是在 debian 7 上完成的。现代系统应该使用现代 iproute2 套件中的 ip 实用程序,而不是过时的 bridge-utils、iputils 等;我将把它留作家庭作业,如何使用 ip 向网桥添加接口,这并不难。

    你看,我什至没有配置任何 IP 地址。这是因为我的 OpenVPN 设备只会将以太网数据包从物理接口桥接到虚拟接口并返回。在 OSI 网络模型中,这算作第 2 层桥接,即好像您有一个以太网交换机。

    运行 OpenVPN 的远程系统(“CLIENT”)将具有其分接头接口,就好像它被插入到“SERVER”的 eth1 被插入的同一以太网交换机中一样:

    (LAN) - [switch] ---ethernet-cable--- [eth1 tapX] ---virtual-ethernet-cable--- [tapY]
                                            "switch"         OpenVPN tunnel          remote system
    

    您可以在远程系统 ("CLIENT") 上运行 DHCP 客户端,它应该从 LAN 中的 DHCP 服务器接收 IP 地址。您也可以在那里进行桥接,这就像您使用以太网电缆连接您的远程站点一样。想象一下,就像您在一个站点到另一个站点之间运行一条长光路,并将这些网络与它连接起来。

    如果你想让“SERVER”也加入这个网络,你在br0本身上配置IP地址,为此你将“manual”替换为“static”甚至“dhcp”,这根本不会影响它的切换功能。

    Linux Netfilter 设置(防火墙)需要特别注意。前段时间有一个 sysctl 变量控制桥接数据包是否通过“filter FORWARD”链传递,net.bridge.bridge-nf-call-iptables=1。在现代系统上,AFAIK,默认为 0。如果你有它,要么将它设置为 0(在 /etc/sysctl.conf 中),要么具有在交换机端口之间传递数据包的规则。请参阅 iptables 手册中的“physdev match”。

    请注意,您为系统指定的“服务器”和“客户端”名称纯粹是装饰性的,并不反映它们的协议角色。从 OpenVPN 的角度来看,两个系统是平等的,因为您将 OpenVPN 配置为“传统”点对点模式。OpenVPN 中还有专用的“客户端-服务器”模式,其中确实有两个不同的角色,多个客户端可以连接到单个 OpenVPN 服务器。我在这里提出的想法也适用于该模式。

    另外,请注意,OpenVPN 没有始终使用 10.* 的约定。任何成熟的生产级 VPN 解决方案都不会有这样的约定。您始终使用网络设计所需的网络编号。

    UPD:在虚拟机内部测试网桥时,确保虚拟机管理程序允许在 VM 端口使用多个 MAC 地址。在 Hyper-V 中,该功能称为 MAC Spoofing,应该启用。

    • 1

相关问题

  • OpenVPN:在哪里生成私钥?

  • 将 iPhone 连接到 OpenVPN

  • OpenVPN 的 Linux IP 转发 - 正确的防火墙设置?

  • 最好的点对点 VPN?

  • 通过 VPN 使您的打印机可用的最佳方法是什么?

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