OpenVPN 和路由以及 IPtables

OpenVPN 和路由以及 IPtables

目标:通过隧道访问内部网络设备并浏览网页。

192.168.2.x = internal network
192.168.3.x = openvpn server
192.168.2.111 = openvpn server on internal network

[root@openvpn ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.3.2     *               255.255.255.255 UH    0      0        0 tun0
192.168.3.0     192.168.3.2     255.255.255.0   UG    0      0        0 tun0
192.168.2.0     *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
default         192.168.2.254   0.0.0.0         UG    0      0        0 eth0

[root@openvpn ~]# 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.3.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "route 192.168.2.0 255.255.255.0"
keepalive 5 30
comp-lzo
persist-key
persist-tun
status 1194.log
verb 3

client
dev tun
proto udp
remote 18.4.79.28 1194
resolv-retry infinite
nobind
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
persist-key
persist-tun
ca ca.crt
auth-user-pass
comp-lzo
reneg-sec 0
verb 3

我可以正常连接并访问 VPN 盒。但是,我无法浏览网页或访问其他本地网络设备。

我已关闭 IPTables。我是否需要 IP 表规则,还是我的路由已关闭?

我需要 192.168.3.0 来访问 192.168.2.0 :)

编辑:忘了提,我确实有这套;

net.ipv4.conf.default.forwarding=1

编辑:

我用的是这个:

[root@openvpn ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source <SERVERIP>
[root@openvpn ~]# iptables -I INPUT 1 -p udp --dport 1194 -j ACCEPT

我得到:

pinging 192.168.2.5
reply from 192.168.3.1 destination host unreachable

答案1

有两件事您需要检查并可能修复。

首先,您需要确保内核中已打开 IP 转发。IP 转发允许内核将数据包从一个接口传递到另一个接口。您可以使用以下命令检查这一点:

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

如果您看到的是0而不是1,则需要启用 IP 转发。最简单、最可靠的方法是将以下行添加到/etc/sysctl.conf(如果 已经有 条目,则修改它net.ipv4.ip_forward):

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

然后运行sysctl -p从该文件重新加载配置。

接下来,您需要配置IPtables对来自 VPN 的数据包进行网络地址转换 (NAT)。否则,当这些数据包发出时eth0,任何接收数据包的设备都不知道如何回复(它​​们没有192.168.3.0/24通过 VPN 服务器返回的路由)。您可以通过两种方式设置 NAT:静态 NAT (SNAT) 和伪装。当eth0预计出站接口(在您的情况下)上的 IP 地址不会更改时,建议使用 SNAT。伪装模式专为动态 IP 情况而设计,例如拨号或其他动态分配的地址配置(电缆调制解调器、DSL 等)。不过,两者的配置方式类似。

对于 SNAT,您可以添加一个 IPtables 规则,如下所示(注意,我使用这个是192.168.2.13因为我不知道您分配给 eth0 的 IP;您可能需要根据需要进行更改):

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.2.13

如果 eth0 上的 IP 地址不是静态的和可靠的,您可以使用 Masquerade,它看起来像:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

答案2

您确实需要一个 iptables 规则来让 VPN 客户端访问网络。

首先确保您的系统允许 NAT:

# Setup sysctl to enable NAT.
echo "# Allowing nat translation for VPN clients.
net.ipv4.conf.default.forwarding=1
net.ipv4.ip_forward=1" > "/etc/sysctl.d/openvpn.conf"
# load new sysctl config.
command sysctl -p "/etc/sysctl.d/openvpn.conf" > '/dev/null'

然后为 VPN 网络安装 NAT iptables 规则:

CURRENT_IP_RANGE="192.168.2"
command iptables -t nat -C POSTROUTING -s "${CURRENT_IP_RANGE}.0/24" \
                      -o 'eth0' -j MASQUERADE 2>'/dev/null' \
    || command iptables -t nat -A POSTROUTING -s "${CURRENT_IP_RANGE}.0/24" \
                       -o 'eth0' -j MASQUERADE

这些规则摘录自openvpn 工具,发表于在 Debian 上安装和设置 OpenVPN,我编写的 OpenVPN 管理脚本及操作方法。

还要确保有一个可从 VPN 客户端访问的 DNS 服务器。一个简单的答案是 OpenDNS (8.8.8.8)。一个更复杂但可能更好的解决方案是在服务器上安装 Bind(这是 openvpn-tools 使用的解决方案)。

openvpn-tools可能会引起您的兴趣,因为它为各种系统提供客户端配置导出并自动设置新的VPN网络。

编辑 Openvpn 2.x 服务器和 1.5 客户端

看:OpenVPN 发布说明

为了使 OpenVPN 2.0 与 1.5/1.6 版本通信,请将其放入 1.x 配置文件中:

tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
key-method 2

对于 TLS 使用,密钥方法 2 现在是默认方法。

答案3

我不确定你是否在使用 AWS,但请确保你禁用目标/源检查在您可能用来运行此操作的任何 AWS 实例上。

右键单击该实例,将鼠标悬停在网络上,然后那里应该有一个选项。

如果这对您没有帮助,希望它能够帮助其他人。

答案4

在您的情况下,您应该尝试使用标准路由,而不是使用 NAT(在内部网络和 openvpn 网络之间)。NAT 应该是您的最后选择。

“边缘路由器”(可能是您的 CPE)(位于您的内部网络和互联网的其余部分之间)需要将 VPN 节点(在 192.168.3.0/24 中)的数据包发送到开放服务器。您必须在边缘路由器/CPE 中添加如下路由:

# This is the Linux command, find the equivalent for your router:
ip route add 192.168.3.0/24 via 192.168.2.111

现在这个路由器可能是 FAI 提供的组合 xDSL 模型+路由器,所以您可能无法做到这一点。

如果您无法执行此操作(您无法在路由器上添加路由),并且如果您的边缘路由器认为您的内部网络是 192.168.0.0/16(或至少包含 192.168.3.0/34),您可以在 eth0 中为主网络中的 VPN 节点设置 ARP 代理:

echo 1 > /proc/sys/net/ipv4/conf/$xx/proxy_arp

x=eth0、x=tun0、x=all(我真的不知道你应该在哪个界面设置这个选项)。

这个想法是,您的 OpenVPN 服务器将为 VPN 中的节点回答 eth0 网络上的 ARP 请求。只有当您的路由器认为 192.168.3.0/24 位于内部网络中时,它才会起作用:否则,它不会在内部网络上发送 ARP 请求。

相关内容