Linux下使用Strongswan和nginx搭建IPSec VPN

来源: DevOpSec公众号 作者: DevOpSec

背景及需求

在多机房之间联通或机房和办公区之间异构网络网络联通时,考虑到数据和网络安全,我们通常会搭建IPSec VPNsite-to-site通信。

下面我们来看一下需求场景:母公司自建IDC有网络设备可以搭建IPsec VPN隧道,子公司公有云没有网络设备

  1. 母公司访问子公司A服务http 18080端口

  2. 母公司访问子公司的B服务3306端口

方案

网络安全上:子公司侧部署一台Linux服务器,安装开源软件Strongswan,和母公司配置Site-To-Site IPSec VPN功能。

网络流量管控和数据审计上:使用nginx做流量控制转发,对流量做审计

架构

image

  1. Strongswannginx 部署在同一台机器上

  2. 母公司和子公司公网ip相互限制只允许对方ip访问

  3. 只暴露linux服务器ip的803306端口给母公司方案

技术栈

母公司网络设备:H3C FW

子公司: centos 7.9 VPN软件 Strongswan 5.5.3 nginx 1.20.1

安装

子公司侧,安装vpn软件和nginx

Strongswan 部署

1yum install epel-release 2yum install strongswan

nginx 部署

yum install nginx

配置

子公司侧的配置

Strongswan的配置

链接配置

cat /etc/strongswan/ipsec.conf

1conn h3c 2 keyexchange=ikev1 #使用Isakmp ikev1 3 auto=start #自动启动该连接 4 aggressive=yes #IPSEC 主动模式 5 #本端信息 6 left=公网ip A #Linux系统公网接口IP(公有云私有 ip 如 ucloud) 7 leftid=公网ip A #使用IP地址作为IPSEC设备ID 8 leftsubnet=10.10.10.10/32 #Linux站点侧要保护的子网,可以是该系统的接口IP, (对端能访问的 ip) 9 #对端信息 10 right=公网ip B #防火墙公网接口IP 11 rightid=公网ip B #使用IP地址作为IPSEC设备ID 12 rightsubnet=192.168.1.0/24 #防火墙侧要保护的子网 13 leftauth=psk #认证方式为预共享密钥 14 rightauth=psk #认证方式为预共享密钥 15 type=tunnel #IPSEC模式为隧道模式 16 ike=aes128-md5-modp2048 #IPSEC 第一阶段密钥参数 17 esp=aes128-sha1 #IPSEC 第二阶段加密参数
第一阶段秘钥

cat /etc/strongswan/ipsec.secrets

1##本端IP 对端IPPSK 预共享密钥 2公网ipB 公网ipB : PSK 90bc773ec2781568690648a30255639b
启动strongswan
strongswan start                                #启动strongswan
查看状态
strongswan status

如果日志里有如下信息

found 1 matching config, but none allows pre-shared key authentication using main mode

ipsec.conf 配置里aggressive=yes 主动模式注释掉

出现下面状态说明链接成功了

Security Associations (1 up, 0 connecting)即为链路已通。

nginx的配置

