在 OpenWrt 路由器上保护 OpenVPN 的想法

在 OpenWrt 路由器上保护 OpenVPN 的想法

我在 OpenWrt 10.03 路由器的端口 1194 上放置了一个 OpenVPN 服务器:

echo "nameserver 8.8.8.8" > /etc/resolv.conf; opkg update; opkg install luci-app-openvpn openvpn openssl-util openssh-sftp-server ntpd
vim /etc/ssl/openssl.cnf # modify a few lines
[ CA_default ]
dir             = /etc/openvpn
new_certs_dir   = $dir/certs
certificate = $dir/ca.crt
private_key = $dir/ca.key

touch /etc/openvpn/index.txt; touch /etc/openvpn/serial; echo 01 > /etc/openvpn/serial
openssl req -nodes -new -x509 -keyout /etc/openvpn/ca.key -out /etc/openvpn/ca.crt -days 3650 # give a common name, like: vpnserver
openvpn --genkey --secret /etc/openvpn/ta.key
openssl req -nodes -new -keyout /etc/openvpn/server.key -out /etc/openvpn/server.csr # give a common name, like: vpnserver
mkdir -p /etc/openvpn/certs; mkdir -p /etc/openvpn/private
openssl ca -out /etc/openvpn/server.crt -in /etc/openvpn/server.csr
time openssl dhparam -out /etc/openvpn/dh1024.pem 1024 # it could take 10 minutes!

# generate certs for clients [X = client number]
openssl req -nodes -new -keyout /etc/openvpn/clientX.key -out /etc/openvpn/clientX.csr # give a common name! it will be the user name
openssl ca -out /etc/openvpn/clientX.crt -in /etc/openvpn/clientX.csr
# e.g.: 
openssl req -nodes -new -keyout /etc/openvpn/client1.key -out /etc/openvpn/client1.csr # give a common name! it will be the user name
openssl ca -out /etc/openvpn/client1.crt -in /etc/openvpn/client1.csr

vim /etc/config/openvpn
config 'openvpn' 'openvpn_server'
    option 'enable' '1'
    option 'port' '1194'
    option 'proto' 'udp'
    option 'dev' 'tap'
    option 'ca' '/etc/openvpn/ca.crt'
    option 'cert' '/etc/openvpn/server.crt'
    option 'key' '/etc/openvpn/server.key'
    option 'tls_auth' '/etc/openvpn/ta.key 0' # server: 0
    option 'dh' '/etc/openvpn/dh1024.pem'
    option 'comp_lzo' '1'
    option 'server' '10.20.30.0 255.255.255.0'
    option 'keepalive' '10 120'
    option 'persist_key' '1'
    option 'persist_tun' '1'
    option 'mute' '20'
    option 'verb' '3'
    option 'client_to_client' '1'
    list 'push' 'dhcp-option DNS 10.20.30.1'
/etc/init.d/openvpn enable
/etc/init.d/openvpn start
ifconfig -a | less
ping 10.20.30.1

# here comes the firewall part
vim /etc/config/firewall # modify it
config 'include'
    option 'path' '/etc/firewall.user'

config 'redirect'
    option 'src' 'wan'
    option 'proto' 'udp'
    option 'src_dport' '1194'
    option 'dest_port' '1194'
    option '_name' 'OpenVPN'

vim /etc/firewall.user # modify it
iptables -t nat -A prerouting_rule -i $WAN -p udp --dport 1194 -j ACCEPT
iptables -A input_rule -i $WAN -p udp --dport 1194 -j ACCEPT
iptables -A forwarding_rule -i tap+ -o br-lan -j ACCEPT
iptables -A forwarding_rule -i br-lan -o tap+ -j ACCEPT
iptables -A input_rule -i tap+ -j ACCEPT
iptables -A output_rule -o tap -j ACCEPT

/etc/init.d/firewall restart

# tar the files that goes to the client1
mkdir -p /root/client1
cp /etc/openvpn/ca.crt /root/client1/; cp /etc/openvpn/client1.crt /root/client1/; cp /etc/openvpn/client1.key /root/client1/; cp /etc/openvpn/ta.key /root/client1/
cd /root/; tar -cf client1.tar client1

# configure the client
# extract the client1.tar's content to "~/.cert" on the clients pc
# if you're using e.g.: Fedora/SELinux, then
restorecon -Rv ~/.cert*
# then: 
# ca.crt: the ca certificate
# client1.crt: the users certificate
# client1.key: the users private key
# ta.key: tls authentication [1]

我可以(在服务器端)做什么来提高 OpenVPN 服务器的安全性?以下是我的一些想法:

  1. 我将sed 's/1194/50000/'端口号设置为更高的端口号,以使端口扫描仪更难找到
  2. iptables?我应该只允许我在现实中使用的IP范围[在输入链上]? +只允许我的笔记本电脑的MAC地址
  3. 如果我不使用路由器(例如:当我睡觉时),我只需将其关闭。

我有什么遗漏的吗?从ps命令中我可以看到OpenVPN是由root运行的,这是不安全的。我还应该做什么来提高安全性?

答案1

OpenVPN 被设计为安全的。它只允许拥有您签名密钥的客户。最重要的是保证私钥的安全。始终在客户端上对其进行加密,并检查服务器上密钥文件的权限。不要将 CA 私钥保留在不需要它们的服务器上。对其进行加密,将其放在随身碟上并对其进行保护。

端口扫描器可以毫无困难地在任何端口上找到服务器,但他们将无法使用它。如果您知道您只会从一组有限的 IP 地址中使用它,那么请务必使用 iptables 禁用其他所有功能。然而,大多数人倾向于在不同的位置使用它,例如使用笔记本电脑。您可以自动禁止尝试无效密钥的 IP,但像这样暴力破解 RSA 密钥无论如何都是不可行的。

如果密钥是安全的,那么最大的风险是 OpenVPN 实施中的一些错误,这使得它容易受到攻击。如果发生这种情况,攻击者可以使用 OpenVPN 服务器进程的权限运行任意代码。您可以通过不以 root 身份运行服务器来减少此类攻击的影响。将其添加到您的服务器配置中:

user nobody
group nobody

您的配置文件似乎使用与我的不同的语法,但应该支持类似的内容。您可以尝试内核的 grsecurity 补丁,但我不确定它是否适用于嵌入式系统,如果您不小心使其无法启动,那将非常糟糕。它使得任意代码执行错误更难被利用。

您还可以增加密钥大小。 1024 位密钥在不久的将来可能会变得容易破解(如果还没有的话)。确保不要使用 Debian 的 OpenSSL 生成它们。 :)

我个人认为MAC地址过滤是绝对没有用的。伪造很容易,有效的也很容易找到。使用 WPA2 CCMP 和 63 字节长的随机密钥,应该没问题。不要让人们随意插入电缆。

我知道路由器中可用的资源不多,但您可以尝试日志记录。我几乎可以肯定路由器上没有足够的空间,因此请登录到其他主机。 Syslog-ng 可以轻松做到这一点,我不知道将其安装在路由器上有多容易。

相关内容