ip xfrm配置nat穿越

环境:Linux CentOS 4.5.3-1.el7.elrepo.x86_64

VMWare虚拟机VM1--VM2,两个口直连。VM1:192.168.233.180;VM2:192.168.233.190.

正常配置一个非NAT穿越报文封装的IPsec隧道,然后使用ping命令测试,没有问题,如下配置:


ip xfrm state add src 192.168.233.180 dst 192.168.233.190 proto esp spi 0x00000301 mode tunnel auth md5 0x96358c90783bbfa3d7b196ceabe0536b enc des3_ede 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df

ip xfrm state add src 192.168.233.190 dst 192.168.233.180 proto esp spi 0x00000302 mode tunnel auth md5 0x99358c90783bbfa3d7b196ceabe0536b enc des3_ede 0xffddb555acfd9d77b03ea3843f2653255afe8eb5573965df

ip xfrm state get src 192.168.233.180 dst 192.168.233.190 proto esp spi 0x00000301 

 

ip xfrm policy add src 192.168.233.180 dst 192.168.233.190 dir out ptype main tmpl src 192.168.233.180 dst 192.168.233.190 proto esp mode tunnel

ip xfrm policy add src 192.168.233.190 dst 192.168.233.180 dir in ptype main tmpl src 192.168.233.190 dst 192.168.233.180 proto esp mode tunnel

ip xfrm policy ls

 

ip xfrm state add src 192.168.233.180 dst 192.168.233.190 proto esp spi 0x00000301 mode tunnel auth md5 0x96358c90783bbfa3d7b196ceabe0536b enc des3_ede 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df

ip xfrm state add src 192.168.233.190 dst 192.168.233.180 proto esp spi 0x00000302 mode tunnel auth md5 0x99358c90783bbfa3d7b196ceabe0536b enc des3_ede 0xffddb555acfd9d77b03ea3843f2653255afe8eb5573965df

ip xfrm state get src 192.168.233.180 dst 192.168.233.190 proto esp spi 0x00000301

 

ip xfrm policy add src 192.168.233.180 dst 192.168.233.190 dir in ptype main tmpl src 192.168.233.180 dst 192.168.233.190 proto esp mode tunnel

ip xfrm policy add src 192.168.233.190 dst 192.168.233.180 dir out ptype main tmpl src 192.168.233.190 dst 192.168.233.180 proto esp mode tunnel

ip xfrm policy ls

但是当使用如下带UDP封装的情况下,死活ping不通。


ip xfrm state add src 192.168.233.180 dst 192.168.233.190 proto esp spi 0x00000301 mode tunnel auth sha1 0x96358c90783bbfa3d7b196ceabe0536b enc aes 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df encap espinudp 4500 4500 0.0.0.0

ip xfrm state add src 192.168.233.190 dst 192.168.233.180 proto esp spi 0x00000302 mode tunnel auth sha1 0x99358c90783bbfa3d7b196ceabe0536b enc aes 0xffddb555acfd9d77b03ea3843f2653255afe8eb5573965df encap espinudp 4500 4500 0.0.0.0

 

ip xfrm policy add src 192.168.233.180 dst 192.168.233.190 dir out ptype main tmpl src 192.168.233.180 dst 192.168.233.190 proto esp mode tunnel

ip xfrm policy add src 192.168.233.190 dst 192.168.233.180 dir in ptype main tmpl src 192.168.233.190 dst 192.168.233.180 proto esp mode tunnel

 

ip xfrm state add src 192.168.233.180 dst 192.168.233.190 proto esp spi 0x00000301 mode tunnel auth sha1 0x96358c90783bbfa3d7b196ceabe0536b enc aes 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df encap espinudp 4500 4500 0.0.0.0

ip xfrm state add src 192.168.233.190 dst 192.168.233.180 proto esp spi 0x00000302 mode tunnel auth sha1 0x99358c90783bbfa3d7b196ceabe0536b enc aes 0xffddb555acfd9d77b03ea3843f2653255afe8eb5573965df encap espinudp 4500 4500 0.0.0.0

 

ip xfrm policy add src 192.168.233.180 dst 192.168.233.190 dir in ptype main tmpl src 192.168.233.180 dst 192.168.233.190 proto esp mode tunnel

ip xfrm policy add src 192.168.233.190 dst 192.168.233.180 dir out ptype main tmpl src 192.168.233.190 dst 192.168.233.180 proto esp mode tunnel

通过tcpdump可以看到报文发出了,是ipsec-nat的报文,但是VM2没有任何反应,ip xfrm monitor也抓不到任何信息。

看/proc/net/xfrm_state可以看到XfrmInTmplMismatch一直在增长。

