目标与问题
我努力了非常很难解决这个问题,但我被困住了。我并不想创建站点到站点的 VPN,仅供参考。
我已经使用 ansible 成功安装了 OpenVPN:https://github.com/BastiPaeltz/ansible-openvpn(需要相当多的补丁才能使其与 python3 和最新的 easyrsa 版本兼容,并修复一些错误)。
我已成功将我的 AWS VPC()的路由推送给172.31.0.0/16
客户端,并且他们可以连接到该网络中的主机,但是当我将它们配置为不通过 VPN 路由所有流量(即不重定向其网关)时,此功能将停止工作。
我需要做什么才能保留对我的 VPC 的远程访问,但不让客户端重定向其网关?我真的很难理解 OpenVPN 文档。我没有找到关于如何设置简单远程访问 VPN 的简单示例,但也许它在那里,我因为缺乏这方面的经验而错过了它。
配置:
server.conf
:
注意:注释掉并push "redirect-gateway def1"
不能解决问题。
dev tun-udp-1194
server 10.9.80.0 255.255.240.0
proto udp
port 1194
ca /etc/openvpn/pki/ca.crt
cert....
key ...
dh /etc/openvpn/pki/dh.pem
crl-verify /etc/openvpn/pki/crl.pem
#push "redirect-gateway def1"
route 172.31.0.0 255.255.0.0
# Fix for the Windows 10 DNS leak described here:
# https://community.openvpn.net/openvpn/ticket/605
push block-outside-dns
remote-cert-tls client
keepalive 10 120
tls-auth /etc/openvpn/pki/ta.key 0
cipher AES-256-CBC
tls-cipher TLS-DHE-DSS-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-DSS-WITH-AES-256-CBC-SHA256
auth SHA256
tls-version-min 1.2
comp-lzo
persist-key
persist-tun
verb 0
client.conf
:
注意,添加pull-filter ignore redirect-gateway
会完全破坏 VPN,我无法访问 VPC;注释掉则redirect-gateway def1
没有任何作用。
client
remote <my_ip> 1194 udp
# route all traffic through the VPN (comment out to prevent routing
# all traffic through the VPN, and retain your router's public IP, etc)
#redirect-gateway def1
# ignore any redirect-gateway configs pushed from the server; breaks the VPN
#pull-filter ignore redirect-gateway
dev tun
cipher AES-256-CBC
auth SHA256
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verify-x509-name "<dns_name>" name
tls-version-min 1.2
comp-lzo
key-direction 1
verb 3
这些是iptables
我通过此脚本在服务器上配置的规则:
#!/usr/bin/env bash
# Generated by ansible
# This script is used to configure iptables to work with OpenVPN on this host
# Allow connections to the VPN
/sbin/iptables -A INPUT -p udp --dport 1194 -j ACCEPT
# This rule is necessary for OpenVPN to work and forward IP packets
/sbin/iptables -t nat -A POSTROUTING -s 10.9.80.0/20 -o ens5 -j MASQUERADE
/sbin/iptables -A FORWARD -s 10.9.80.0/20 -j ACCEPT
# Allow SSH connections on the VPN
/sbin/iptables -A INPUT -p tcp -d 10.9.80.0/20 --dport 22 -j ACCEPT
输出如下。
root@ip-172-31-38-0:/etc/openvpn# iptables -n -L
链输入(策略接受)目标协议选择源目标
接受udp——0.0.0.0/0 0.0.0.0/0 udp dpt:1194接受tcp——0.0.0.0/0 10.9.80.0/20 tcp dpt:22
链转发(策略接受)目标协议选择源目标
接受全部 -- 10.9.80.0/20 0.0.0.0/0
链输出(策略接受)目标保护选择源目标
root@ip-172-31-38-0:/etc/openvpn# iptables -t nat -n -L
目标 保护 可选 源 目标
链输入(策略接受)目标保护选择源目标
链输出(策略接受)目标保护选择源目标
链 POSTROUTING(策略接受)目标协议选择源目标
MASQUERADE 全部 -- 10.9.80.0/20 0.0.0.0/0
如能以实际配置形式提供任何帮助,我们将不胜感激;谢谢。
答案1
总结就是“推送你想要的路线(和其他选项),不推送你不想要的路线”,其实仅此而已。
为了避免重定向所有流量,请不要按该
redirect-gateway
选项,因为这正是它所做的 - 它只是一条默认路由。如果删除该选项会破坏其他功能,并不一定意味着您需要该选项 - 相反,通常意味着缺少其他东西,而“重定向网关”选项仅仅弥补了缺失的部分。
具体来说,您当前的服务器配置才不是将 172.31.0.0/16 路由推送到客户端 - 它仍然只在服务器端,并且所有这些都只起作用,因为“redirect-gateway”弥补了缺少特定路由的问题。您需要使用
push "route ..."
该路由将该路由部署到客户端。与此相关,如果您发现自己正在使用“拉取过滤器”来阻止客户端拉取不需要的东西,那么请更改服务器配置以首先不推送该东西。