我有一台 CentOS 6.64 位机器,上面安装了 OpenVPN。
我希望在内部设置 OpenVPN 作为 VPN 来替代 QuickVPN(它很糟糕、很脆弱,并且在 Windows 8.x 上随机运行,甚至不再受思科支持)。
使用 OpenVPN 连接时,我无法访问互联网。我已设置以下 iptable 规则集:
iptables -t -nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
我以 192.168.2.6 的身份连接
另外,有没有办法将 OpenVPN 设置为使用 192.168.2.10 上的 DHCP/DNS 服务器?
服务器配置:
cat /etc/openvpn/server.conf
port 1194 #- port
proto udp #- protocol
dev tun
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
reneg-sec 0
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so /etc/pam.d/login #- Comment this line if you are using FreeRADIUS
#plugin /etc/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf #- Uncomment this line if you are using FreeRADIUS
client-cert-not-required
username-as-common-name
server 192.168.2.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 192.168.2.10"
push "dhcp-option DNS 8.8.8.8"
push "route 0.0.0.0 255.255.255.255 192.168.2.254"
keepalive 5 30
comp-lzo
persist-key
persist-tun
status 1194.log
verb 3
答案1
联网
看起来您正在将客户端分配到与主网络相同的子网。当您将tun
其用作设备时,您的服务器会为每个客户端分配一个 /30 块。
tap
我认为您的一些编号选择是由您使用设备(桥接器)而不是 来设置 OpenVPN 服务器的方式定义的。在我的家庭网络经验中,使用设备比使用(桥接器)设备tun
的性能更好,尽管我没有任何数字来支持这种感觉。tun
tap
如果您将server
指令更改为server 192.168.3.0 255.255.255.0
,则您的服务器除了正常的 192.168.2._ 地址外,还将拥有 192.168.3.1/24 的 IP。我不确定它为什么坚持使用 .1。它对我没有任何伤害,所以我没有继续更改它。当您的客户端计算机连接时,它将被赋予一个类似 192.168.3.6 的地址。
您无需为所推送的路由指定网关。只需指定网关push "route 192.168.1.0 255.255.255.0
即可。如果您总是要通过服务器重新定向客户端流量,那么这将是多余的。
确保您的机器上启用了路由:
echo 1 > /proc/sys/net/ipv4/ip_forward
为了使此更改在重新启动后保持不变,请打开/etc/sysctl.conf
进行编辑并将值设置net.ipv4.ip_forward
为1。
当客户端机器尝试与互联网及其他网络通信时,它们将需要经过 中的 FORWARD 链iptables
。您可以使用它来精确调整 VPN 客户端对您的网络或互联网的访问权限。
DNS
至于 DNS,我只会在确保远程客户端可以连接后才将一个 DNS 服务器推送给它们。Windows 客户端应该可以立即读取该服务器,但对于 Linux,它需要调整配置文件以及一些支持脚本。
抓住我对另一个有关 Linux 上的 OpenVPN 和 DNS 的类似主题的回复(openvpn dns push 后 NetworkManager 未更改 /etc/resolv.conf):
为了连接到我的家庭网络(当时使用 Fedora 18),我使用了 GitHub 上 gronke 的脚本(https://github.com/gronke/OpenVPN-linux-push)来自动化更新过程。
为了使用这些脚本,我将以下内容添加到我的 OpenVPN 客户端文件中:
up /home/gadgeteering/tools/vpn/up.sh
down /home/gadgeteering/tools/vpn/down.sh
确保客户端有权限使用 运行这些脚本chmod
。
up.sh:
#! /bin/bash
DEV=$1
if [ ! -d /tmp/openvpn ]; then
mkdir /tmp/openvpn
fi
CACHE_NAMESERVER="/tmp/openvpn/$DEV.nameserver"
echo -n "" > $CACHE_NAMESERVER
dns=dns
for opt in ${!foreign_option_*}
do
eval "dns=\${$opt#dhcp-option DNS }"
if [[ $dns =~ [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]; then
if [ ! -f /etc/resolv.conf.default ]; then
cp /etc/resolv.conf /etc/resolv.conf.default
fi
cat /etc/resolv.conf | grep -v ^# | grep -v ^nameserver > /tmp/resolv.conf
echo "nameserver $dns" >> /tmp/resolv.conf
echo $dns >> $CACHE_NAMESERVER
cat /etc/resolv.conf | grep -v ^# | grep -v "nameserver $dns" | grep nameserver >> /tmp/resolv.conf
mv /tmp/resolv.conf /etc/resolv.conf
fi
done
下载.sh:
#! /bin/bash
DEV=$1
CACHE_NAMESERVER="/tmp/openvpn/$DEV.nameserver"
echo $CACHE_NAMESERVER
if [ -f $CACHE_NAMESERVER ]; then
for ns in `cat $CACHE_NAMESERVER`; do
echo "Removing $ns from /etc/resolv.conf"
cat /etc/resolv.conf | grep -v "nameserver $ns" > /tmp/resolv.conf
mv /tmp/resolv.conf /etc/resolv.conf
done
fi
答案2
你不需要桥梁,而且有了桥梁你就需要水龙头的支撑。
尝试将其设置为匹配您的网络,而不是 0.0.0.0
例如推“路由 192.168.0.0 255.255.255.0”
并检查你的 iptables 规则,我使用这个(192.168.150.0 是我的 VPN 子网)
iptables -I 输入 1 -p udp --dport 1194 -j 接受
iptables -I FORWARD 1 --源 192.168.150.0/24 -j 接受