Routing

已建立 Ipsec 隧道,但無法進行流量或 ping

  • July 29, 2019

我已經在這個網站和許多其他網站上搜尋了幾個小時,即使人們遇到了類似的問題,我也沒有找到一個可以解決我的問題的網站。

我正在嘗試使用 strongswan(通過 swanctl.conf)配置從我的電腦到伺服器上的虛擬機的 IPsec 隧道。我之前已經建立了 IPsec 連接,但來自另一台設備。我正在使用相同的配置(swanctl.conf),但其他東西似乎不適合。我的機器 (10.3.72.29) 獲得一個虛擬 ip (172.13.14.2) 並使用自己的虛擬 ip (192.168.122.2) 建立與伺服器設備 (10.3.218.62) 的連接

我目前的配置:

我的電腦(發起者)swanctl.conf:

connections {
  ch_vti0 {
     send_cert = always
     encap = yes
     vips = 0.0.0.0
     remote_addrs = 10.3.218.62
     local {
        round = 1
        id = 10.3.72.29
        auth = psk
        certs = 
      }
     remote {
        auth = psk
        id = 10.3.218.62
        certs = 
      }
     children {
       ch_vti0 { 
           mark_in = 42 
           mark_out = 42 
           remote_ts = 192.168.122.2/24
           local_ts = dynamic
           inactivity = 300s
           mode = tunnel
           esp_proposals =  3des-sha1-modp2048
           updown = /usr/local/etc/swanctl/updown.sh 0
        }
     }
     version = 1 
     proposals =  des-md5-modp768, des-md5-modp1024, des-md5-modp1536
  }  }
secrets {
       eap-xauth {
       eap_id = test1
       id = test1
       secret = password
  }
       xauth-local {
       id = test1
       secret = password
       }
       ike-sec {
       id = %any
       secret = test
       }
       ike-local {
       id = 10.3.72.29
       secret = test
       }
}

伺服器的虛擬機swanctl.conf:

connections {
  ch_vti0 {
     send_cert = always
     encap = yes
     pools = pools_users
     #aggressive = yes
     local {
        round = 1
        id = 10.3.218.62
        auth = psk
        certs = 
      }
     remote {
        auth = psk
        id = %any
        certs = 
      }
     children {
       ch_vti0 { 
           local_ts = 192.168.122.2/24
           inactivity = 120s
           mode = tunnel
           esp_proposals =  3des-sha1-modp2048
           updown = /usr/local/libexec/ipsec/_updown iptables
        }
     }
     version = 0
     proposals =  des-md5-modp768, des-md5-modp1024, des-md5-modp1536
  }  }
pools {
       pools_users {
               addrs = 172.13.14.2/24
       }
}
secrets {
       eap-xauth {
       eap_id = test1
       id = test1
       secret = password
  }
       xauth-local {
       id = test1
       secret = password
       }
       ike-sec {
       id = %any
       secret = test
       }
       ike-local {
       id = 10.3.218.62
       secret = test
       }
}

如果有人想知道 updown.sh 腳本創建 vti0 介面和路由

我的電腦上 ipsec statusall 的結果:

Listening IP addresses:
 10.3.72.29
 fdc8:c2cb:4586:cc11::8f00:5a9
 172.13.14.2
Connections:
    ch_vti0:  %any...10.3.218.62  IKEv1
    ch_vti0:   local:  [10.3.72.29] uses pre-shared key authentication
    ch_vti0:   remote: [10.3.218.62] uses pre-shared key authentication
    ch_vti0:   child:  dynamic === 192.168.122.0/24 TUNNEL
Security Associations (1 up, 0 connecting):
    ch_vti0[1]: ESTABLISHED 13 minutes ago, 10.3.72.29[10.3.72.29]...10.3.218.62[10.3.218.62]
    ch_vti0[1]: IKEv1 SPIs: 7fa996a60f87e923_i* 4faa8dbdd74a5927_r, rekeying in 3 hours
    ch_vti0[1]: IKE proposal: DES_CBC/HMAC_MD5_96/PRF_HMAC_MD5/MODP_768
    ch_vti0{1}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c393a4bb_i c392a387_o
    ch_vti0{1}:  3DES_CBC/HMAC_SHA1_96/MODP_2048, 65772 bytes_i (783 pkts, 0s ago), 0 bytes_o, rekeying in 42 minutes
    ch_vti0{1}:   172.13.14.2/32 === 192.168.122.0/24

伺服器的設備:

Listening IP addresses:
 192.168.122.2
 10.3.218.62
 fdc8:c2cb:4586:cc12::e49c:faf8