查看说明,应该是tmpl的错误,但是比较内容,以及修改各种参数,一直不行。期间尝试了各种方法,都是不行。

后来网上搜到如下链接:关键字debug xfrm

http://serverfault.com/questions/739314/how-to-debug-ip-xfrm-rules

里面有说


up vote0down
vote

http://techblog.newsnow.co.uk/2011/11/simple-udp-esp-encapsulation-nat-t-for.html

It appears that the Linux kernel will not decapsulate the packets without some instruction. We need to bind to a socket on the incoming udp port and enable udp encapsulation. Above link has the perl script to do it. After this, my traffic is working without
any issues.

按照里面的方法,编写了提到的perl脚本去创建对应的socket。发现设置IPSEC_POLICY失败。由于对perl不太

熟悉,替换为c语言编写。发现对应的setsockopt返回如下错误:

Operation not supported

按照里面所说,其解决方法也是按照strongswan的提示来的。于是就gdb跟了一下,发现strongswan是如下调用:

socket_default_socket.c : open_socket

kernel_interface.c : bypass_socket

kernel_netlink_ipsec.c : add_socket_bypass

在这里发现使用的是xfrm的参数,于是把c文件改为使用xfrm的。具体c代码和简单makefile如下:


#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <stdlib.h>

#include <fcntl.h>

#include <sys/ioctl.h>

#include <netinet/in_systm.h>

#include <netinet/in.h>

#include <netinet/ip.h>

#include <netinet/udp.h>

#include <net/if.h>

#include <linux/xfrm.h>

 

int set_ipsec_policy(int fd)

{

	struct xfrm_userpolicy_info policy;

	u_int sol, ipsec_policy;

 

	sol = IPPROTO_IP;

	ipsec_policy = IP_XFRM_POLICY;

 

 

    memset(&policy, 0, sizeof(policy));

    policy.action = XFRM_POLICY_ALLOW;

    policy.sel.family = AF_INET;

 

    policy.dir = XFRM_POLICY_OUT;

 

	if (setsockopt(fd, sol, ipsec_policy, &policy, sizeof(policy)) < 0)

	{

		printf("unable to set IPSEC_POLICY on socket: %s\n",strerror(errno));

		return -1;

	}

    policy.dir = XFRM_POLICY_IN;

	if (setsockopt(fd, sol, ipsec_policy, &policy, sizeof(policy)) < 0)

	{

		printf("unable to set IPSEC_POLICY on socket: %s\n",strerror(errno));

		return -1;

	}

	return 0;    

}

 

 

int main(int argc, char *argv[])

{

    int sockfd = -1;

    

    struct sockaddr_in host_addr;

    if((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))<0)

    {

        printf("socket() error!\n");

        exit(1);

    }

    memset(&host_addr, 0, sizeof(host_addr));

    host_addr.sin_family = AF_INET;

    host_addr.sin_port = htons(4500);

    host_addr.sin_addr.s_addr = htonl(INADDR_ANY);

 

    const int on = 1;

    if(setsockopt(sockfd, IPPROTO_IP, SO_REUSEADDR, &on, sizeof(on))<0)

    {

        printf("setsockopt() error!\n");

        exit(0);    

    }

    int encap = 2;

 

    if(setsockopt(sockfd, IPPROTO_UDP, 100, &encap, sizeof(encap))<0)

    {

        printf("setsockopt() udp error!\n");

        exit(0);    

    }

 

	if (bind(sockfd, (struct sockaddr*)&host_addr, sizeof(host_addr)) < 0)

	{

		printf("unable to bind socket: %s\n", strerror(errno));

		close(sockfd);

		return -1;

	}

    

    set_ipsec_policy(sockfd);

    printf("bind ..\n");

 

    

    while(1)

    {    

        sleep(1);

    } 

    return 0;

 

}

 

all:

	gcc -o open_nat_t_port -g open_nat_t_port.c

clean:

	rm open_nat_t_port -f

两边都运行此程序,ping可以通了,通过抓包发现,确实也是ipsec-nat包。

时间: 2024-10-26 03:03:40

ip xfrm配置nat穿越的相关文章

配置NAT回流导致外网解析到了内网IP

单位有3个域名,用量很大,2014年开始本人研究部署了Bind+DLZ +Mysql的三机智能多链路DNS,非常好用,优点是: 1.使用Mysql管理记录,配置.管理.查询方便. 2.自动判断运营商,返回指定IP,实现智能多链路.目前我们单位有电信.移动.教育网专线和固定IP,通过Bind的View,判断请求源IP自动返回对应运营商的服务IP.很好很强大也很实用. 3.根据配置自动为内网分配对应的运营商解析...我单位内网用户较多,有一个不少见的需求,内网部分用户要使用电信专线.部分用户要使用移

