我有一个路由器,我想将其配置为阻止所有传出互联网的流量。据我了解,我需要丢弃转发的数据包。此外,我想允许内部 LAN 中的一台机器和其他几台机器之间的流量。
为此尝试了以下操作:
IPT="/sbin/iptables"
LOCAL_CONTROLLER="192.168.1.2"
SUBNET="192.168.1."
MACHINE_IPS="100 101 102 103 104"
for MACHINE in ${MACHINE_IPS}; do
$IPT -A FORWARD -s $LOCAL_CONTROLLER -j ACCEPT
$IPT -A FORWARD -s $SUBNET$MACHINE -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -s $SUBNET$MACHINE -d $LOCAL_CONTROLLER -j ACCEPT
$IPT -A FORWARD -s $SUBNET$MACHINE -j DROP
done
不幸的是,这并没有像我预期的那样工作,从 192.168.1.2 到 192.168.1.103 以及返回的流量被阻止。
你能指出我的脚本哪里错了吗?
答案1
FORWARD
仅当服务器有问题时才使用队列是路由器,用于处理网络外部的传入/传出数据包;它用于阻止/接受网络外部数据包的路由(在路由器级别)。
为了在主机级别控制连接,通常使用INPUT
或OUTPUT
队列,无论连接来自何处,因为它们不执行路由(例如,不执行 IP 转发)。
如果您确实希望本地网络中的一组计算机能够相互通信,而不是与 Internet 通信,那么最简单的方法就是不在这些计算机上定义网关。
如果您仍然需要这样做,iptables
则必须INPUT
在脚本中使用队列来代替FORWARD
.
如果您主要担心的是进入互联网的流量,虽然我不喜欢给他们一个出去的网关,但您必须使用OUTPUT
本地计算机中的队列。
如:
iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -j DROP
(192.168.1.0/24 -> 192.168.1网络中的所有机器)
请注意,如果您从另一个网络通过 ssh 访问,您将被这些规则有效地锁定自己。
然而,如果你的路由器是一个 Linux 盒子,那么编写一条 FORWARD 规则就足以锁定几台来自互联网的机器:
iptables -A FORWARD -s 192.168.1.10 -j DROP
iptables -A FORWARD -s 192.168.1.11 -J DROP
从man iptables
:
INPUT(对于发往本地套接字的数据包)
FORWARD(对于通过盒子路由的数据包)
OUTPUT(对于本地生成的数据包)。