binding non local ip.
Julian Elischer
julian at freebsd.org
Fri Jan 7 17:24:23 UTC 2011
On 1/7/11 4:57 AM, joris dedieu wrote:
> Hi,
> I need a to bind non local ips daemons that don't
> implement IP_BINDANY sockopt.
I'm not sure you need it
you can use the ipfw 'fwd' command to make a locally bound
socket act and look as if it is bound to a non local address
You need to tell us a little more about what you need to do
for example,
Is the socket just listenning? or is it initiating?
> There are several solutions as patching every single daemon
> or using carp (You may not want automatic failover), jailing
> the process and of course binding INADDR_ANY when possible ...
>
> As I'm too lazy for this, I wrote a little (maybe ugly as my
> kernel knowledges are really low) patch that add a sysctl
> entry in net.inet.ip that allow binding non local ips. It's
> maybe buggy and insecure but it seems to work.
seems ok, but if the daemon is initiating, how does it know to bind to
a non local address?
also. if you have source, a single setsockopt() in each one is not
much of a job..
> What do you think about it ?
>
> Thanks
> Joris
>
> --- a/sys/netinet/in_pcb.c
> +++ b/sys/netinet/in_pcb.c
> @@ -321,6 +321,9 @@ in_pcbbind(struct inpcb *inp, struct sockaddr
> *nam, struct ucred *cred)
> *
> * On error, the values of *laddrp and *lportp are not changed.
> */
> +static int bindany = 0; /* 1 allows to bind a non local ip */
> +SYSCTL_INT(_net_inet_ip, OID_AUTO, bindany, CTLFLAG_RW,&bindany, 0,
> + "Allow to bind a non local ip");
> int
> in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,
> u_short *lportp, struct ucred *cred)
> @@ -393,8 +396,12 @@ in_pcbbind_setup(struct inpcb *inp, struct
> sockaddr *nam, in_addr_t *laddrp,
> * to any endpoint address, local or not.
> */
> if ((inp->inp_flags& INP_BINDANY) == 0&&
> - ifa_ifwithaddr_check((struct sockaddr *)sin) == 0)
> - return (EADDRNOTAVAIL);
> + ifa_ifwithaddr_check((struct sockaddr *)sin) == 0) {
> + if(bindany> 0)
> + inp->inp_flags |= INP_BINDANY;
> + else
> + return (EADDRNOTAVAIL);
> + }
> }
> laddr = sin->sin_addr;
> if (lport) {
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>
More information about the freebsd-hackers
mailing list