前言
在文章打通回家之路:OpenVPN,你的企业网络万能钥匙(一), 介绍了如何搭建OpenVPN服务器来创建安全的远程访问通道,由于篇幅原因,没有写关于 iptables 的内容, 今天,我们就深入探讨这个同样重要的主题------iptables,它是Linux系统中强大的防火墙工具,对于保障OpenVPN服务器和整个网络的安全至关重要。
为什么需要iptables?
虽然已经成功部署了OpenVPN,但如果没有适当的防火墙配置,网络仍然可能面临安全风险。iptables 可以帮助我们:
- 控制进出OpenVPN服务器的网络流量
- 保护内部网络不受未授权访问
- 实现网络地址转换(NAT)功能
- 防止各种网络攻击
iptables基础概念
先来说说 iptables 的几个核心概念:
- 表(Tables) :filter(过滤)、nat(网络地址转换)、mangle(数据包修改)
- 链(Chains) :INPUT(进入本机)、OUTPUT(从本机发出)、FORWARD(转发)
- 规则(Rules) :定义对数据包的具体操作
- 目标(Targets) :ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)
OpenVPN服务器的iptables配置
下面是典型的 OpenVPN 服务器 iptables 配置示例:
css
# 清除所有现有规则
iptables -F
iptables -X
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环接口
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接和相关的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH连接(根据实际情况修改端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许OpenVPN连接(默认端口1194)
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
# 启用IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 设置NAT规则,允许VPN客户端访问内部网络
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# 允许转发来自VPN网络的流量
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-s 10.8.0.0/24
:请确保这里的网段与您的OpenVPN服务器配置(server.conf
中的server
指令)分配的网段一致。-o eth0
:请确保eth0
是您的服务器连接内部网络或互联网的正确出口网卡。您可以使用ip a
命令查看服务器网卡。
配置详解
-
基本安全策略 :默认拒绝所有进入和转发的流量,只允许出去的流量
-
必要服务开放:
- 允许本地回环接口(lo)
- 允许已建立的连接
- 允许SSH远程管理
- 允许OpenVPN连接
-
网络地址转换(NAT):
- 启用IP转发功能
- 设置 MASQUERADE 规则,使 VPN 客户端能够通过服务器访问互联网和内部网络
-
转发规则:
- 允许来自VPN网络的转发请求
- 允许已建立连接的返回流量
保存iptables规则
配置完成后,需要保存规则以便重启后依然生效:
在Ubuntu系统上:
javascript
iptables-save > /etc/iptables/rules.v4
高级配置建议
-
限制连接频率 :防止暴力破解攻击
cssiptables -A INPUT -p udp --dport 1194 -m state --state NEW -m recent --set iptables -A INPUT -p udp --dport 1194 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
-
创建专用链 :提高规则管理效率
cssiptables -N OPENVPN_RULES iptables -A INPUT -p udp --dport 1194 -j OPENVPN_RULES iptables -A OPENVPN_RULES -m state --state NEW -m recent --set --name VPN iptables -A OPENVPN_RULES -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name VPN -j DROP iptables -A OPENVPN_RULES -j ACCEPT
-
日志记录 :记录被拒绝的连接尝试
bashiptables -A INPUT -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
检查 iptables 配置
-
查看所有过滤表规则:
iptables -L -n -v
-L
列出规则,-n
以数字形式显示IP和端口(更快),-v
显示详细信息(匹配的数据包数量)。 -
查看更详细的规则,包括默认策略:
iptables -S
-
查看 NAT 表规则 (负责IP伪装/端口转发):
iptables -t nat -L -n -v
-
查看VPN服务器路由表:
ip route
看是否有指向
tun0
设备或公司内网网段的路由。 -
检查IP转发是否开启:
bashcat /proc/sys/net/ipv4/ip_forward
输出为
1
表示已开启。
实战
OpenVPN服务器和基础的iptables规则已经配置好,现在有新的内部服务需要通过 VPN 访问,现在看看具体如何操作:
整个流程的核心思路是: 允许VPN客户端流量转发到内部网络,并且确保返回的流量也能正确路由回来。
以下是具体的操作步骤:
-
备份当前iptables配置:
javascriptiptables-save > /etc/iptables/rules.v4.bak
-
添加针对新内部服务的精确转发规则(可选但推荐)
虽然上面的通用规则可能已经能让 VPN 客户端访问整个内部网络,但从安全角度(最小权限原则 )出发,最好只开放特定的服务。
假设内部服务情况如下:
- 内部服务器IP:
192.168.1.100
- 服务端口:
8080
(例如一个Web服务) - OpenVPN网络接口:
tun0
- 内部网络接口:
eth0
可以添加更精确的 FORWARD 规则来代替或补充那条允许整个10.8.0.0/24
网段的规则:
css
# 允许VPN客户端访问内部服务器 192.168.1.100 的8080端口
iptables -A FORWARD -i tun0 -o eth0 -d 192.168.1.100 -p tcp --dport 8080 -m state --state NEW -j ACCEPT
# 允许返回流量(通常上面的RELATED,ESTABLISHED规则已处理,此条为明确说明)
iptables -A FORWARD -i eth0 -o tun0 -s 192.168.1.100 -p tcp --sport 8080 -j ACCEPT
参数解释:
-i tun0
:数据包从tun0
(VPN虚拟网卡)进入服务器。-o eth0
:数据包从eth0
(连接内部网络的物理网卡)出去。-d 192.168.1.100
:目标地址是内部服务器。-p tcp --dport 8080
:协议是TCP,目标端口是8080。-m state --state NEW
:匹配新的连接请求。- 第二条规则是反向的,允许内部服务器返回的响应数据包通过。
- 保存规则并测试
-
保存iptables规则 (非常重要,否则重启后规则会丢失):
- Ubuntu/Debian:
sudo netfilter-persistent save
- Ubuntu/Debian:
-
测试连接:
-
从一个OpenVPN客户端执行:
ping 192.168.1.100
(如果能ping通,说明基础网络是通的)。 -
使用
telnet
或curl
测试具体服务:csharptelnet 192.168.1.100 8080 # 或 curl http://192.168.1.100:8080
-
最后
通过合理配置iptables,我们可以为 OpenVPN 服务器提供多层保护,确保只有授权的流量能够通过 VPN 通道。
要让VPN访问内部服务,关键在于:
- 确认OpenVPN服务器上已配置MASQUERADE和基础的FORWARD规则。
- (推荐)添加精确的FORWARD规则 ,只开放需要的服务端口,增强安全性。
- 确保内部网络的路由能让内部服务将响应包发回给OpenVPN服务器。
- 检查内部服务自身的防火墙 ,允许来自OpenVPN服务器的流量。
- 保存iptables规则并测试。