公司有多云环境,想要一条专线?或者公司其它跨物理地区办公,想要实现可以访问彼此内网?那么本文应该很适合你。

概述

专线,传统意义上的理解,就是拉一条专属线路,连接位于不同物理地区的设施。在网络中,有网络专线,需要向运营商申请购买。 价格不菲。

现状:由于目前大多数互联网公司的服务器集群多位于公有云之上,不管是在GCP、AWS、AlibabaCloud,还有一部分企业有自己的机房, 自己来维护管理云服务器。想象一下,如果你使用了多个公有云服务,或者一部分设施在云上,一部分在私有机房,如何打通这两处或者说 多地之间的网络呢?

解决方案

下面就说下如何自己建立条虚拟专线网络。

要求

网络拓扑图

A/B两地之间的网络结构:

网络拓扑

虚拟专线拓扑图

Tips:如上图,vpn主机是在两台 router之后,实际情况有一端是router内核本身支持(ipsec协议)、另一端是nat后的自建主机的。

安装

以下步骤划分为A、B安装,同一软件(strongSwan),不同配置。

A地区主机安装配置

1.安装 strongSwan软件,可参考本站相关文章如何使用Ansible快速建立一个基于strongSwan的VPN服务

2.修改配置文件 ipsec.conf, 内容如下:

config setup
  uniqueids = no
#  charondebug="all"
  charondebug="ike 2, knl 3, cfg 2"

conn a-to-b
  keyexchange=ikev1
  authby=secret
  type=tunnel
  left=%defaultroute
  leftid=1.1.1.1
  right=2.2.2.2
  leftsubnet=172.16.0.0/16
  rightsubnet=172.18.0.0/16
  ike=aes128-sha1-modp2048!
  esp=aes128-sha1-modp2048!
  keyingtries=0
  ikelifetime=1h
  lifetime=8h
  dpddelay=30
  dpdtimeout=120
  dpdaction=restart
  auto=route

针对几个配置选项注解下,详细可参考官网文档,或者本站其它相关文章: * right:对端路由器Public IP * rightsubnet:对端路由器后面的网段(又称兴趣流) * leftsubnet:本端的网段 * type:隧道类型

3.修改密钥认证文件/etc/ipsec.secret,在文件末尾添加一条secret记录

%any 2.2.2.2 : PSK "thisisatunnelpAsswWD"

4.重启服务

ipsec restart

B地区主机安装配置

1.安装 strongSwan软件,可参考本站相关文章如何使用Ansible快速建立一个基于strongSwan的VPN服务

2.修改配置文件 /etc/ipsec.conf(默认yum安装路径), 内容如下:

config setup
  uniqueids = no

conn b-to-a
  keyexchange=ikev1
  authby=secret
	left=%any
	right=2.2.2.2
	leftsubnet=172.18.0.0/16
	rightsubnet=172.16.0.0/16
	ike=aes128-sha1-modp2048!
	ikelifetime=28800s
	esp=aes128-sha1-modp2048!
	keylife=3600s
	rekeymargin=540s
	type=tunnel
	compress=no
	keyingtries=%forever
  auto=route

3.修改密钥认证文件/etc/ipsec.secret,在文件末尾添加一条secret记录

%any 1.1.1.1 : PSK "thisisatunnelpAsswWD"

4.重启服务

ipsec restart

AB两地联调检查测试

1.A地 使用ipsec 查看连接情况

a-to-b[65499]: ESTABLISHED 25 minutes ago, 1.1.1.1[1.1.1.1]...2.2.2.2[2.2.2.2]
a-to-b{1}:  INSTALLED, TUNNEL, ESP in UDP SPIs: cfc0bd72_i c69f89fd_o
a-to-b{1}:   172.16.0.0/16 === 172.18.0.0/16

2.B地 连接状态

Security Associations (1 up, 0 connecting):
ali-to-office[255]: ESTABLISHED 25 minutes ago, 172.18.1.222[2.2.2.2]...1.1.1.1[1.1.1.1]
ali-to-office{315}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c69f89fd_i cfc0bd72_o
ali-to-office{315}:   172.18.0.0/16 === 172.16.0.0/16

3.A地 ping B地区主机

# ping 172.18.1.164
PING 172.18.1.164 (172.18.1.164) 56(84) bytes of data.
64 bytes from 172.18.1.164: icmp_req=1 ttl=63 time=6.44 ms
64 bytes from 172.18.1.164: icmp_req=2 ttl=63 time=6.36 ms
# traceroute 172.18.1.164
traceroute to 172.18.1.164 (172.18.1.164), 30 hops max, 38 byte packets
 1  172.18.1.222 (172.18.1.222)  6.270 ms  6.163 ms  6.065 ms
 2  172.18.1.164 (172.18.1.164)  6.398 ms  6.253 ms  6.421 ms

4.B地 ping A地区主机

ping 172.16.193.21
PING 172.16.193.21 (172.16.193.21) 56(84) bytes of data.
64 bytes from 172.16.193.21: icmp_seq=1 ttl=63 time=9.73 ms

其它配置

如果你不是使用推荐的方式安装strongSwan,请参考下面的其它配置。

A地防火墙配置1: iptables配置(新增rules)

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p esp -j ACCEPT
iptables -A INPUT -i eth0 -p ah -j ACCEPT
iptables -A INPUT -i eth0 -p udp -m udp --sport 500 --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -m udp --sport 4500 --dport 4500 -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 172.18.0.0/16 -j ACCEPT
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited

iptables -A POSTROUTING -t nat -s 172.18.0.0/16 -d 172.16.0.0/16 -j MASQUERADE

B地防火墙配置2: iptables配置(新增rules)

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p esp -j ACCEPT
iptables -A INPUT -i eth0 -p ah -j ACCEPT
iptables -A INPUT -i eth0 -p udp -m udp --sport 500 --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -m udp --sport 4500 --dport 4500 -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 172.16.192.0/23 -d 172.18.0.0/16 -j ACCEPT
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited

iptables -A POSTROUTING -t nat -s 172.16.0.0/16 -d 172.18.0.0/16 -j MASQUERADE

系统内核网络转发设置:A/B都要设置!

sysctl -w net.ipv4.ip_no_pmtu_disc=1
sysctl -w net.ipv4.ip_forward=1

中途遇到的问题列表

# tcpdump -nni eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:46:17.149502 IP 172.16.193.21 > 172.18.1.164: ICMP echo request, id 31323, seq 84, length 64
17:46:19.155821 IP 172.16.193.21 > 172.18.1.164: ICMP echo request, id 31323, seq 86, length 64

尝试修改B地VPN主机上,把A地区的内网网段加入filter里并设置允许forward。即上面iptables配置里倒数第2条规则。最后两边都通了。完美😄

总结

调试过程中,尽量日志要详细一点!!! 建议先看服务器日志,再看客户端日志。