Iptables

使用網關主機通過 IPSec 隧道路由流量

  • October 11, 2021

考慮到strongswan wiki,這似乎是一個標準問題,但我無法讓它正常工作。

網路佈局

網路佈局

本地站點 ( clientand gateway) 在我的控制之下,遠端站點 ( remote gatewayand remote server) 不在。IPSec 隧道是一個拆分隧道,因此只有對10.10.0.0/16子網的請求通過 IPSec 隧道發送。

目標

我希望與client進行通信remote server,例如創建一個ssh或一個smb連接。

我已經做過的

  • 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 gateway``remote server``ping``client``ping google.com
  • 登錄後client,我可以,ping google.com我可以。隨著on the我看到from the正在通過.ping``gateway``tcpdump icmp``gateway``ping google.com``client``gateway

什麼不起作用,但

我不能ping從它remote serverclientIP 中獲取。

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:  [example@example.com] uses pre-shared key authentication
example-ipsec:   remote: [example@example.com] 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[example@example.com]...<public-ip-of-the-remote-gateway>[example@example.com]
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將fromgateway發送到. from不會更改輸出中的“字節” 。輸出中的“字節”對應於我從 發送到.ping``client``remote server``ping``gateway``ping``gateway``remote server

編輯:/etc/ipsec.confgateway

# /etc/ipsec.conf

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

由於連接使用虛擬 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 不是靜態分配的(例如基於客戶端的身份)並且可能會更改,您可以在虛擬 IP 傳入的自定義 updown 腳本(通過配置)中動態安裝/刪除 SNAT 規則。leftupdown``$PLUTO_MY_SOURCEIP

正如您最初所說,這是一個拆分隧道設置(遠端流量選擇器0.0.0.0/0實際上並未反映),您還可以添加例如-d 10.10.0.0/16到 SNAT 規則以僅處理髮送到該子網的數據包,其他流量不會得到 nat和隧道(您可以保留該MASQUERADE流量的規則)。這也可以通過 IPsec 策略 ( rightsubnet=10.10.0.0/16) 強制執行,然後您可以在$PLUTO_PEER_CLIENTupdown 腳本中使用該策略。

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