Aldebaran

人生最棒的感觉,就是你做到别人说你做不到的事。

0%

在CentOS7上使用Libreswan设置点对点IPSec VPN

生田絵梨花 - 白石麻衣

前言

这是在两个CentOS 7主机之间设置主机到主机IPsec隧道的指南。

我们将使用Libreswan作为IPsec的实现。Libreswan在CentOS 7的默认软件包存储库中可用。 Libreswan自Openswan分支出來。

初始化

准备两台服务器

服务器A:

Location: FuZhou / cqnetcq
External IP: 218.106.151.125   enp3s0
Internal IP: 192.168.100.200   enp2s0

服务器B:

Location: Beijing / kscyun
External IP: 120.92.200.150   enp3s0
Internal IP: 10.9.3.30        enp2s0

环境初始化

分别在A/B服务器上执行

开启流量转发

$ cp -pv /etc/sysctl.conf{,.old}
$ vim /etc/sysctl.conf

    ## Controls IP packet forwarding
    net.ipv4.ip_forward = 1
    ## Controls source route verification
    net.ipv4.conf.default.rp_filter = 0

禁用send_redirects。

$ sysctl -a | egrep "ipv4.*(accept|send)_redirects" | awk -F "=" '{print$1"= 0"}'
$ sysctl -a | egrep "ipv4.*(accept|send)_redirects" | awk -F "=" '{print$1"= 0"}' >> /etc/sysctl.conf

#执行后的结果如下(PS:不同服务器运行结果不一样,仅供参考)

    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.default.accept_redirects = 0
    net.ipv4.conf.default.send_redirects = 0
    net.ipv4.conf.enp2s0.accept_redirects = 0
    net.ipv4.conf.enp2s0.send_redirects = 0
    net.ipv4.conf.enp3s0.accept_redirects = 0
    net.ipv4.conf.enp3s0.send_redirects = 0
    net.ipv4.conf.ip_vti0.accept_redirects = 0
    net.ipv4.conf.ip_vti0.send_redirects = 0
    net.ipv4.conf.lo.accept_redirects = 0
    net.ipv4.conf.lo.send_redirects = 0

    net.ipv4.conf.lo.rp_filter = 0
    net.ipv4.conf.eth0.rp_filter = 0
    net.ipv4.conf.eth1.rp_filter = 0

保存sysctl.conf

$ sysctl -p

setenforce关闭

分别在A/B服务器上执行

$ setenforce 0

/etc/hosts修改

分别在A/B服务器上执行

$ vim /etc/hosts
120.92.200.150  kscyun
218.106.151.125 cqnetcq

安装/配置

安装libreswan

分别在A/B服务器上执行

$ yum install -y gmp gmp-devel flex bison iproute2 iptables sed awk cut python xmlto
$ yum install -y epel-release
$ yum install -y libreswan
$ cp -rp /etc/ipsec.conf{.,default}

执行ipsec verify,确认配置正常

分别在A/B服务器上执行

如果允许结果全部为 OK,则为正常; 相反则 环境初始化 环节需要重新检查。

$ ipsec verify

配置RSA密钥

分别在A/B服务器上执行

接下来,你需要配置RSA密钥,我们将使用RSA密钥进行身份验证,因为它提供了比私有共享密钥更高的安全级别。

服务器A:

$ ipsec initnss
$ ipsec newhostkey --nssdir /etc/ipsec.d --output /etc/ipsec.d/cq-to-ksc.secrets

$ ipsec showhostkey --list
$ ipsec showhostkey --ckaid XXX --left

服务器B:

$ ipsec initnss
$ ipsec newhostkey --nssdir /etc/ipsec.d --output /etc/ipsec.d/ksc-to-cq.secrets

$ ipsec showhostkey --list
$ ipsec showhostkey --ckaid XXX --left

修改配置文件

分别在A/B服务器上执行, leftrsasigkey/rightrsasigkey的值需要替换成自己生成。(本地为left,远端为right)

服务器A:

$ vim /etc/ipsec.d/cq-to-ksc.conf

    conn cq-to-ksc
        authby=rsasig

        left=%defaultroute
        leftsubnet=192.168.0.0/16
        leftrsasigkey=0sAwEAAeL5diQXuE17r7LvwuLrYsSwqncd32nfiLmqQxD+JmuN...rPea3B5LkgbRd+FvwfzWXJdFb
        leftid=@cqnetcq

        right=kscyun
        rightsubnet=10.9.0.0/16
        rightrsasigkey=0sAwEAAciTs1e8AN+cMNHMmOTelnTGOXeXw2lryoT3a7WXg4X3UcKX0Qp...tFHZP1sp8=
        rightid=@kscyun

        dpddelay=5
        dpdtimeout=30
        dpdaction=restart
        auto=add

服务器B:

$ vim /etc/ipsec.d/ksc-to-cq.conf

    conn ksc-to-cq
        authby=rsasig

        left=%defaultroute
        leftsubnet=10.9.0.0/16
        leftrsasigkey=0sAwEAAciTs1e8AN+cMNHMmOTelnTGOXeXw2lryoT3a7WXg4X3UcKX0Qp...tFHZP1sp8=
        leftid=@kscyun

        right=cqnetcq
        rightsubnet=192.168.0.0/16
        rightrsasigkey=0sAwEAAeL5diQXuE17r7LvwuLrYsSwqncd32nfiLmqQxD+JmuN...rPea3B5LkgbRd+FvwfzWXJdFb
        rightid=@cqnetcq

        dpddelay=5
        dpdtimeout=30
        dpdaction=restart
        auto=add

运行

启动程序

分别在A/B服务器上执行

服务器A:

$ systemctl start ipsec
$ ipsec auto --add cq-to-ksc
$ ipsec auto --up cq-to-ksc
$ ipsec status

服务器B:

$ systemctl start ipsec
$ ipsec auto --add ksc-to-cq
$ psec auto --up ksc-to-cq
$ ipsec status

路由转发(可选)

服务器A:

$ iptables -t nat -A POSTROUTING -s 10.9.3.0/24 -d 192.168.100.0/24 -j MASQUERADE

可选: 添加路由(vpn同段的其他服务器访问不了,可以试试)
$ route add -net 10.9.3.0 netmask 255.255.0.0 gw 192.168.100.200

服务器B:

$ iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -d 10.9.3.0/24 -j MASQUERADE

可选: 添加路由(vpn同段的其他服务器访问不了,可以试试)
$ route add -net 192.168.100.0 netmask 255.255.0.0 gw 10.9.3.30

抓包测试(可选)

$ tcpdump -n -i interface esp or udp port 500 or udp port 4500

参考

host-host-ipsec-libreswan-centos

connect-site-site-ipsec-vpn

sec-securing_virtual_private_networks

sec-Host-To-Host_VPN_Using_Libreswan

site-to-site_vpn_using_libreswan