Added IP_TRANSPARENT option for UDP (#7872)
Motivation: This allows netty to operate in 'transparent proxy' mode for UDP, intercepting connections to other addresses by means of Linux firewalling rules, as per https://www.kernel.org/doc/Documentation/networking/tproxy.txt Modification: Add IP_TRANSPARENT option. Result: Allows setting and getting of the IP_TRANSPARENT option, which allows retrieval of the ultimate socket address originally requested.
This commit is contained in:
parent
a4146b706c
commit
0b690a991f
@ -23,6 +23,7 @@ import io.netty.channel.MessageSizeEstimator;
|
|||||||
import io.netty.channel.RecvByteBufAllocator;
|
import io.netty.channel.RecvByteBufAllocator;
|
||||||
import io.netty.channel.WriteBufferWaterMark;
|
import io.netty.channel.WriteBufferWaterMark;
|
||||||
import io.netty.channel.socket.DatagramChannelConfig;
|
import io.netty.channel.socket.DatagramChannelConfig;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.NetworkInterface;
|
import java.net.NetworkInterface;
|
||||||
@ -48,7 +49,7 @@ public final class EpollDatagramChannelConfig extends EpollChannelConfig impleme
|
|||||||
ChannelOption.SO_REUSEADDR, ChannelOption.IP_MULTICAST_LOOP_DISABLED,
|
ChannelOption.SO_REUSEADDR, ChannelOption.IP_MULTICAST_LOOP_DISABLED,
|
||||||
ChannelOption.IP_MULTICAST_ADDR, ChannelOption.IP_MULTICAST_IF, ChannelOption.IP_MULTICAST_TTL,
|
ChannelOption.IP_MULTICAST_ADDR, ChannelOption.IP_MULTICAST_IF, ChannelOption.IP_MULTICAST_TTL,
|
||||||
ChannelOption.IP_TOS, ChannelOption.DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION,
|
ChannelOption.IP_TOS, ChannelOption.DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION,
|
||||||
EpollChannelOption.SO_REUSEPORT);
|
EpollChannelOption.SO_REUSEPORT, EpollChannelOption.IP_TRANSPARENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "unchecked", "deprecation" })
|
@SuppressWarnings({ "unchecked", "deprecation" })
|
||||||
@ -87,6 +88,9 @@ public final class EpollDatagramChannelConfig extends EpollChannelConfig impleme
|
|||||||
if (option == EpollChannelOption.SO_REUSEPORT) {
|
if (option == EpollChannelOption.SO_REUSEPORT) {
|
||||||
return (T) Boolean.valueOf(isReusePort());
|
return (T) Boolean.valueOf(isReusePort());
|
||||||
}
|
}
|
||||||
|
if (option == EpollChannelOption.IP_TRANSPARENT) {
|
||||||
|
return (T) Boolean.valueOf(isIpTransparent());
|
||||||
|
}
|
||||||
return super.getOption(option);
|
return super.getOption(option);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,6 +121,8 @@ public final class EpollDatagramChannelConfig extends EpollChannelConfig impleme
|
|||||||
setActiveOnOpen((Boolean) value);
|
setActiveOnOpen((Boolean) value);
|
||||||
} else if (option == EpollChannelOption.SO_REUSEPORT) {
|
} else if (option == EpollChannelOption.SO_REUSEPORT) {
|
||||||
setReusePort((Boolean) value);
|
setReusePort((Boolean) value);
|
||||||
|
} else if (option == EpollChannelOption.IP_TRANSPARENT) {
|
||||||
|
setIpTransparent((Boolean) value);
|
||||||
} else {
|
} else {
|
||||||
return super.setOption(option, value);
|
return super.setOption(option, value);
|
||||||
}
|
}
|
||||||
@ -371,4 +377,30 @@ public final class EpollDatagramChannelConfig extends EpollChannelConfig impleme
|
|||||||
throw new ChannelException(e);
|
throw new ChannelException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns {@code true} if <a href="http://man7.org/linux/man-pages/man7/ip.7.html">IP_TRANSPARENT</a> is enabled,
|
||||||
|
* {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean isIpTransparent() {
|
||||||
|
try {
|
||||||
|
return datagramChannel.socket.isIpTransparent();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ChannelException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If {@code true} is used <a href="http://man7.org/linux/man-pages/man7/ip.7.html">IP_TRANSPARENT</a> is enabled,
|
||||||
|
* {@code false} for disable it. Default is disabled.
|
||||||
|
*/
|
||||||
|
public EpollDatagramChannelConfig setIpTransparent(boolean ipTransparent) {
|
||||||
|
try {
|
||||||
|
datagramChannel.socket.setIpTransparent(ipTransparent);
|
||||||
|
return this;
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ChannelException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user