我已经关注本指南在 Ubuntu 机器上从头开始设置我自己的 OpenVPN 服务器,只是我使用的是 AWS EC2 而不是 Digital Ocean。我已经启动并运行了 OpenVPN 服务器,并且客户端(我的家用台式机)也已正确配置。我可以在两者之间建立 VPN 连接,因为我可以Initialization Sequence Completed
在客户端上看到消息,但这就是它所能达到的程度。之后,我无法从客户端访问互联网,也无法 ping 任何东西,甚至连 OpenVPN 服务器本身都无法 ping 通。
以下是有关我的设置的一些细节:
AWS
Ubuntu 16.04.2 在 EC2 nano(1 核,512MB RAM)实例上运行,该实例有自己的 VPC 和安全组。VPC 的路由表如下:https://i.stack.imgur.com/wIwtm.png。它有自己的 Internet 网关(不是 NAT 网关)。
route -n
服务器
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.31.1.1 0.0.0.0 UG 0 0 0 eth0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
172.31.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
该服务器还分配有一个弹性 IP(静态 IP),因此我可以通过 SSH 进入服务器(请注意,当我没有使用 VPN 时),没有任何问题。至于安全组,我的出站流量设置基本上允许任何类型的流量到任何类型的主机,而我的入站设置允许来自我的 IP 地址的 SSH 流量和来自任何来源的端口 1194 上的所有 UDP 流量(我会大大缩小这个范围,但目前我只想让它正常工作)。
服务器
iptable 设置(基本没有)
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ifconfig -a
eth0 Link encap:Ethernet HWaddr 02:2e:e3:58:d0:26
inet addr:172.31.1.187 Bcast:172.31.1.255 Mask:255.255.255.0
inet6 addr: fe80::2e:e3ff:fe58:d026/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:18447 errors:0 dropped:0 overruns:0 frame:0
TX packets:15656 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2083132 (2.0 MB) TX bytes:2408726 (2.4 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:160 errors:0 dropped:0 overruns:0 frame:0
TX packets:160 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:11840 (11.8 KB) TX bytes:11840 (11.8 KB)
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.1 Mask:255.255.255.0
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:320 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:96332 (96.3 KB) TX bytes:0 (0.0 B)
服务器配置文件
port 1194
proto udp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh2048.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
# Use Google's DNS servers to resolve external addresses
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120
cipher AES-128-CBC
auth SHA1
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
OpenVPN 版本
OpenVPN 2.3.10 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Feb 2 2016
library versions: OpenSSL 1.0.2g 1 Mar 2016, LZO 2.08
启动时和客户端连接时的 OpenVPN 系统日志片段
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2525]: OpenVPN 2.3.10 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Feb 2 2016
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2525]: library versions: OpenSSL 1.0.2g 1 Mar 2016, LZO 2.08
Jun 4 21:12:53 ip-172-31-1-187 systemd[1]: [email protected]: PID file /run/openvpn/server.pid not readable (yet?) after start: No such file or directory
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: Diffie-Hellman initialized with 2048 bit key
Jun 4 21:12:53 ip-172-31-1-187 systemd[1]: Started OpenVPN connection to server.
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: Socket Buffers: R=[212992->212992] S=[212992->212992]
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: TUN/TAP device tun0 opened
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: TUN/TAP TX queue length set to 100
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: /sbin/ip link set dev tun0 up mtu 1500
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: /sbin/ip addr add dev tun0 10.8.0.1/24 broadcast 10.8.0.255
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: UDPv4 link local (bound): [undef]
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: UDPv4 link remote: [undef]
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: MULTI: multi_init called, r=256 v=256
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: IFCONFIG POOL: base=10.8.0.2 size=252, ipv6=0
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: ifconfig_pool_read(), in='client-with-pass,10.8.0.4', TODO: IPv6
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: succeeded -> ifconfig_pool_set()
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: ifconfig_pool_read(), in='client-pass,10.8.0.8', TODO: IPv6
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: succeeded -> ifconfig_pool_set()
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: IFCONFIG POOL LIST
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: client-with-pass,10.8.0.4
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: client-pass,10.8.0.8
Jun 4 21:12:53 ip-172-31-1-187 ovpn-server[2528]: Initialization Sequence Completed
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: <ip>:31969 TLS: Initial packet from [AF_INET]<ip>:31969, sid=f42796e8 a043209b
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: <ip>:31969 VERIFY OK: depth=1, C=GB, ST=CA, L=Cambridge, O=Anonymous, OU=Anonymous, CN=Anonymous CA, name=EasyRSA, [email protected]
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: <ip>:31969 VERIFY OK: depth=0, C=GB, ST=CA, L=Cambridge, O=Anonymous, OU=Anonymous, CN=client-pass, name=EasyRSA, [email protected]
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: <ip>:31969 Data Channel Encrypt: Cipher 'AES-128-CBC' initialized with 128 bit key
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: <ip>:31969 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: <ip>:31969 Data Channel Decrypt: Cipher 'AES-128-CBC' initialized with 128 bit key
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: <ip>:31969 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: <ip>:31969 Control Channel: TLSv1.2, cipher TLSv1/SSLv3 DHE-RSA-AES256-GCM-SHA384, 2048 bit RSA
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: <ip>:31969 [client-pass] Peer Connection Initiated with [AF_INET]<ip>:31969
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: client-pass/<ip>:31969 MULTI_sva: pool returned IPv4=10.8.0.8, IPv6=(Not enabled)
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: client-pass/<ip>:31969 MULTI: Learn: 10.8.0.8 -> client-pass/<ip>:31969
Jun 4 21:13:06 ip-172-31-1-187 ovpn-server[2528]: client-pass/<ip>:31969 MULTI: primary virtual IP for client-pass/<ip>:31969: 10.8.0.8
Jun 4 21:13:07 ip-172-31-1-187 ovpn-server[2528]: client-pass/<ip>:31969 PUSH: Received control message: 'PUSH_REQUEST'
Jun 4 21:13:07 ip-172-31-1-187 ovpn-server[2528]: client-pass/<ip>:31969 send_push_reply(): safe_cap=940
Jun 4 21:13:07 ip-172-31-1-187 ovpn-server[2528]: client-pass/<ip>:31969 SENT CONTROL [client-pass]: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 8.8.8.8,dhcp-option DNS 8.8.4.4,route-gateway 10.8.0.1,topology subnet,ping 10,ping-restart 120,ifconfig 10.8.0.8 255.255.255.0' (status=1)
客户
客户端.ovpn
ca ca.crt
cert client-pass.crt
key client-pass.key
remote <server_public_ip> 1194
comp-lzo
client
dev tun
redirect-gateway def1
remote-cert-tls server
cipher AES-128-CBC
auth SHA1
proto udp
resolv-retry infinite
nobind
topology subnet
pull
persist-key
persist-tun
verb 3
mute 20
OpenVPN 版本
OpenVPN 2.4.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on May 11 2017
library versions: OpenSSL 1.0.2k-fips 26 Jan 2017, LZO 2.08
客户端连接到 VPN 服务器时的路由表
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.8.0.1 128.0.0.0 UG 0 0 0 tun0
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp3s0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
<vpn_server_public_ip> 192.168.1.1 255.255.255.255 UGH 0 0 0 enp3s0
128.0.0.0 10.8.0.1 128.0.0.0 UG 0 0 0 tun0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp3s0
正如我所说,根据两端打印的标准输出日志来判断,VPN 连接似乎已成功建立,但客户端根本没有网络/互联网访问。
我花了大量时间排除此故障,查看可能的 AWS 安全组问题、配置文件问题(例如客户端和服务器配置文件之间的设置不匹配)、两端的防火墙问题,我甚至在服务器上运行了 tcpdump,可以看到来自客户端的传入数据包,尽管我不是分析网络数据包转储的专家,所以我无法通过查看它得出任何可靠的结论... 有人可以提供帮助吗?我将不胜感激!
答案1
OpenVPN 配置似乎很好,路由表也是如此。
如果也能有客户端的日志(以防万一)以及在客户端和服务器之间进行的测试(traceroute?ping?nc?)的输出,那就太好了。
但无论如何,在我看来,问题在于您在服务器操作系统上缺少一些配置。
看一下:https://community.openvpn.net/openvpn/wiki/BridgingAndRouting(使用路由)
你会发现你应该:
- 启用 IP 转发
- 允许使用 IPTables 转发流量。对于已建立的连接,从 VPN 到“世界”,并拒绝其他所有内容(或将拒绝定义为默认规则)。
- 启用从 VPN 到“世界”的伪装
也就是说,如果您不想使用 VPN 访问同一 VPC 上的其他 EC2(在这种情况下,您将需要添加更多规则以在 VPN 和 VPC 之间转发)。