正如问题所说,我想使用 TAP 模式设置一个 OpenVPN 服务器,以促进 Steam 内置的游戏流媒体功能,从 Windows 7 游戏机流式传输到工作或学校的外部 Ubuntu 14.04 笔记本电脑。 这将允许 Ubuntu 用户连接到他们的 Windows 机器上的 Steam 帐户,并将非 Linux 游戏流式传输到他们的 Ubuntu 硬件!
以下是我想要实现的总体想法:
********************internet********************internet***********************
Ubuntu 笔记本电脑(Steam)<---> Ubuntu OpenVPN 服务器<---> Windows 机器(Steam)
我们希望使用 OpenVPN 在服务器上创建一个 VPN 网络,以便我们的 Ubuntu 笔记本电脑和 Windows 客户端都可以连接到该网络。我们必须使用 TAP 转发完整的以太网帧数据,因为 Steam 的家庭流媒体服务无法很好地与 IP 隧道 (TUN) 配合使用。一旦两台机器都连接到 VPN,它们就会开始广播它们的库可用于流媒体。
当前网络拓扑:
学校/工作 Ubuntu 14.04 笔记本电脑
主机名 chimaera-linux
动态互联网 ip (ipv4)
动态本地 ip (10.1.10.x)
硬连线连接到 eth0
运行 OpenVPN 的 Ubuntu 14.04 KVM 虚拟机
主机名 cerberus-vm
公共静态互联网 ip (xy145.133) 位于 eth0 上(ipv4,硬连线)
无本地 ip 或本地网络
Windows 7 Pro 桌面
主机名 windoze
动态互联网 ip (ipv4)
动态本地 ip (192.168.0.x)
硬连线连接到 eth0
要求:
- 连接到 VPN 的客户端必须能够使用 TAP 适配器向 VPN 网络发送流量或从 VPN 网络发送流量。TUN 不起作用!
- VPN 网络还应该能够将来自客户端的流量转发到互联网并返回(以便我们可以连接到 VPN 并将其用作安全的浏览方法)。
- 连接设置应尽可能安全,以防止 MITM 攻击或其他恶作剧。
- 内部 VPN 网络应独立这意味着它不允许或与客户端或服务器各自的本地网络交互。我并不想设置一个允许我在服务器网络上 ping 其他本地设备的 VPN 网络 - 而只是能够使用其内部 VPN IP 连接到其他 VPN 客户端。
迈向成功的步伐!
- 发现并使用https://help.ubuntu.com/lts/serverguide/openvpn.html作为在服务器上安装 OpenVPN 和设置证书的指南。没问题!
- 发现并改编http://www.slsmk.com/getting-started-with-openvpn/installing-openvpn-on-ubuntu-server-12-04-or-14-04-using-tap/因为服务器文档讨论的是设置 TUN 而不是 TAP。 此时,客户端可以连接 VPN 服务器并进行身份验证,但客户端之间无法进行流量流动,客户端也无法通过 VPN 访问互联网!
相关配置/系统信息
ubuntu VPN 客户端根据 LTS 服务器文档通过网络管理器进行配置。
Windows 7 客户端使用来自 openvpn.net 的 OpenVPN-gui 包
可以根据要求提供任何配置文件。我似乎不知道如何将它们粘贴到这里,以免在格式上甚至在代码标记上出现严重混乱。
问题领域和谜团
我似乎无法理解 openvpn server.conf 中的 vpn 路由或“推送”命令。我怀疑这是我可以连接但似乎无法将流量从 vpn 传入或传出到其他客户端或互联网的主要原因。
我尝试过 iptables 和伪装等,但都无济于事。目前,我认为这不是问题所在。目前,iptables 完全未配置,并接受所有流量。
我没有在任何客户端上配置(也不需要?)任何桥接或特殊网络设置。
答案1
经过大量工作,我终于让它与 OpenVPN(使用 TAP)一起工作了。但 TUN 却不行,我认为它无法与 TUN 一起工作,因为它无法进行 UDP 广播(显然 Steam 家庭流媒体使用它来检测对等点)。
我在我的路由器上运行 OpenVPN 服务器,它是运行 OpenWRT(Barrier Breaker)的 Archer C7 V2。
以下是我使用的服务器配置文件。需要修改的地方,需要明确:
client-to-client
persist-key
persist-tun
tls-server
ca /etc/openvpn/ca.crt
cert /etc/openvpn/erb-router-c7.crt
dev tap_mypvn
dh /etc/openvpn/dh2048.pem
keepalive 10 120
key /etc/openvpn/erb-router-c7.key
log /tmp/openvpn.log
mode server
port 1194
proto udp
route-gateway dhcp
server 10.8.0.0 255.255.255.0
status /var/log/openvpn_status.log
topology subnet
verb 3
push topology subnet
push route-gateway dhcp
push persist-key
push persist-tun
这是我的客户端配置(运行 Windows 的主机,运行 Ubuntu 的客户端机器上使用类似的配置):
client
float
dev tap
proto udp
remote YOUR_HOSTNAME_OR_IP_HERE 1194
log "C:/Program Files/OpenVPN/config/log.txt"
verb 3
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
ca "C:/Program Files/OpenVPN/config/ca.crt"
cert "C:/Program Files/OpenVPN/config/erb-main-7.crt"
key "C:/Program Files/OpenVPN/config/erb-main-7.key"
我已经对 OpenWRT 配置进行了很多操作,我不确定这是否是复制我的成功所需的全部操作。但简而言之:使用 TAP 而不是 TUN,通过client-to-client
在服务器配置中指定参数来确保您的 VPN 客户端可以相互通信。在 OpenWRT 中,我还按照OpenWRT wiki 中的 OpenVPN。
如果您有任何疑问,我会尽力回答。
根据要求进行编辑:
/etc/config/network
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd0f:252f:ed29::/48'
config interface 'lan'
option force_link '1'
option type 'bridge'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option ip6assign '60'
option _orig_ifname 'eth1 wlan0 wlan1'
option _orig_bridge 'true'
option ifname 'eth1 tap_myvpn'
config interface 'wan'
option ifname 'eth0'
option proto 'dhcp'
config interface 'wan6'
option ifname '@wan'
option proto 'dhcpv6'
config switch
option name 'switch0'
option reset '1'
option enable_vlan '1'
config switch_vlan
option device 'switch0'
option vlan '1'
option ports '0 2 3 4 5'
config switch_vlan
option device 'switch0'
option vlan '2'
option ports '1 6'
config interface 'vpn0'
option ifname 'tun0'
option proto 'none'
option auto '1'
选自 的部分/etc/config/firewall
,可能无法提供完整的上下文,但我不希望我的整个防火墙文件被人知道。请告知我最终的冗余和错误:
config rule
option name 'Allow-OpenVPN-Inbound'
option target 'ACCEPT'
option src '*'
option proto 'udp'
option dest_port '1194'
config zone
option name 'vpn'
option masq '1'
option input 'ACCEPT'
option forward 'ACCEPT'
option output 'ACCEPT'
option network 'vpn0'
config forwarding
option dest 'lan'
option src 'vpn'
config forwarding
option dest 'wan'
option src 'vpn'
config forwarding
option dest 'vpn'
option src 'lan'
答案2
因此,事实证明,OpenVPN 的这种简单想法实际上要复杂得多。如果您在桥接模式下使用 OpenVPN,则可以进行 Steam 流式传输(我认为这需要您已经拥有可以桥接的本地局域网设置)。
我最终做的是使用 Hamachi 并混合在以下位置找到的说明http://steamcommunity.com/groups/homestream/discussions/0/540738051890279158/和https://help.ubuntu.com/community/Hamachi
从 Windows 机器流式传输 Linux 客户端运行良好。