nginx 配置目录
1tree /apps/nginx/conf/ 2/apps/nginx/conf/ 3├── http 4│   └── A.conf 5├── stream 6│   └── B.conf 7├── nginx.conf
nginx.conf
1.... 2http { 3 ...... 4 include http/*.conf; 5 6} 7include stream/*.conf;
A服务的7层代理配置,A.conf
1upstream a_server { 2 server 10.10.10.11:18080; 3 4 check interval=3000 rise=2 fall=3 timeout=10000 type=http; 5 check_http_send "HEAD / HTTP/1.0\r\n\r\n"; 6 check_http_expect_alive http_2xx http_3xx http_4xx; 7} 8 9 10server { 11 listen 80; 12 server_name yourdomain.com ; 13 index index.html index.htm index.jsp;#设定访问的默认首页地址 14 15 16 17 #转发到tomcat 18 location / { 19 proxy_pass http://a_server;#转向A服务处理 20 proxy_set_header Host $host; 21 proxy_set_header X-Real-IP $remote_addr; 22 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 23 proxy_connect_timeout 660; 24 proxy_send_timeout 660; 25 proxy_read_timeout 660; 26 proxy_intercept_errors on; 27 28 } 29 30}
B服务4层的转发配置

cat B.conf

1#日志配置 2log_format log_format_tcp 'v1{|]$remote_addr:$remote_port{|]$protocol{|]$upstream_addr{|]$time_iso8601{|]$bytes_sent{|]$bytes_received{|]$session_time{|]$upstream_bytes_sent{|]$status{|]$upstream_bytes_received{|]$upstream_connect_time; 3 4access_log log/nginx/tcp-access.log log_format_tcp ; 5error_log log/nginx/tcp-error.log ; 6 7stream { 8 upstream b_server { 9 server 10.10.10.12:3306 max_fails=3 fail_timeout=5s; 10 } 11 server { 12 listen 3306; 13 proxy_connect_timeout 5s; # 与被代理服务器建立连接的超时时间为5s 14 proxy_timeout 10s; # 获取被代理服务器的响应最大超时时间为10s 15 proxy_next_upstream on; # 当被代理的服务器返回错误或超时时,将未返回响应的客户端连接请求传递给upstream中的下一个服务器 16 proxy_next_upstream_tries 3; # 转发尝试请求最多317 proxy_next_upstream_timeout 7200s; # 总尝试超时时间为2h 18 proxy_socket_keepalive on; # 开启SO_KEEPALIVE选项进行心跳检测 19 20 proxy_pass b_server; 21 } 22 23}
nginx 日志配置,用于审计

http 日志配置,cat nginx.conf

1http { 2 http { 3 ..... 4 5 log_format log_format 'v1{|]$remote_addr:$remote_port{|]$http_x_forwarded_for{|]$upstream_addr{|]$time_iso8601{|]$request_method{|]$server_name{|]$uri{|]$args{|]$status{|]$http_referer{|]$body_bytes_sent{|]$request_time{|]$upstream_response_time{|]$http_user_agent{|]$sent_http_location{|]$http_cookie'; 6 7 access_log logs/access.log log_format; 8}

tcp 日志配置,见B.conf

母公司侧配置

H3C FW 配置

IKE 配置

image

IPSec配置

image

对端ip配置

配置公网ip A 本地地址配置ip段:192.168.1.0/24 远端地址配置ip:10.10.10.10/32

总结

通过Strongswan可以在不依赖硬件的情况下做site-to-site IPSec VPN隧道,再结合nginx等代理软件,在各地职场、集团个公司之间或者在合作伙伴之间既能打通同异构网络,还能做到网络数据安全管控。欢迎关注DevOpSec,每周分享干货,我们一起进步。

点赞
收藏

评论区

加载中...

相关推荐

虚拟私有云的定义

虚拟私有云(VPC)是一个公共云计算资源的动态配置池,需要使用加密协议、隧道协议和其他安全程序,在民营企业和云服务提供商之间传输数据。一个VPC基本上把提供商的多租户架构变成单租户架构。在定义上类似虚拟专用网络(VPN)。一个VPN能够被用于在公共性网,例如互联网技术上根据专用型隧道施工传送数据,该隧道施工不可以键入未适度数据加密的数据信息。安全性的额外等

Fabric多通道网络实战

HyperledgerFabric支持在一组相同的机构之间的多通道部署,每个通道都相当于一个单独的区块链。Fabric的多通道特性不仅可以满足机构之间不同的数据共享需求,同时也可以提高整个Fabric网络的吞吐量。本文将演示如何使用HyperledgerFabric1.4.3搭建一个多通道的区块链网络、部署并访问链码。1、HyperledgerF

3.1 主流公有云介绍 3.2 阿里云ECS 3.3 登录云主机 3.4 升降级配置 3.5 安全组策略

3.1主流公有云介绍私有云:一般大企业才有资金能力搭建私有云搭建私有云的工具:openstack公有云:在配置低的情况下,推荐使用公有云,如果需要的配置非常高,比如256内存,CPU核数很多,那么费用就非常的昂贵,这个时候和传统的服务器比起来就没有传统服务器这么经济了。目前比较推荐阿里云阿里云

Docker实战——分布式Websocket服务

一、项目介绍我们很容易可以使用Springboot来搭建一个支持websocket的应用,用来实现基于HTML5的客户端之间进行消息的接收和推送。但是在实际应用的部署时,客户端和应用服务器之间总会用到Nginx或者Apache来做反向代理,来实现负载均衡。用Nginx举个例子来说,我们使用轮询的方式,将客户端的请求分发到后端3台w

Netty在Dubbo中的线程名称

在项目中,我们会使用RocketMQ和Dubbo.前者用于发送或消费消息,后者用于两个模块之间的接口调用.RocketMQ和Dubbo在它们的底层都使用Netty作为网络通信的框架.那么今天我们就来看一下,在Dubbo中,使用的Netty线程名称叫什么?环境和流程如下1.启动zookeeper2.一个简单的Dubbo提供者,并启动它

IPSec的链路和设备备份

链路备份的IPSecVPN和设备备份的IPSecVPN:首先实验的是链路备份的 IPSecVPN,下面是实验拓扑:!(https://oscimg.oschina.net/oscnet/80e2d36541434699906868d9fd0784e0d39.png)IP地址配置:R1(Branch):B