pub fn bind_nonlocal(ty: RedirType, addr: SocketAddr, redir_opts: &RedirSocketOpts) -> io::Result<Self> {
        let socket = Self::bind(ty, addr, true)?;

        if let Some(mark) = redir_opts.fwmark {
            let ret = unsafe {
                libc::setsockopt(
                    socket.as_raw_fd(),
                    libc::SOL_SOCKET,
                    libc::SO_MARK,
                    &mark as *const _ as *const _,
                    mem::size_of_val(&mark) as libc::socklen_t,
                )
            };
            if ret != 0 {
                return Err(Error::last_os_error());
            }
        }

        Ok(socket)
    }
Create a new UDP socket binded to `addr`

This will allow binding to `addr` that is not in local host
crates/shadowsocks-service/src/local/redir/udprelay/sys/unix/linux.rs