微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Ubuntu中删除SCTP数据包中的“ IPv4地址参数”字段可选

如何解决如何在Ubuntu中删除SCTP数据包中的“ IPv4地址参数”字段可选

我想在Ubuntu 20.04中使用L2TP VPN将SCTP数据包发送到服务器。为此,我已经设置了L2TP VPN,并且可以使用ping命令成功测试连接。现在,我的ifconfig输出如下:

enp0s31f6: flags=4163<UP,broADCAST,RUNNING,MULTICAST>  mtu 1500
        inet x.x.x.x  netmask 255.255.255.248  broadcast p.p.p.p
    ...

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
    ...

ppp0: flags=4305<UP,POINTOPOINT,NOARP,MULTICAST>  mtu 1400
        inet y.y.y.y  netmask 255.255.255.255  destination q.q.q.q
    ...

在此输出中,x.x.x.x是我的LAN IP,y.y.y.y是我的VPN IP。

但是,当我发送 INIT SCTP数据包时,两个可选字段,即 IPv4地址参数,出现在Wireshark的 INIT块子树中记录如下。这些参数包含我的IP。

Stream Control Transmission Protocol,Src Port: a (a),Dst Port: b (b)
    Source port: a
    Destination port: b
    Verification tag: 0x00000000
    [Association index: 65535]
    Checksum: 0x06cf8029 [unverified]
    [Checksum Status: Unverified]
    INIT chunk (Outbound streams: 3,inbound streams: 3)
        Chunk type: INIT (1)
            0... .... = Bit: Stop processing of the packet
            .0.. .... = Bit: Do not report
        Chunk flags: 0x00
        Chunk length: 52
        Initiate tag: 0xd1d6f19b
        Advertised receiver window credit (a_rwnd): 106496
        Number of outbound streams: 3
        Number of inbound streams: 3
        Initial TSN: 1216798565
        IPv4 address parameter (Address: x.x.x.x)
        IPv4 address parameter (Address: y.y.y.y)
        Supported address types parameter (Supported types: IPv4)
        ECN parameter
        Forward TSN supported parameter

最后,这是发送和接收的数据包:

enter image description here

我认为我的 INIT 数据包中的 IPv4地址参数(地址:xxxx)(我的LAN IP)导致收到了 ABORT 来自服务器的数据包。当我关闭VPN时,这两个可选字段不会出现。

打开VPN后,如何在Ubuntu中删除这两个可选字段?

解决方法

需要手动分配客户端IP才能删除SCTP数据包中的“ IPv4地址参数”字段。因此,C ++需要以下代码:

int sock = socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);
if(sock < 0)
{
    //handle error
}
struct sockaddr_in clientAddr;
memset(&clientAddr,sizeof(struct sockaddr_in));
clientAddr.sin_family = AF_INET;
clientAddr.sin_addr.s_addr = inet_addr("y.y.y.y"); 
clientAddr.sin_port = htons(a);
if( ::bind(sock,(struct sockaddr*)&clientAddr,sizeof(struct sockaddr)) < 0 )
{
    //handle error
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。