Vpn

兩個 AWS 實例之間的 Strongswan VPN 隧道無法連接

  • February 11, 2017

我正在嘗試在兩個執行 Ubuntu 14.04.2 LTS 的 Amazon AWS EC2 實例之間使用 StrongSwan 5.1.2 設置 VPN 隧道。在使用 StrongSwan 之前,我在 Amazon RedHat AMI 上使用了 open(libre)swan,效果很好。出於某種原因,我什至無法讓 IKE 在這里為 StrongSwan 工作。我三次檢查了我的 AWS 配置,一切看起來都不錯,所以肯定是 StrongSwan 配置有問題。

正如您將在下面看到的,我得到的錯誤是**“Error writing to socket: Invalid argument”**。我在網上看了,真的找不到解決辦法。我確信我的 strongswan ipsec.conf 配置不正確。

這是我正在使用的內容:

Instance #1: N.Virginia - 10.198.0.164 with public EIP 54.X.X.X
Instance #2: Oregon - 10.194.0.176 with public EIP 52.Y.Y.Y

(簡單)拓撲如下:

[ Instance #1 within N.Virginia VPC <-> Public internet <-> Instance #2 within Oregon VPC ]

我驗證了以下 AWS 配置是正確的:

Security groups permit all
IP information is correct
Src/Dest disabled on both instances
ACLs permit all
routes are present and correct (route to 10.x will point to that local instance in order to be routed out to the VPN tunnel)

下面是**/etc/ipsec.conf** (這是來自俄勒岡州,但在 N.Virginia 實例上是相同的,除了左|右值顛倒了)

config setup
       charondebug="dmn 2, mgr 2, ike 2, chd 2, job 2, cfg 2, knl 2, net 2, enc 2, lib 2"
conn aws1oexternal-aws1nvexternal
       left=52.Y.Y.Y (EIP)
       leftsubnet=10.194.0.0/16
       right=54.X.X.X (EIP)
       rightsubnet=10.198.0.0/16
       auto=start
       authby=secret
       type=tunnel
       mobike=no
       dpdaction=restart

下面是 /etc/ipsec.secrets *(顯然,對於其他實例相反):

54.X.X.X 52.Y.Y.Y : PSK "Key_inserted_here"

下面是 /etc/strongswan.conf:

charon {
       load_modular = yes
       plugins {
               include strongswan.d/charon/*.conf
       }
}

下面是/etc/sysctl.conf:

net.ipv4.ip_forward=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

這是 /var/log/syslog 的調試輸出這裡的問題似乎是“錯誤寫入套接字:無效參數;在我嘗試了一切之後,我繼續得到同樣的錯誤

Jun 17 17:34:48 ip-10-198-0-164 charon: 13[IKE] retransmit 5 of request with message ID 0
Jun 17 17:34:48 ip-10-198-0-164 charon: 13[NET] sending packet: from 54.X.X.X[500] to 52.Y.Y.Y[500] (1212 bytes)
Jun 17 17:34:48 ip-10-198-0-164 charon: 03[JOB] next event in 75s 581ms, waiting]
Jun 17 17:34:48 ip-10-198-0-164 charon: 16[NET] sending packet: from 54.X.X.X[500] to 52.Y.Y.Y[500]
Jun 17 17:34:48 ip-10-198-0-164 charon: 13[MGR] checkin IKE_SA aws1vexternal-aws1oexternal[1]
Jun 17 17:34:48 ip-10-198-0-164 charon: 13[MGR] check-in of IKE_SA successful.
Jun 17 17:34:48 ip-10-198-0-164 charon: 16[NET] error writing to socket: Invalid argument
Jun 17 17:36:04 ip-10-198-0-164 charon: 03[JOB] got event, queuing job for execution
Jun 17 17:36:04 ip-10-198-0-164 charon: 03[JOB] no events, waiting
Jun 17 17:36:04 ip-10-198-0-164 charon: 08[MGR] checkout IKE_SA
Jun 17 17:36:04 ip-10-198-0-164 charon: 08[MGR] IKE_SA aws1vexternal-aws1oexternal[1] successfully checked out
Jun 17 17:36:04 ip-10-198-0-164 charon: 08[IKE] giving up after 5 retransmits
Jun 17 17:36:04 ip-10-198-0-164 charon: 08[IKE] establishing IKE_SA failed, peer not responding
Jun 17 17:36:04 ip-10-198-0-164 charon: 08[MGR] checkin and destroy IKE_SA aws1vexternal-aws1oexternal[1]
Jun 17 17:36:04 ip-10-198-0-164 charon: 08[IKE] IKE_SA aws1vexternal-aws1oexternal[1] state change: CONNECTING => DESTROYING
Jun 17 17:36:04 ip-10-198-0-164 charon: 08[MGR] check-in and destroy of IKE_SA successful

以下是我迄今為止嘗試過的:

  1. 已驗證的第 3 層

2)重啟機器

  1. 嘗試添加 leftid=

  2. 嘗試進行 ipsec update 然後 ipsec restart

  3. 嘗試在 confif 設置下添加 nat_traversal=yes(請注意,這無關緊要,因為 ipsec statusall 使用 IKEv2 驗證,根據文件自動使用 nat_traversal)

  4. 嘗試省略 virtual_private <– 根據 AWS openswan 文件使用,因此我將其包含在 strongswan 配置中。

  5. 嘗試在 /etc/sysctl.conf 中禁用 net.ipv4.conf.all.send_redirects = 0 和 net.ipv4.conf.all.accept_redirects = 0

  6. 嘗試使用私有 IP 而不是 EIP。我不再收到套接字錯誤,但是顯然這兩個 IP 無法相互通信以對等…

  7. 嘗試將此添加到 strongswan.conf: load = aes des sha1 sha2 md5 gmp random nonce hmac stroke kernel-netlink socket-default updown

  8. 嘗試使用leftfirewall=yes,沒用

請幫忙!謝謝!

編輯#1:

邁克爾的回復清除了原來的問題,但是我有一個與路由相關的新問題。兩個 VPN 實例都無法相互 ping 通。此外,當我嘗試從任一子網中的隨機實例 ping 到另一個隨機實例或遠端 VPN 實例時,我得到以下 ping 響應:

root@ip-10-194-0-80:~# ping 10.198.0.164
PING 10.198.0.164 (10.198.0.164) 56(84) bytes of data.
From 10.194.0.176: icmp_seq=1 Redirect Host(New nexthop: 10.194.0.176)
From 10.194.0.176: icmp_seq=2 Redirect Host(New nexthop: 10.194.0.176)
From 10.194.0.176: icmp_seq=3 Redirect Host(New nexthop: 10.194.0.176)
From 10.194.0.176: icmp_seq=4 Redirect Host(New nexthop: 10.194.0.176)

顯然,這一定是兩個 VPN 實例之間的路由問題(很可能是由於 strongswan 配置或實例路由表),因為俄勒岡子網中的 10.194.0.80 主機能夠接收來自俄勒岡 VPN 實例的響應。路由表 + 實例上的跟踪路由:

root@ip-10-194-0-80:~# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.194.0.1      0.0.0.0         UG        0 0          0 eth0
10.194.0.0      0.0.0.0         255.255.255.0   U         0 0          0 eth0

root@ip-10-194-0-80:~# traceroute 10.198.0.164
traceroute to 10.198.0.164 (10.198.0.164), 30 hops max, 60 byte packets
1  10.194.0.176 (10.194.0.176)  0.441 ms  0.425 ms  0.409 ms^C

當我使用 openswan 時,它不需要我對每個實例的路由表進行任何手動修改。

這是 Oregon VPN 實例的路由表:

root@ip-10-194-0-176:~# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.194.0.1      0.0.0.0         UG        0 0          0 eth0
10.194.0.0      0.0.0.0         255.255.255.0   U         0 0          0 eth0

我有點難過。

編輯#2:

看起來 VPN 實例之間的路由可能不是問題:/var/log/syslog 顯示從一個 VPN 實例公共 IP 接收到另一個 VPN 實例的數據包

Jun 23 19:57:49 ip-10-194-0-176 charon: 10[NET] received packet: from 54.X.X.X[4500] to 10.194.0.176[4500] (76 bytes)

看起來這是與兒童安全協會有關的問題:

aws1oexternal-aws1nvexternal:   child:  10.194.0.0/16 === 10.198.0.0/16 TUNNEL, dpdaction=restart
Security Associations (1 up, 0 **connecting**):

/var/log/syslog:

Jun 23 19:52:19 ip-10-194-0-176 charon: 02[IKE] failed to establish CHILD_SA, keeping IKE_SA
Jun 23 19:52:48 ip-10-194-0-176 charon: 11[IKE] queueing CHILD_CREATE task
Jun 23 19:52:48 ip-10-194-0-176 charon: 11[IKE]   activating CHILD_CREATE task
Jun 23 19:52:48 ip-10-194-0-176 charon: 06[IKE] establishing CHILD_SA aws1oexternal-aws1nvexternal
Jun 23 19:52:48 ip-10-194-0-176 charon: 10[IKE] received FAILED_CP_REQUIRED notify, no CHILD_SA built
Jun 23 19:52:48 ip-10-194-0-176 charon: 10[IKE] failed to establish CHILD_SA, keeping IKE_SA
Jun 23 19:52:49 ip-10-194-0-176 charon: 14[CFG] looking for a child config for 10.194.0.0/16 === 10.198.0.0/16 
Jun 23 19:52:49 ip-10-194-0-176 charon: 14[CFG] found matching child config "aws1oexternal-aws1nvexternal" with prio 10
Jun 23 19:52:49 ip-10-194-0-176 charon: 14[IKE] configuration payload negotiation failed, no CHILD_SA built
Jun 23 19:52:49 ip-10-194-0-176 charon: 14[IKE] failed to establish CHILD_SA, keeping IKE_SA

編輯#3:問題已解決(嗯,實際上請參見下面的編輯#4…)*

問題已解決。

  1. 我沒有正確遵循 Michael 的配置說明。我還一起配置了 rightsourceip 和 leftsourceip,從而使兩個實例都認為它們都是發起者。我確保一個是發起者,一個是請求者;這解決了 IKE 問題。

2)我發現我還必須明確設置 esp 參數。即使已經有預設值(aes128-sha1,3des-sha1),仍然必須設置 esp 參數,以便實例知道使用 esp OR ah(但不能同時使用兩者)。我最終使用了 aes128-sha1-modp2048。

希望這篇文章能幫助下一個 linux 新手設置它!

乾杯!

編輯#4:問題(不是真的)解決了

在對與 strongswan 相關的單獨問題進行故障排除時,我更改了“leftfirewall”參數,經過測試,沒有解決我的單獨問題,然後預先恢復到 orig 配置(註釋掉 leftfirewall)。然後我注意到我現在無法ping通隧道。在瘋狂了幾個小時試圖弄清楚發生了什麼之後,我註釋掉了 esp 參數以查看會發生什麼:我現在可以再次 PING Across the TUNNEL!<- 所以,有可能有一些 ipsec 鬼在我身上跑來跑去,並且 esp 參數並不是真正修復 TS_UNACCEPTABLE 錯誤的方法(儘管其他線上資源表明 esp 參數是修復…)

編輯#5:問題完全解決

我最終將所有內容都轉移到了測試環境中,並從頭開始。我使用最新版本(5.3.2)而不是Ubuntu repo(5.1.2)中的舊版本從原始碼安裝。這解決了我上面遇到的問題,並使用 netcat(很棒的工具!!)在 VPN 隧道上的多個子網之間驗證了第 7 層連接。

另外:不需要為 VPC 啟用 DNS 主機名(因為我被亞馬遜錯誤地誤導),僅供參考>

希望這一切都有幫助!!!!!!!

附加編輯 2/11/2017:

根據 JustEngland 的要求,複製下面的工作配置(省略某些細節以防止以任何方式辨識):

A面:

# ipsec.conf - strongSwan IPsec configuration file

# basic configuration
config setup
# Add connections here.
conn %default
ikelifetime= You choose; must match other side
keylife= You choose; must match other side
rekeymargin= You choose; must match other side
keyingtries=1
keyexchange= You choose; must match other side
authby=secret
mobike=no

conn side-a
left=10.198.0.124
leftsubnet=10.198.0.0/16
leftid=54.y.y.y
leftsourceip=10.198.0.124
right=52.x.x.x
rightsubnet=10.194.0.0/16
auto=start
type=tunnel
# Add connections here.


root@x:~# cat /etc/ipsec.secrets 
A.A.A.A B.B.B.B : PSK "Your Password"

B面:

# ipsec.conf - strongSwan IPsec configuration file

# basic configuration
config setup

conn %default
ikelifetime= You choose; must match other side
keylife= You choose; must match other side
rekeymargin= You choose; must match other side
keyingtries=1
keyexchange= You choose; must match other side
authby=secret
mobike=no

conn side-b
left=10.194.0.129
leftsubnet=10.194.0.0/16
leftid=52.x.x.x
right=54.y.y.y
rightsubnet=10.198.0.0/16
rightsourceip=10.198.0.124
auto=start
type=tunnel

root@x:~# cat /etc/ipsec.secrets 
B.B.B.B A.A.A.A : PSK "Your Password"

在 VPC 中,實例的公網 IP 地址永遠不會綁定到實例的堆棧,因此您必須同時配置內部私有地址和外部公有地址。無效參數可能是由於嘗試直接從您的實例不知道的公共 IP 地址獲取流量引起的。

left=10.10.10.10         # instance private IP of local system
leftsourceip=10.10.10.10 # instance private IP of local system
leftid=203.x.x.x         # elastic IP of local system
leftsubnet=10.x.x.x/xx

rightsubnet=10.x.x.x/xx
right=198.x.x.x          # elastic IP of remote system

引用自:https://serverfault.com/questions/699741