Connections:
    ch_vti0:  %any...%any  IKEv1/2
    ch_vti0:   local:  [10.3.218.62] uses pre-shared key authentication
    ch_vti0:   remote: [%any] uses pre-shared key authentication
    ch_vti0:   child:  192.168.122.0/24 === dynamic TUNNEL
Security Associations (1 up, 0 connecting):
    ch_vti0[1]: ESTABLISHED 14 minutes ago, 10.3.218.62[10.3.218.62]...10.3.72.29[10.3.72.29]
    ch_vti0[1]: IKEv1 SPIs: 7fa996a60f87e923_i 4faa8dbdd74a5927_r*, rekeying in 3 hours
    ch_vti0[1]: IKE proposal: DES_CBC/HMAC_MD5_96/PRF_HMAC_MD5/MODP_768
    ch_vti0{1}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c392a387_i c393a4bb_o
    ch_vti0{1}:  3DES_CBC/HMAC_SHA1_96/MODP_2048, 0 bytes_i, 68880 bytes_o (820 pkts, 0s ago), rekeying in 44 minutes
    ch_vti0{1}:   192.168.122.0/24 === 172.13.14.2/32

我的電腦上的路線:

root@malz:/usr/local/etc/swanctl# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.3.127.1      0.0.0.0         UG    100    0        0 enp2s0
10.3.0.0        0.0.0.0         255.255.0.0     U     100    0        0 enp2s0
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 vti0

伺服器設備上的路由:

root@server-automation-2:/etc/swanctl# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.3.127.1      0.0.0.0         UG    0      0        0 ens4
10.3.0.0        0.0.0.0         255.255.0.0     U     0      0        0 ens4
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 ens3

我已經允許 IPsec 使用的埠(500,4500,4500/udp,500/udp),嘗試禁用它們的防火牆,清除 iptables 並允許一切:

iptables -F
iptables -I INPUT -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

我還檢查了丟棄數據包的 sysctl 參數(尤其是關於 icmp 請求的那些)

如果我嘗試使用 tcpdump 擷取數據包,我可以看到我確實從伺服器的設備接收到它們(ping icmp 數據包),但我的電腦沒有響應

如果我嘗試發送數據包,伺服器的設備不會擷取它們,並且我的 PC 的 IPsec 介面 TX 錯誤數據包會增加。從 ifconfig:

vti0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1480
       inet 172.13.14.2  netmask 255.255.255.255  destination 172.13.14.2
       inet6 fe80::5efe:a03:481d  prefixlen 64  scopeid 0x20<link>
       tunnel   txqueuelen 1000  (IPIP Tunnel)
       RX packets 1063  bytes 89292 (89.2 KB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 0  bytes 0 (0.0 B)
       TX errors 57  dropped 0 overruns 0  carrier 57  collisions 0

總之,我已經在兩台機器之間建立了 ipsec 連接,但我無法弄清楚為什麼其中一台無法傳輸包並且不響應其他 ping。我相當肯定這一切的原因不是 ipsec 配置,因為我之前已經提到過我之前已經測試過它並且它可以使用完全相同的 conf 文件(不包括更改 ips)

如果有人能給我一個提示,我將不勝感激。

故障排除步驟(從下到上):

  1. 執行 tcpdump。您應該會看到清晰和加密的數據包 (ESP)。
  2. 檢查 ipsec 隧道兩端之間的 ip 連接。
  3. 檢查路由。預設情況下,strongswan 會將附加路由安裝到單獨的路由表中。執行ip -4 r ls table 220。調查輸出。要檢查實際路線,請使用該ip route get <dst>命令。不要使用該route -n命令 - 它會返回未完成的視圖。
  4. 檢查 和 的ip -s -s xfrm state list輸出ip -s -s -d xfrm policy list。它顯示了系統 SADB(安全關聯數據庫)和策略 DB。您的 vti 介面有一些運營商錯誤。vti 介面上的運營商錯誤意味著:
  • 沒有找到合適的 ipsec 策略。檢查ip x p get ...命令。
  • 沒有找到合適的路線。檢查ip route get ...命令。
  • 沒有找到合適的 SA。檢查ip x s ls命令。
  1. 檢查防火牆。iptables 命令預設使用該filter表,但還有其他表(raw、nat、mangle)。最好使用該iptables-save -c命令列出完整的規則集。更改 nat 規則後,使用conntrack -F命令清除 conntrack 表。ipsec 流量通過防火牆鏈兩次:一次以加密方式通過,另一次以明文方式通過。所以調查規則。您還可以插入NFLOG目標規則以使用tcpdump -ni nflog...命令擷取流量。

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