我有一个 VPS(Debian 稳定版),上面配置了一个网络接口和一个公共 IP 地址。我在该 VPS 上安装了软件包openvpn
,并且想配置一个 VPN 服务器。我正在使用这个 HOWTO。
这是配置文件。
服务器:
# egrep -v "^#|^;|^$" /etc/openvpn/server-vpn.conf
local 151.80.57.162
port 11941
proto udp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server-vpn.crt
key /etc/openvpn/certs/server-vpn.key
dh /etc/openvpn/certs/dh4096.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
cipher AES-256-CBC
auth SHA512
keysize 256
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 4
客户:
# egrep -v "^#|^;|^$" /etc/openvpn/client-vpn.conf
client
dev tun
proto udp
remote 151.80.57.162 11941
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/client-vpn.crt
key /etc/openvpn/certs/client-vpn.key
remote-cert-tls server
cipher AES-256-CBC
auth SHA512
keysize 256
comp-lzo
verb 4
auth-nocache
script-security 2
up /etc/openvpn/update-resolv-conf.sh
down /etc/openvpn/update-resolv-conf.sh
我还在服务器上启用了转发并添加了 NAT 规则:
# iptables -S FORWARD
-P FORWARD DROP
-A FORWARD -s 10.8.0.0/24 -i tun0 -o eth0 -j ACCEPT
-A FORWARD -d 10.8.0.0/24 -i eth0 -o tun0 -j ACCEPT
# iptables -S -t nat
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 151.80.57.162
# sysctl -a | grep -i net.ipv4.ip_forward
net.ipv4.ip_forward = 1
VPN端口也在INPUT链中打开。
我能够从客户端 ping 服务器,也能从服务器 ping 客户端。因此连接正常。这是建立隧道后客户端上的路由表:
$ ip route show
0.0.0.0/1 via 10.8.0.1 dev tun0 default via 192.168.1.1 dev eth0
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.4
128.0.0.0/1 via 10.8.0.1 dev tun0
151.80.57.162 via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.150
192.168.10.0/24 dev br-lxc proto kernel scope link src 192.168.10.100
以下是客户端上的 eth0 和 tun0 接口:
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 3c:4a:92:00:4c:5b brd ff:ff:ff:ff:ff:ff
inet 192.168.1.150/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::3e4a:92ff:fe00:4c5b/64 scope link
valid_lft forever preferred_lft forever
$ ip addr show tun0
74: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/none
inet 10.8.0.4/24 brd 10.8.0.255 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::dc57:9092:9cc2:abcc/64 scope link flags 800
valid_lft forever preferred_lft forever
以下是服务器上的路由和接口:
# ip route show
default via 151.80.57.1 dev eth0
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.1
151.80.57.1 dev eth0 scope link
# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether fa:16:3e:dd:db:03 brd ff:ff:ff:ff:ff:ff
inet 151.80.57.162/32 brd 151.80.57.162 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fedd:db03/64 scope link
valid_lft forever preferred_lft forever
# ip addr show tun0
60: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/none
inet 10.8.0.1/24 brd 10.8.0.255 scope global tun0
valid_lft forever preferred_lft forever
因此,客户端和服务器之间的连接可以建立,看起来运行良好。但是当我想通过此 VPN 服务器发送一些流量时,它只能部分工作。我的意思是,部分客户端的流量已成功通过 VPN 路由,但部分流量没有,我不知道为什么。
Wireshark 显示类似这样的内容(客户端上的 tun0 接口):
我认为这就是 FF 中的页面无法加载的原因,但我的 jabber 客户端运行良好,正如您在同一张图片上看到的那样。DNS 也正常工作。我可以 ping 8.8.8.8 并通过 VPN 解析域,但由于某些原因 WWW/MAIL 流量(可能还有其他一些流量)无法通过 VPN 服务器。
查看 VPN 服务器日志(动词 4),我可以看到许多以下消息:
Wed Nov 30 17:59:48 2016 us=146856 client-vpn/94.254.226.118:7669 MULTI: bad source address from client [192.168.1.150], packet dropped
Wed Nov 30 17:59:48 2016 us=421203 client-vpn/94.254.226.118:7669 MULTI: bad source address from client [192.168.1.150], packet dropped
Wed Nov 30 17:59:49 2016 us=10514 client-vpn/94.254.226.118:7669 MULTI: bad source address from client [192.168.1.150], packet dropped
我连接了其他 VPN 服务器,但它们不是我的,而且连接没有问题,所以我的 VPN 服务器可能有问题。我只是想连接到 VPN,以便在浏览网络时更改自己的 IP 地址。那么问题是:如何让 VPN 工作?
答案1
我知道问题出在哪里。我在 80 和 443 端口上设置了 SYNproxy,因此该机制可以保护我的 Web 服务器。不幸的是,我忘记在 iptables 表-i eth0
中指定raw
。因此,我通过 VPN 发送并发往这些端口的所有流量都被标记为 INVALID,随后在过滤表的 INPUT 链中被丢弃,可能是因为 MSS 不同(需要 1460)。
在这里您可以看到表中记录的 SYN 数据包及其端口raw
:
Dec 05 18:49:35 kernel: IN=tun0 OUT= MAC= SRC=10.8.0.10 DST=46.105.189.254 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=23425 DF PROTO=TCP SPT=61546 DPT=80 WINDOW=29200 RES=0x00 SYN URGP=
这个 SYN 被阻止了,所以它没有收到 SYN-ACK,所以我得到了这个奇怪的半工作 VPN。现在一切都正常了。