how to bind raw socket to specific interface

前端 未结 3 1958
离开以前
离开以前 2020-11-29 22:04

My application is running on CentOS 5.5. I\'m using raw socket to send data:

sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (sd < 0) {
  // Error
}
const         


        
3条回答
  •  既然无缘
    2020-11-29 22:19

    As mentioned earlier, the correct thing to do is use the struct ifreq to specify the interface name. Here is my code sample.

    #define SERVERPORT 5555
    ...
    struct ifreq ifr;
    
    
    /* Create the socket */
    sd = socket(AF_INET, SOCK_STREAM, 0);
    if (sd < 0) 
    {
        printf("Error in socket() creation - %s", strerror(errno));
    }
    
    /* Bind to eth1 interface only - this is a private VLAN */
    memset(&ifr, 0, sizeof(ifr));
    snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth1");
    if ((rc = setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr))) < 0)
    {
        perror("Server-setsockopt() error for SO_BINDTODEVICE");
        printf("%s\n", strerror(errno));
        close(sd);
        exit(-1);
    }
    
    /* bind to an address */
    memset(&serveraddr, 0x00, sizeof(struct sockaddr_in));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(SERVERPORT);
    serveraddr.sin_addr.s_addr = inet_addr("9.1.2.3");
    
    int rc = bind(sd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
    

    I would also like to add that from a security perspective, while it is good to bind the socket to an interface, it does not make sense to use INADDR_ANY as the listening IP address. Doing so would make the port appear open in netstat on all network interfaces.

    Proto Recv-Q Send-Q Local Address    Foreign Address    State     User Inode      PID/Program name
    tcp   0      0      0.0.0.0:5555     0.0.0.0:*          LISTEN    0    210898     26996/myserver  
    

    Instead, I specified an IP address specific to the interface being used (a private VLAN). This fixed the netstat output too:

    Proto Recv-Q Send-Q Local Address    Foreign Address    State     User Inode      PID/Program name
    tcp   0      0      9.1.2.3:5555     0.0.0.0:*          LISTEN    0    210898     26996/myserver  
    

提交回复
热议问题