公司有多云环境,想要一条专线?或者公司其它跨物理地区办公,想要实现可以访问彼此内网?那么本文应该很适合你。
概述
专线,传统意义上的理解,就是拉一条专属线路,连接位于不同物理地区的设施。在网络中,有网络专线,需要向运营商申请购买。 价格不菲。
现状:由于目前大多数互联网公司的服务器集群多位于公有云之上,不管是在GCP、AWS、AlibabaCloud,还有一部分企业有自己的机房, 自己来维护管理云服务器。想象一下,如果你使用了多个公有云服务,或者一部分设施在云上,一部分在私有机房,如何打通这两处或者说 多地之间的网络呢?
解决方案
:
- 申请物理专线;
- 购买云服务商提供的VPN网关服务。
- 自建
下面就说下如何自己建立条虚拟专线网络。
要求
- 公有云 1台有外网IP的云主机(简称 A地区)
- 私有云内部 1台有外网IP的主机(简称 B地区)
- 系统centos/ubuntu,理论上支持所以linux发行版(raspberry pi上我试验过也可以哈)
- 网络防火墙之间需放行端口 UDP500 UDP4500
网络拓扑图
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
中途遇到的问题列表
- 问题1. 两端成功建立了连接,B地 可以ping通A地主机,但A却无法ping通B提示:
Destination Host Prohibite
,另外在B地抓包,却看到了A地主机发来的icmp包,却没有reply的包。怀疑是防火墙问题。
# 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条规则。最后两边都通了。完美😄
总结
调试过程中,尽量日志要详细一点!!! 建议先看服务器日志,再看客户端日志。