服务器配置

服务器配置

我对这个话题还比较陌生,所以如果我问一些简单(或愚蠢)的问题,请不要介意。我有一台 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 1​​92.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 addrifconfig检查以“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]

相关内容