我想做的是在我的网络和我朋友的网络之间创建一个站点到站点的 IPsec VPN。我们都有一个路由器,每个路由器上都有两台计算机,所有计算机都运行 Linux。所以我猜拓扑结构如下
[我的 PC1 + 我的 PC2]---我的路由器------互联网-----他的路由器---[他的 PC1 + 他的 PC2]
这两款路由器都很便宜,所以它们没有像 OpenWRT 那样的东西。
因此配置 — — 我猜应该在双方的 Linux 上进行。
到目前为止,我们已经尝试使用 openSwan 的 RSA 密钥和 PSK,但在命令之后
ipsec auto --up 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 [失败] 问题!
答案1
天哪,你的工作确实已经做好了。好的;这是一种大纲入门,因为目前你对基础知识的理解太差,以至于细节都不重要了。
首先,你没有为每一个互联网连接设置静态公共地址,这是一个问题。IPSec 无法轻松支持此类配置中的隧道 [1],因此每次你的任何一个地址发生变化时,你最终都要编辑 ipsec.conf。好吗?
现在,当我问你每个 OpenSWAN 端点是否都有一个公共 IP 地址时,你自信地回答“是”,结果证明——正如我所怀疑的那样——你错了。你的ifconfig
输出显示一端的地址为 192.168.1.78,另一端的地址为 10.0.2.15。你还告诉我,一端(目前)在后面公共 IP 地址 212.251.112.115 后面是 192.168.1.78,另一个在 79.103.7.114 后面。您没有说哪个是哪个,所以我假设 192.168.1.78 在 212.251.112.115 后面,而 10.0.2.15 在 79.103.7.114 后面。如果这是错误的,只需反转对应关系即可。我还将前一对称为左边以及后一对正确的。这没什么区别,但它会帮助我们保持思维清晰,这将是一个真的目前来说是个好主意。
您需要在两端设置公共路由器,以将 UDP/500 和协议 50 和 51(仅为了完整性)转发到每个公共地址内的 OpenSWAN 端点。如果您无法管理这两个协议穿透,请调查有关 NAT 遍历的文档并转发 UDP/4500。
首先,要求每一端在配置中找到自己的 IP 地址,以便每一端在启动时都能知道自己是左端还是右端。因此,左端需要有一个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,而我猜您不需要。如果您想了解更多信息,请再次阅读手册页。