IPsec VPN 站點到站點:我應該如何在兩個站點上配置 ipsec.conf 文件以建立隧道?
我想做的是在我的網路和我朋友的網路之間創建一個站點到站點的 IPsec VPN。我們都有一個路由器,每個路由器上有兩台電腦,所有電腦都執行 Linux。所以我猜拓撲看起來像這樣
[myPC1 + myPC2]—myRouter—–internet—–hisRouter—[hisPC1 + hisPC2]
這兩款路由器都很便宜,所以它們沒有 OpenWRT 之類的東西。
所以配置——我想這應該在 Linux 的兩邊都完成。
到目前為止,我們已經嘗試使用 RSA 密鑰和 PSK 的 openSwan,但在命令之後
ipsec auto --up net-to-net
我們要麼收到錯誤“沒有名為 net-to-net 的連接”,要麼收到錯誤“我們無法通過此連接的任一端辨識自己”。
我猜我們配置 ipsec.conf 文件錯誤。有人可以解釋一下我們應該如何正確配置它來實現這個拓撲嗎?
編輯…
這裡有一些事實可以幫助你更好地理解我的情況。
這些都來自我們測試的 PSK 範例。
我的ifconfig:
eth0 Link encap:Ethernet HWaddr 00:0C:29:1B:F5:1C inet addr:192.168.1.78 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe1b:f51c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:829 errors:0 dropped:0 overruns:0 frame:0 TX packets:704 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1213737 (1.1 MiB) TX bytes:57876 (56.5 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:53 errors:0 dropped:0 overruns:0 frame:0 TX packets:53 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3664 (3.5 KiB) TX bytes:3664 (3.5 KiB)
他的 ifconfig
Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:4 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:240 (240.0 b) TX bytes:240 (240.0 b) p2p1 Link encap:Ethernet HWaddr 08:00:27:2A:F1:F5 inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe2a:f1f5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:21104 errors:0 dropped:0 overruns:0 frame:0 TX packets:12458 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:16079321 (15.3 MiB) TX bytes:1012204 (988.4 KiB)
ipsec.conf 文件,我們都使用了完全相同的文件,我們也將它放在 /etc/init.d
version 2.0 config setup protostack=netkey nat_traversal=yes #virtual_private= oe=off conn net-to-net authby=secret # Key exchange method left=212.251.112.115 # Public Internet IP address of the leftsubnet=10.0.2.0/24 # Subnet protected by the LEFT VPN device leftnexthop=%defaultroute # correct in many situations right=79.103.7.114 # Public Internet IP address of rightsubnet=192.168.1.0/24 # Subnet protected by the RIGHT VPN device rightnexthop=%defaultroute # correct in many situations auto=start # authorizes and starts this connection
我們還使用了完全相同的 ipsec.secrets,我們都將它們放在 /etc/init.d 中
212.251.112.115 79.103.7.114 : PSK "123"
我們使用 curl ifconfig.me 獲得了這些 IP 在配置之後我們執行:
service ipsec restart ipsec verify
我們在 send_redirects 中收到相同的失敗消息,拒絕更改為 0
Checking your system to see if IPsec got installed and started correctly: Version check and ipsec on-path [OK] Linux Openswan U2.6.37/K3.1.0-7.fc16.x86_64 (netkey) Checking for IPsec support in kernel [OK] SAref kernel support [N/A] NETKEY: Testing XFRM related proc values [FAILED] Please disable /proc/sys/net/ipv4/conf/*/send_redirects or NETKEY will cause the sending of bogus ICMP redirects! [FAILED] Please disable /proc/sys/net/ipv4/conf/*/accept_redirects or NETKEY will accept bogus ICMP redirects! [OK] Checking that pluto is running [OK] Pluto listening for IKE on udp 500 [OK] Pluto listening for NAT-T on udp 4500 [OK] Checking for 'ip' command [OK] Checking /bin/sh is not /bin/dash [OK] Checking for 'iptables' command [OK] Opportunistic Encryption Support [DISABLED]
然後我們繼續
ipsec auto --up net-to-net
我們都得到了
022 "net-to-net": We cannot identify ourselves with either end of this connection.
我不知道它是否有幫助,也許您已經註意到出了什麼問題,但這是最後一件事,ipsec 的狀態:
ipsec auto --status 000 using kernel interface: netkey 000 interface lo/lo ::1 000 interface lo/lo 127.0.0.1 000 interface lo/lo 127.0.0.1 000 interface eth0/eth0 192.168.1.78 000 interface eth0/eth0 192.168.1.78 000 %myid = (none) 000 debug none 000 000 virtual_private (%priv): 000 - allowed 0 subnets: 000 - disallowed 0 subnets: 000 WARNING: Either virtual_private= is not specified, or there is a syntax 000 error in that line. 'left/rightsubnet=vhost:%priv' will not work! 000 WARNING: Disallowed subnets in virtual_private= is empty. If you have 000 private address space in internal use, it should be excluded! 000 000 algorithm ESP encrypt: id=2, name=ESP_DES, ivlen=8, keysizemin=64, keysizemax=64 000 algorithm ESP encrypt: id=3, name=ESP_3DES, ivlen=8, keysizemin=192, keysizemax=192 000 algorithm ESP encrypt: id=6, name=ESP_CAST, ivlen=8, keysizemin=40, keysizemax=128 000 algorithm ESP encrypt: id=7, name=ESP_BLOWFISH, ivlen=8, keysizemin=40, keysizemax=448 000 algorithm ESP encrypt: id=11, name=ESP_NULL, ivlen=0, keysizemin=0, keysizemax=0 000 algorithm ESP encrypt: id=12, name=ESP_AES, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=13, name=ESP_AES_CTR, ivlen=8, keysizemin=160, keysizemax=288 000 algorithm ESP encrypt: id=14, name=ESP_AES_CCM_A, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=15, name=ESP_AES_CCM_B, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=16, name=ESP_AES_CCM_C, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=18, name=ESP_AES_GCM_A, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=19, name=ESP_AES_GCM_B, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=20, name=ESP_AES_GCM_C, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=22, name=ESP_CAMELLIA, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=252, name=ESP_SERPENT, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP encrypt: id=253, name=ESP_TWOFISH, ivlen=8, keysizemin=128, keysizemax=256 000 algorithm ESP auth attr: id=1, name=AUTH_ALGORITHM_HMAC_MD5, keysizemin=128, keysizemax=128 000 algorithm ESP auth attr: id=2, name=AUTH_ALGORITHM_HMAC_SHA1, keysizemin=160, keysizemax=160 000 algorithm ESP auth attr: id=5, name=AUTH_ALGORITHM_HMAC_SHA2_256, keysizemin=256, keysizemax=256 000 algorithm ESP auth attr: id=6, name=AUTH_ALGORITHM_HMAC_SHA2_384, keysizemin=384, keysizemax=384 000 algorithm ESP auth attr: id=7, name=AUTH_ALGORITHM_HMAC_SHA2_512, keysizemin=512, keysizemax=512 000 algorithm ESP auth attr: id=8, name=AUTH_ALGORITHM_HMAC_RIPEMD, keysizemin=160, keysizemax=160 000 algorithm ESP auth attr: id=9, name=AUTH_ALGORITHM_AES_CBC, keysizemin=128, keysizemax=128 000 algorithm ESP auth attr: id=251, name=(null), keysizemin=0, keysizemax=0 000 000 algorithm IKE encrypt: id=0, name=(null), blocksize=16, keydeflen=131 000 algorithm IKE encrypt: id=5, name=OAKLEY_3DES_CBC, blocksize=8, keydeflen=192 000 algorithm IKE encrypt: id=7, name=OAKLEY_AES_CBC, blocksize=16, keydeflen=128 000 algorithm IKE hash: id=1, name=OAKLEY_MD5, hashsize=16 000 algorithm IKE hash: id=2, name=OAKLEY_SHA1, hashsize=20 000 algorithm IKE dh group: id=2, name=OAKLEY_GROUP_MODP1024, bits=1024 000 algorithm IKE dh group: id=5, name=OAKLEY_GROUP_MODP1536, bits=1536 000 algorithm IKE dh group: id=14, name=OAKLEY_GROUP_MODP2048, bits=2048 000 algorithm IKE dh group: id=15, name=OAKLEY_GROUP_MODP3072, bits=3072 000 algorithm IKE dh group: id=16, name=OAKLEY_GROUP_MODP4096, bits=4096 000 algorithm IKE dh group: id=17, name=OAKLEY_GROUP_MODP6144, bits=6144 000 algorithm IKE dh group: id=18, name=OAKLEY_GROUP_MODP8192, bits=8192 000 algorithm IKE dh group: id=22, name=OAKLEY_GROUP_DH22, bits=1024 000 algorithm IKE dh group: id=23, name=OAKLEY_GROUP_DH23, bits=2048 000 algorithm IKE dh group: id=24, name=OAKLEY_GROUP_DH24, bits=2048 000 000 stats db_ops: {curr_cnt, total_cnt, maxsz} :context={0,0,0} trans={0,0,0} attrs={0,0,0} 000 000 "net-to-net": 10.0.2.0/24===212.251.112.115<212.251.112.115>[+S=C]---192.168.1.254...192.168.1.254---79.103.7.114<79.103.7.114>[+S=C]===192.168.1.0/24; unrouted; eroute owner: #0 000 "net-to-net": myip=unset; hisip=unset; 000 "net-to-net": ike_life: 3600s; ipsec_life: 28800s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 0 000 "net-to-net": policy: PSK+ENCRYPT+TUNNEL+PFS+IKEv2ALLOW+SAREFTRACK+lKOD+rKOD; prio: 24,24; interface: ; 000 "net-to-net": newest ISAKMP SA: #0; newest IPsec SA: #0;
另一個問題是如何解決 NETKEY [Failed] 問題,如果有必要的話!
我的話,你的工作確實完成了。好的; 這是一種大綱入門,因為目前您的基本原理非常錯誤,以至於細節無關緊要。
首先,您的每個 Internet 連接都沒有靜態公共地址這一事實是一個問題。IPSec 不容易支持此類配置中的隧道 [1],因此每次您的任一地址更改時,您都將最終編輯您的 ipsec.conf。好的?
現在,當我問你是否每個 OpenSWAN 端點都有一個公共 IP 地址,而你自信地說“是”時,事實證明——正如我所懷疑的——你錯了。您的
ifconfig
輸出顯示,一端的地址為 192.168.1.78,另一端的地址為 10.0.2.15。您還告訴我,一端(目前)位於公共 IP 地址 212.251.112.115 後面,另一端位於 79.103.7.114 後面。你不說哪個是哪個,所以我假設 192.168.1.78 在 212.251.112.115 之後,而 10.0.2.15 在 79.103.7.114 之後。如果這是錯誤的,只需反轉對應關係。我也會稱前一對left和後一對right。哪個是哪個沒有區別,但它會幫助我們保持正確的思維,哪個’現在是個好主意。您需要在兩端設置公共路由器,以將 UDP/500 和協議 50 和 51(僅出於完整性考慮)轉發到每個公共地址內的 OpenSWAN 端點。如果您無法管理這兩個協議的穿透,那麼請研究關於 NAT 穿越和轉發 UDP/4500 的 doco。
首先,要求每一端在config中找到自己的IP地址,這樣每一端在啟動的時候就可以知道自己在左右哪個位置。所以left需要有一個
ipsec.conf
包含conn net-to-net authby=secret left=192.168.1.78 leftsubnet=192.168.1.0/24 leftnexthop=%defaultroute right=79.103.7.114 rightsubnet=10.0.2.0/24
還有一個
ipsec.secrets
說192.168.1.78 79.103.7.114: PSK "123"
而權利必須有一個
ipsec.conf
包含conn net-to-net authby=secret left=212.251.112.115 leftsubnet=192.168.1.0/24 right=10.0.2.15 rightsubnet=10.0.2.0/24 rightnexthop=%defaultroute
還有一個
ipsec.secrets
說10.0.2.15 212.251.112.115: PSK "123"
每一端確實需要知道它到底是誰,同時它可以假裝它不在乎遠端端在 NAT 後面。你有看到?
此外,您需要配置每一端的所有客戶端,以便它們具有通過本地 OpenSWAN 端點到遠端 RFC1918 網路的路由。您需要檢查
/proc/sys/net/ipv4/ip_forward
在每個端點上設置為 1。關閉兩個端點上的任何防火牆是一個非常好的主意,至少現在是這樣。您可能還需要啟動一些配置變數,告訴每個端點不要關心遠端端點認為它的 IP 地址與本地端點認為的不同;根據記憶,這些是leftid=
和rightid=
,但你必須自己解決這個問題。這就是基礎。如果你掌握了基本的拓撲結構和概念,剩下的只是調試細節。祝你好運。
[1] 這並不完全正確。SWAN 實現支持機會性 IPSec 加密,但這需要您在兩端控制反向 DNS,我猜您沒有。如果您想了解更多資訊,請再次閱讀手冊頁。