首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Debian: 2个接口,2个网关

Debian: 2个接口,2个网关
EN

Unix & Linux用户
提问于 2019-06-29 20:56:45
回答 2查看 854关注 0票数 1

我的目标是:在一个系统eth0tap0上有两个网络接口,它们都有一个工作的internet连接。我应该能够有选择地绑定服务/程序。

Apache示例:我想创建以下vhost:

  • site1.example.com绑定到在eth0上可用的85.xxx.49.100
  • site2.example.com绑定到在tap0上可用的89.xxx.xxx.5
  • site3.example.com绑定到在tap0上可用的89.xxx.xxx.4

系统中的程序在默认情况下应该使用eth0与外部世界通信,但也能够绑定到tap0上的in (如果需要的话),并将它们用于进出通信。示例:我应该能够运行speedtest-cli --source="85.xxx.49.100" (IP at eth0)和speedtest-cli --source="89.xxx.xxx.4" (IP at tap0)。

我有一台Debian机器,它有物理以太网接口eth0,这个接口从DHCPd服务器获取IP、网关和DNS服务器。/etc/network/interfaces有:

代码语言:javascript
复制
allow-hotplug eth0
no-auto-down eth0
iface eth0 inet dhcp

当网络在线时,我的路由表如下所示:

代码语言:javascript
复制
$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         85.xxx.xxx.1    0.0.0.0         UG    0      0        0 eth0
85.xxx.49.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 eth0

现在,我向这台机器添加了一个tap设备(使用OpenVPN)。OpenVPN客户端和服务器不分配任何IP地址。我们的想法是在机器之间只有第二层。下面是OpenVPN服务器配置:

代码语言:javascript
复制
local 89.xxx.xxx.8
port xxxx
proto udp
dev tap0
mode server
tls-server
user nobody
group nogroup
tls-version-min 1.2
auth SHA512
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
script-security 1
client-to-client
keepalive 10 60
compress
max-clients 10
cipher AES-256-CBC
persist-key
persist-tun

服务器上的网络配置为:

10-static-eth0.network

代码语言:javascript
复制
[Match]
Name=eth0

[Network]
Bridge=br0

25-br0.netdev

代码语言:javascript
复制
[NetDev]
Name=br0
Kind=bridge

25-br0.network

代码语言:javascript
复制
[Match]
Name=br0

[Network]
DHCP=no
Address=89.xxx.xxx.8/24
Address=89.xxx.xxx.7/24
Address=89.xxx.xxx.6/24
Gateway=89.xxx.xxx.1

DNS=1.1.1.1
DNS=8.8.8.8

30-tap.network

代码语言:javascript
复制
[Match]
Name=tap0

[Network]
Bridge=br0

启动OpenVPN后,任何以太网帧进入客户机上的tap0设备,在服务器的br0上出现。理论上,这意味着我可以将为服务器保留的任何IP地址分配给客户机上的tap0设备。我试图向客户端的tap设备添加一个IP:

代码语言:javascript
复制
ip addr add 89.xxx.xxx.5/24 broadcast 89.xxx.xxx.255 dev tap0
ip link set tap0 up
route add default gw 89.xxx.xxx.1 metric 200
ip route add 89.xxx.xxx.8 via 85.xxx.xxx.1 dev eth0

IP是存在的,我可以同时使用谷歌:ping -I eth0 google.comping -I tap0 google.com,但是我不能,例如,把源代码设置为89.xxx.xxx.5wget --它只是超时。

我该怎么做?谢谢。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-06-30 14:52:01

在阅读了http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.netfilter.html之后,我对iptablesiproute2产生了创造性,这似乎适用于我的用例:

  1. 启动OpenVPN客户端,以确保创建了tap0并确保L2正常工作;
  2. 89.xxx.xxx.5分配到设备并设置链接:
代码语言:javascript
复制
ip addr add 89.xxx.xxx.5/24 broadcast 89.xxx.xxx.255 dev tap0
ip link set tap0 up
  1. 创建一个辅助路由表和一个标记,以便与tap0的IP一起使用,并添加以下路由:
代码语言:javascript
复制
echo "1 BRIDGESERVER" >> /etc/iproute2/rt_tables

ip route add default via 89.xxx.xxx.1 dev tap0 table BRIDGESERVER

ip route add 89.xxx.xxx.8 via 85.xxx.xxx.1 dev eth0 # xxx.8 is the VPN server  and xxx.1 is the local gateway
ip route add 0.0.0.0/1 via 89.xxx.xxx.1 dev tap0 table BRIDGESERVER
ip route add 128.0.0.0/1 via 89.xxx.xxx.1 dev tap0 table BRIDGESERVER

ip route show table BRIDGESERVER
ip rule add from all fwmark 0x1 lookup BRIDGESERVER
  1. 使用iptables标记从我们分配的IP (89.xxx.xxx.5)开始的所有tcp/udp通信量,因此它将使用辅助路由表/默认网关:
代码语言:javascript
复制
iptables -t mangle -I PREROUTING -p tcp --destination 89.xxx.xxx.5 -j MARK --set-mark 1
iptables -t mangle -I OUTPUT -p tcp --source 89.xxx.xxx.5 -j MARK --set-mark 1

iptables -t mangle -I PREROUTING -p udp --destination 89.xxx.xxx.5 -j MARK --set-mark 1
iptables -t mangle -I OUTPUT -p udp --source 89.xxx.xxx.5 -j MARK --set-mark 1

一些测试

  • 如果不设置要绑定到的源IP,则在eth0上默认设置为IP:
代码语言:javascript
复制
speedtest
Retrieving speedtest.net configuration...
Testing from xyz (85.xxx.49.100)...
  • 绑定到以前分配给tap0的IP:
代码语言:javascript
复制
speedtest --source=89.xxx.xxx.5
Retrieving speedtest.net configuration...
Testing from cpv (89.xxx.xxx.5)...
票数 0
EN

Unix & Linux用户

发布于 2019-06-30 12:15:59

在这个问题上,有各种各样的假设是如何建立网络的,这些假设与现实不符。

我在这台机器上添加了一个抽头设备,连接到远程服务器的网络上。

您不能“将抽头设备连接到远程服务器的网络”。tap设备是一种让某种应用程序控制网络接口的方法。如果没有连接到该抽头设备的应用程序,则该抽头设备将什么也不做。

根据我的理解,进入Debian机器上的tap设备的任何以太网帧都应该出现在服务器的桥接br0上。

不是的。

您可以做的是使用某种隧道(OpenVPN、tinc、wirdeguard;有很多选项)。此隧道将在debian计算机(tap或其他)上创建一个网络接口,并在服务器上创建一个网络接口。在服务器上,您可以将此设备连接到面向外部的网络接口。在debian机器上,您可以给这个设备两个IP地址(89.xxx.xxx.589.xxx.xxx.6),假设服务器上的面向外网络也可以分配这些地址。

不要使用两条默认路径。使用单一的默认路由,并将apache绑定到Debian计算机上的三个internet地址中的每一个。

编辑

您已经有了另一个答案中详细说明的工作解决方案,但供参考:

  • OpenVPN中的路径路由子网
  • tinc桥接做你最初想做的事
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/527677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档