通过网关主机的 IPSec 隧道路由流量

通过网关主机的 IPSec 隧道路由流量

考虑到strongswan 维基,这似乎是一个标准问题,但我无法让它正常工作。

网络布局

网络布局

本地站点(clientgateway)在我的控制之下,而远程站点(remote gatewayremote server)则不在我的控制之下。IPSec 隧道是分裂隧道这样只有对10.10.0.0/16子网的请求才会通过 IPSec 隧道发送。

目标

我希望 与client进行通信remote server,例如创建sshsmb连接。

我已经做了什么

  • gateway我已经在和之间建立了 IPSec 隧道remote gateway

  • 我已在以下位置启用了 IP 转发gateway

    sysctl net.ipv4.ip_forward=1
    
  • 我已经在上创建了 NAT gateway

    iptables -t nat -I POSTROUTING -m policy --pol ipsec --dir out -j ACCEPT
    iptables -t nat -A POSTROUTING -j MASQUERADE
    
  • 我已经client将流量路由到gateway

    ip route del default
    ip route add default via 192.168.144.4
                           # 192.168.144.4 is the gateway
    

什么有效

  • IPSec隧道已建立且稳定。
  • 当登录到 时gateway,我可以ping成功remote gatewayremote server。我也可以pingclient而且我可以ping google.com
  • 登录后client,我可以ping google.com并且可以pinggatewaytcpdump icmpgateway看到的ping google.com正在client通过gateway

尚不起作用

我无法通过其 IP来ping获取。remote serverclient

client$ ping -c 1 10.10.12.7
PING 10.10.12.7 (10.10.12.7): 56 data bytes

--- 10.10.12.7 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss

tcpdump上看gateway,似乎ping已发送,但未通过隧道转发:

gateway$ tcpdump icmp
13:19:18.122999 IP 192.168.144.7 > 10.10.12.7: ICMP echo request, id 15, seq 0, length 64
13:19:18.123038 IP gateway > 10.10.12.7: ICMP echo request, id 15, seq 0, length 64
13:19:18.127534 IP ac5.nue3.m-online.net > gateway: ICMP net 10.10.12.7 unreachable, length 36
13:19:18.127556 IP ac5.nue3.m-online.net > 192.168.144.7: ICMP net 10.10.12.7 unreachable, length 36

由于ac5.nue3.m-online.net是本地站点的互联网服务提供商,我认为数据包不是通过 IPSec 隧道路由的,而是通过 的互联网连接路由的gateway,当然,互联网连接无法到达remote server。 (如果我将 IPSec 隧道设为完整隧道而不是分割隧道,我会得到相同的结果。)

任何帮助或见解都将不胜感激!

编辑:ipsec statusallgateway

gateway > ipsec statusall
Status of IKE charon daemon (strongSwan 5.8.2, Linux 5.4.0-88-generic, x86_64):
  uptime: 7 minutes, since Oct 08 08:18:24 2021
  malloc: sbrk 3112960, mmap 0, used 1081456, free 2031504
  worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 4
  loaded plugins: charon test-vectors ldap pkcs11 tpm aesni aes rc2 sha2 sha1 md5 mgf1 rdrand random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl gcrypt af-alg fips-prf gmp curve25519 agent chapoly xcbc cmac hmac ctr ccm gcm ntru drbg curl attr kernel-netlink resolve socket-default connmark farp stroke updown eap-identity eap-aka eap-md5 eap-gtc eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth-generic xauth-eap xauth-pam tnc-tnccs dhcp lookip error-notify certexpire led addrblock unity counters
Listening IP addresses:
  192.168.144.4
Connections:
example-ipsec:  %any...vpn1.example.com  IKEv2, dpddelay=300s
example-ipsec:   local:  [[email protected]] uses pre-shared key authentication
example-ipsec:   remote: [[email protected]] uses pre-shared key authentication
example-ipsec:   child:  dynamic === 0.0.0.0/0 TUNNEL, dpdaction=clear
Security Associations (1 up, 0 connecting):
example-ipsec[1]: ESTABLISHED 7 minutes ago, 192.168.144.4[[email protected]]...<public-ip-of-the-remote-gateway>[[email protected]]
example-ipsec[1]: I: 9d7c74f670bbda86_i* c12b3b4a236b7018_r, pre-shared key reauthentication in 2 hours
example-ipsec[1]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
example-ipsec{1}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cf66ad72_i af3c9348_o
example-ipsec{1}:  AES_CBC_256/HMAC_SHA2_256_128, 442 bytes_i (4 pkts, 434s ago), 485 bytes_o (6 pkts, 433s ago), rekeying in 38 minutes
example-ipsec{1}:   10.10.102.235/32 === 0.0.0.0/0

这是在从 向发送失败后ipsec statusall上的 的输出。来自 的不会改变输出中的“字节”。输出中的“字节”对应于我从 发送到的。gatewaypingclientremote serverpinggatewaypinggatewayremote server

編輯:/etc/ipsec.confgateway

# /etc/ipsec.conf

conn example-ipsec
  left = %defaultroute
  leftsourceip = %config
  leftid = "[email protected]"
  right = vpn1.example.com
  rightid = "[email protected]"
  rightsubnet = 0.0.0.0/0
  leftfirewall = yes
  installpolicy = yes
  keyexchange = ikev2
  type = tunnel
  auto = start
  leftauth = psk
  rightauth = psk
  dpdaction = clear
  dpddelay = 300s

答案1

由于连接使用虚拟 IP 地址(leftsourceip=%config,这会导致10.10.102.235/32作为本地流量选择器),您必须将流量 NAT 到该地址,而不是通过获取的主机的物理地址MASQUERADE,以便匹配 IPsec 策略并隧道传输流量(-I将其插入顶部):

iptables -t nat -I POSTROUTING  -j SNAT --to-source 10.10.102.235

如果虚拟 IP 不是静态分配的(例如基于客户端的身份)且可能会发生变化,则可以在自定义 updown 脚本(通过 配置leftupdown)虚拟 IP 传递到其中$PLUTO_MY_SOURCEIP

正如您最初所说,这是一个分割隧道设置(远程流量选择器0.0.0.0/0实际上并未反映这一点),您还可以添加例如-d 10.10.0.0/16SNAT 规则以仅处理发往该子网的数据包,其他流量将不会被 NAT 和隧道化(您可以保留MASQUERADE该流量的规则)。这也可以通过 IPsec 策略()强制执行,然后您可以在 updown 脚本中rightsubnet=10.10.0.0/16输入该策略。$PLUTO_PEER_CLIENT

相关内容