ubuntn 虚拟机NAT 静态IP 网络配置

在虚拟机安装ubuntu12.04自动获取IP 一切都没有问题 ssh连接也正常.关机重启后郁闷的发现网络已经不通了,于是开始了以下的摸索. 1.配置静态IP 网关: ip段: 命令: Vim /etc/network/interface auto lo iface lo inet loopback auto eth0 # Assgin static IP by eric on 26-SEP-2012 iface eth0 inet static address 192.168.91.200 #

VMWare Esxi + 海蜘蛛配置NAT共享IP上网

VMWare是著名的虚拟化产品公司,VMWare Esxi也是专为服务器设计的虚拟化软件.在安装VMWare Esxi的服务器上可以同时运行多个虚拟系统,充分利用服务器资源.其一大特色之处就在于可以生成虚拟的网络拓扑,通过创建虚拟交换机,可以管理不同虚拟系统上的流量,也令虚拟设备的配置变得更加灵活.可惜的是,VMWare Esxi使用vSwitch作网络交换设备,并未直接提供NAT上网的解决方案.下面以多个虚拟机共享一个公网IP上网为例(相当于需要路由器配置上网),讲解在VMWare Esxi中

[ipsec] 特别硬核的ike/ipsec NAT穿越机制分析

〇 前言 这怕是最后一篇关于IKE,IPSEC的文字了,因为不能没完没了. 所以,我一直在想这个标题该叫什么.总的来说可以将其概括为:IKE NAT穿越机制的分析. 但是,同时它也回答了以下问题: (1)IKE协议交互消息概述.(2)为什么IKE除了端口500还用了端口4500 .(3)IKE MOBIKE是什么. (4)迷之端口500和迷之端口4500 .(5)IKE/IPsec为什么要将端口500换成端口4500. (6)ike/ipsec为什么使用了两个端口. 另外,本篇的所有内容与讨论仅

NAT穿越VPNSec站点到站点

ASA配置默认路由一条ciscoasa(config)# route outside 0 0 192.168.1.1允许其他人pingciscoasa(config)# access-list 100 extended permit icmp any anyciscoasa(config)# access-group 100 in interface outside 配置管理连接策略ciscoasa(config)# crypto isakmp enable outsideciscoasa(co

IPsec VPN详解--nat穿越内网

四. NAT穿越内网路由VPN设置 如图1所示,Router A为某机构总部网关,Router D和Router E是两个分支网关,Router B和Router C为分支提供NAT转换.要求:为了接受协商发起端的访问控制列表设置,Router A采用安全模板方式分别与Router D和Router E建立IPsec VPN,为总部和分支流量进行加密传输. 图1 IPSec VPN多分支安全模板NAT穿越功能的配置举例组网图 设备 接口 IP地址 设备 接口 IP地址 Router  A Eth

3 - 安装路由和远程访问并配置NAT

环境信息 由于普通的家庭路由器仅支持单网段NAT,为了模拟多站点.多网段的真实环境,此次实验将使用一台Windows Server 2016虚拟机来实现多网段NAT: 计算机名 虚拟网卡 IP地址 角色 RRAS External 192.168.1.100 NAT服务器 Internal - 192.168.11.0/24 192.168.11.254 Internal - 192.168.12.0/24 192.168.12.254 Client01 Internal - 192.168.1

思科防火墙NAT穿越技术

拓扑图: 需求: R1作为局域网出口路由器,承担这PAT地址转换功能. ASA需要跟R3建立vpn R4作为局域网内部机器可以跟R3互联,并可以上外网 步骤: 给所有设备配置ip地址,地址规划如上图所示并默认路由 在R4上面配置ip地址配置默认路由 interface FastEthernet0/0 ip address 192.168.1.2 255.255.255.0no shutdown !ip route 0.0.0.0 0.0.0.0 192.168.1.1 在ASA1上面配置ip地址

NAT原理与NAT穿越

最近在看东西的时候发现很多网络程序中都需要NAT穿越,特意在此总结一下. 先做一个约定: 内网A中有:A1(192.168.0.8).A2(192.168.0.9)两用户 网关X1(一个NAT设备)有公网IP 1.2.3.4 内网B中有:B1(192.168.1.8).B2(192.168.1.9)两用户, 网关Y1(一个NAT设备)有公网IP 1.2.3.5 公网服务器:C (6.7.8.9) D (6.7.8.10) NAT原理 网络地址转换(NAT,Network Address Tran