打通回家之路:OpenVPN与iptables的完美协作(二)

前言

在文章打通回家之路:OpenVPN,你的企业网络万能钥匙(一), 介绍了如何搭建OpenVPN服务器来创建安全的远程访问通道,由于篇幅原因,没有写关于 iptables 的内容, 今天,我们就深入探讨这个同样重要的主题------iptables,它是Linux系统中强大的防火墙工具,对于保障OpenVPN服务器和整个网络的安全至关重要。

为什么需要iptables?

虽然已经成功部署了OpenVPN,但如果没有适当的防火墙配置,网络仍然可能面临安全风险。iptables 可以帮助我们:

  1. 控制进出OpenVPN服务器的网络流量
  2. 保护内部网络不受未授权访问
  3. 实现网络地址转换(NAT)功能
  4. 防止各种网络攻击

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命令查看服务器网卡。

配置详解

  1. 基本安全策略 :默认拒绝所有进入和转发的流量,只允许出去的流量

  2. 必要服务开放:

    • 允许本地回环接口(lo)
    • 允许已建立的连接
    • 允许SSH远程管理
    • 允许OpenVPN连接
  3. 网络地址转换(NAT):

    • 启用IP转发功能
    • 设置 MASQUERADE 规则,使 VPN 客户端能够通过服务器访问互联网和内部网络
  4. 转发规则:

    • 允许来自VPN网络的转发请求
    • 允许已建立连接的返回流量

保存iptables规则

配置完成后,需要保存规则以便重启后依然生效:

在Ubuntu系统上:

javascript 复制代码
iptables-save > /etc/iptables/rules.v4

高级配置建议

  1. 限制连接频率 :防止暴力破解攻击

    css 复制代码
    iptables -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
  2. 创建专用链 :提高规则管理效率

    css 复制代码
    iptables -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
  3. 日志记录 :记录被拒绝的连接尝试

    bash 复制代码
    iptables -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转发是否开启:

    bash 复制代码
    cat /proc/sys/net/ipv4/ip_forward

    输出为 1 表示已开启。

实战

OpenVPN服务器和基础的iptables规则已经配置好,现在有新的内部服务需要通过 VPN 访问,现在看看具体如何操作:

整个流程的核心思路是: 允许VPN客户端流量转发到内部网络,并且确保返回的流量也能正确路由回来。

以下是具体的操作步骤:

  1. 备份当前iptables配置:

    javascript 复制代码
    iptables-save > /etc/iptables/rules.v4.bak
  2. 添加针对新内部服务的精确转发规则(可选但推荐)

虽然上面的通用规则可能已经能让 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 :匹配新的连接请求。
  • 第二条规则是反向的,允许内部服务器返回的响应数据包通过。
  1. 保存规则并测试
  • 保存iptables规则 (非常重要,否则重启后规则会丢失):

    • Ubuntu/Debian: sudo netfilter-persistent save
  • 测试连接:

    • 从一个OpenVPN客户端执行: ping 192.168.1.100 (如果能ping通,说明基础网络是通的)。

    • 使用telnetcurl测试具体服务:

      csharp 复制代码
      telnet 192.168.1.100 8080
      # 或
      curl http://192.168.1.100:8080

最后

通过合理配置iptables,我们可以为 OpenVPN 服务器提供多层保护,确保只有授权的流量能够通过 VPN 通道。

要让VPN访问内部服务,关键在于:

  1. 确认OpenVPN服务器上已配置MASQUERADE和基础的FORWARD规则。
  2. (推荐)添加精确的FORWARD规则 ,只开放需要的服务端口,增强安全性。
  3. 确保内部网络的路由能让内部服务将响应包发回给OpenVPN服务器。
  4. 检查内部服务自身的防火墙 ,允许来自OpenVPN服务器的流量。
  5. 保存iptables规则并测试。
相关推荐
diablobaal2 小时前
云计算学习100天-第28天
运维·服务器·学习
wuyang-ligerj2 小时前
BGP路由协议(一):基本概念
运维·网络·网络协议·智能路由器
阳光阴郁大boy3 小时前
前端实现Linux查询平台:打造高效运维工作流
linux·运维·服务器
像素之间3 小时前
nginx的诞生背景、核心优势、与 Apache 的对比
运维·学习·nginx
卓码软件测评3 小时前
【第三方网站运行环境测试:服务器配置(如Nginx/Apache)的WEB安全测试重点】
运维·服务器·前端·网络协议·nginx·web安全·apache
SRE工程师4 小时前
Docker的端口映射问题(庖丁解牛)
运维·docker·容器
key_Go4 小时前
02.<<设备登录管理:掌握华为网络设备的本地与远程登录技巧>>
运维·服务器·网络·华为
Aurora-silas5 小时前
Docker 入门指南:从基础概念到常见命令及高级工具详解
运维·docker·容器
无聊的HZ5 小时前
docker常用命令有哪些
运维·docker·容器