我的目标是:在一个系统eth0和tap0上有两个网络接口,它们都有一个工作的internet连接。我应该能够有选择地绑定服务/程序。
Apache示例:我想创建以下vhost:
site1.example.com绑定到在eth0上可用的85.xxx.49.100site2.example.com绑定到在tap0上可用的89.xxx.xxx.5site3.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有:
allow-hotplug eth0
no-auto-down eth0
iface eth0 inet dhcp当网络在线时,我的路由表如下所示:
$ 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服务器配置:
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服务器上的网络配置为:
[Match]
Name=eth0
[Network]
Bridge=br0[NetDev]
Name=br0
Kind=bridge[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[Match]
Name=tap0
[Network]
Bridge=br0启动OpenVPN后,任何以太网帧进入客户机上的tap0设备,在服务器的br0上出现。理论上,这意味着我可以将为服务器保留的任何IP地址分配给客户机上的tap0设备。我试图向客户端的tap设备添加一个IP:
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 eth0IP是存在的,我可以同时使用谷歌:ping -I eth0 google.com和ping -I tap0 google.com,但是我不能,例如,把源代码设置为89.xxx.xxx.5的wget --它只是超时。
我该怎么做?谢谢。
发布于 2019-06-30 14:52:01
在阅读了http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.netfilter.html之后,我对iptables和iproute2产生了创造性,这似乎适用于我的用例:
tap0并确保L2正常工作;89.xxx.xxx.5分配到设备并设置链接:ip addr add 89.xxx.xxx.5/24 broadcast 89.xxx.xxx.255 dev tap0
ip link set tap0 uptap0的IP一起使用,并添加以下路由: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 BRIDGESERVERiptables标记从我们分配的IP (89.xxx.xxx.5)开始的所有tcp/udp通信量,因此它将使用辅助路由表/默认网关: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 1eth0上默认设置为IP:speedtest
Retrieving speedtest.net configuration...
Testing from xyz (85.xxx.49.100)...tap0的IP:speedtest --source=89.xxx.xxx.5
Retrieving speedtest.net configuration...
Testing from cpv (89.xxx.xxx.5)...发布于 2019-06-30 12:15:59
在这个问题上,有各种各样的假设是如何建立网络的,这些假设与现实不符。
我在这台机器上添加了一个抽头设备,连接到远程服务器的网络上。
您不能“将抽头设备连接到远程服务器的网络”。tap设备是一种让某种应用程序控制网络接口的方法。如果没有连接到该抽头设备的应用程序,则该抽头设备将什么也不做。
根据我的理解,进入Debian机器上的
tap设备的任何以太网帧都应该出现在服务器的桥接br0上。
不是的。
您可以做的是使用某种隧道(OpenVPN、tinc、wirdeguard;有很多选项)。此隧道将在debian计算机(tap或其他)上创建一个网络接口,并在服务器上创建一个网络接口。在服务器上,您可以将此设备连接到面向外部的网络接口。在debian机器上,您可以给这个设备两个IP地址(89.xxx.xxx.5和89.xxx.xxx.6),假设服务器上的面向外网络也可以分配这些地址。
不要使用两条默认路径。使用单一的默认路由,并将apache绑定到Debian计算机上的三个internet地址中的每一个。
您已经有了另一个答案中详细说明的工作解决方案,但供参考:
https://unix.stackexchange.com/questions/527677
复制相似问题