我对这个话题还比较陌生,所以如果我问一些简单(或愚蠢)的问题,请不要介意。我有一台 Raspberry Pi 3B,并在其上安装和配置了一个 OpenVPN 服务器。因此我遵循了这个 openvpn 社区指南:https://openvpn.net/community-resources/how-to/ 我正在使用 Windows 计算机连接到此服务器,它运行良好。我尝试配置服务器,以便我的 IPv4 互联网流量通过隧道路由。问题是,在建立与 VPN 服务器的连接期间,IPv4 网站根本没有加载。此外,IPv6 流量仍然会通过,因此 IPv6 网站可以正常加载。请查看随附的服务器配置、客户端配置、iptables 规则集和 IP 路由表。除此之外,我还根据社区指南使用以下命令配置了 NAT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
所以最终的问题是正确的路由。提前感谢大家的帮助!
干杯,帕特里克
PS:192.168.2.1 是我的 Pi 通过以太网连接到的 W-Lan 路由器的 IP。
服务器配置
port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
keepalive 10 120
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
push "redirect-gateway local def1"
push "dhcp-options DNS 10.8.0.1"
客户端配置
client
dev tun
proto udp
remote 192.168.2.129 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3
redirect-gateway local def1
IPv4 规则
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW,ESTABLISHED -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p udp -m state --state NEW,ESTABLISHED -m udp --dport 1194 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW,ESTABLISHED -m tcp --dport 1194 -j ACCEPT
-A INPUT -i eth0 -p udp -m state --state ESTABLISHED -m udp --sport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -m tcp --sport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -m tcp --sport 443 -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A INPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: "
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -m limit --limit 3/min -j LOG --log-prefix "iptables_FORWARD_denied: "
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state ESTABLISHED -m tcp --sport 22 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state ESTABLISHED -m udp --sport 1194 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state ESTABLISHED -m tcp --sport 1194 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state NEW,ESTABLISHED -m udp --dport 53 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED -m tcp --dport 80 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED -m tcp --dport 443 -j ACCEPT
-A OUTPUT -o tun0 -j ACCEPT
-A OUTPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_OUTPUT_denied: "
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT
IPv6 规则
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -j REJECT --reject-with icmp6-port-unreachable
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -j REJECT --reject-with icmp6-port-unreachable
COMMIT
IP 路由表
Target Router Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0 eth0
10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
10.8.0.0.2 0.0.0.0 255.255.255.225 UH 0 0 0 tun0
192.168.2.1 0.0.0.0 255.255.255.0 U 0 0 0 eth0
答案1
您的 Windows 计算机的 IP 路由表是否适用于客户端?我非常理解他们为什么推荐“def1”。对我来说,您的问题相当简单,您的 Windows 客户端和 VPN 服务器都在 192.168.2.0/24 gw 192.168.2.1 上,您最好将默认 gw 设置为隧道内 VPN 服务器的虚拟 IP,检查
ip addr
或者简单地将日志 /var/ovpn.log 添加到您的配置中并检查它的真实 IP。其次将 192.168.2.1 设置为网络 192.168.2.0/24 的 gw 一旦您设置好这个路由表,您的 Windows 机器就会发现 192.168.2.1 可以到达您的 VPN 服务器,而 192.168.2.0/24 之外的任何其他流量都会转到该服务器的虚拟 IP 进行路由。
答案2
您正在无条件拒绝 iptables 前向链中的流量。
如果这个限制确实是你想要的,那么应该这样做:
-N WHATEVER
-A WHATEVER -j LOG --log-prefix "iptables_FORWARD_denied: "
-A WHATEVER -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -m limit --limit 3/min -g WHATEVER
这样你就不会无条件地拒绝。我不知道这个限制是否合理/你的意图是什么。
还要注意,即使它不是您想要的并且您放弃了整个事情,您也需要确保不仅允许(在 iptables 中)而且启用(使用 sysctl)IP 转发。
PS 不确定如何避免“IPv6 泄漏”。不过这可能是系统特定问题(即不是 OpenVPN 问题)。
答案3
问题可能出在 Windows 10 客户端上。默认情况下,物理网络适配器和 VPN 虚拟网络适配器的接口度量都设置为“自动”。您需要取消选中“自动”,并为物理适配器输入 50 的值,为 VPN 虚拟适配器输入 25 的值。然后,使用“以管理员身份运行”打开命令提示符并发出命令ipconfig /flushdns
。
答案4
看来推送路由器配置对客户端来说效果很好,您的 Windows 机器知道并且能够找到 10.8.0.1 的 VPN 服务器作为路由器。
并且您的 ping 到达了 google.com 和 8.8.8.8 但是问题是为什么它没有回音?
traceroute to 8.8.8.8 (8.8.8.8), 64 hops max
-1 10.8.0.1 3.431ms 3.021ms 6.034ms
-2 * * *
......
-7 8.8.8.8 14.281ms 15.043ms 13.892ms
我猜测主要原因是 iptables 中的伪装用你的 Rasberry Pi 的 IPv6 伪装了来自 Windows 机器的源 IPv6,并且那些网站拒绝响应任何 IPv6 地址。
对 Pi 机器发出的数据包进行进一步诊断很有帮助,您可以使用ip addr
或ifconfig
检查以“eth”开头的 [网卡名称] 以及“inet”(ipv4) 和“inet6”部分 (ipv6) 之后的地址。当您从 Windows 客户端 ping 时,您可以检查 Pi 发出的实际流量。
tcpdump icmp -nn -i [netcard's name] -v
如果你发现传出的流量获取了 Pi 的 ipv6 的源地址,那么这确实是原因。要修复它,你应该通过明确指定 SNAT(更改源 IP)为其 ipv4 地址来替换伪装子句(删除它):
iptables -t nat -A POSTROUTING -j SNAT -to [Pi's ipv4 address]