Prohibiting an IP range from going out to the Internet in Red Hat/CentOS Linux
Your interface specification in the iptables rule is backward.
You specified:
iptables -A OUTPUT -i eth0 -p tcp -d 192.168.0.0/16 -j REJECT
Using -i
matches traffic that enters the system on the named interface.
Instead, you want to match traffic leaving the system on the named interface, which is done with -o
.
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.0.0/16 -j REJECT
(And you probably don't want -p tcp
in there, otherwise non-TCP traffic might pass.)
In addition to Michael's answer, I think one should block the traffic in the FORWARD
chain, since the OUTPUT
chain applies only to locally generated packets and going out from the firewall. As far as I know, it doesn't apply to routed packets.
You've already got the answer you needed to do it with iptables.
If you want to do it with routes, a good way is to have a route for 192.168.0.0/16 and have your vpn server send you two routes that are a bit more specific, in your case the two routes would be 192.168.0.0/17 and 192.168.128.0/17
The /16 route would be fixed and null-routed:
ip route add blackhole 192.168.0.0/16
And your vpn server (or vpn-up script) would provide you with the others:
ip route add 192.168.0.0/17 via <VPNGW>
ip route add 192.168.128.0/17 via <VPNGW>
This is actually what the def1
option in OpenVPN does to override the default gateway without messing with existing routes.