使用網關主機通過 IPSec 隧道路由流量
考慮到strongswan wiki,這似乎是一個標準問題,但我無法讓它正常工作。
網路佈局
本地站點 (
client
andgateway
) 在我的控制之下,遠端站點 (remote gateway
andremote 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 server
的client
IP 中獲取。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 statusall
在gateway
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.conf
在gateway
:# /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_CLIENT
updown 腳本中使用該策略。