我想要做的是阻止对 WAN 的访问,只允许这些主机在 192.168.1.0/24 LAN 上相互通信。此配置应在有问题的主机上完成。
有一些类似的帖子,但往往用例过于具体或过于复杂。我现在按每 GB 付费。我有某些虚拟机在设置后实际上并不需要 WAN 访问,但似乎正在使用大量数据。 (LDAP 服务器出于某种原因?)
我正在研究 DD-WRT 过滤,但我想知道如何在主机端进行操作。
我还将考虑每天启用 WAN 访问 1 小时。这可以通过“iptables脚本“使用 CRON,或者仅通过 DD-WRT。
我猜 IPTables 是最好的选择。我想我所有的服务器都使用 IPTables,有些有 UFW,有些有 FirewallD。
我认为这可能是一个“通用问题”,其大部分答案应该适用于许多/所有发行版。但补充一下,我主要使用 Ubuntu 14/16 和 CentOS 6/7。
答案1
过滤用IP表
这可以通过为允许的流量创建一组规则并丢弃其余的来实现。
对于OUTPUT
链,创建规则以接受环回流量和网络流量192.168.1.0/24
。没有匹配规则时应用默认操作,设置为REJECT
。
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT
iptables -P OUTPUT REJECT
对于INPUT
链,您可以创建类似的规则。允许来自环回和本地网络的流量,丢弃其余的。
您可以使用单个规则来匹配已建立的流量(对主机发起的连接的回复流量)-m conntrack --ctstate ESTABLISHED
。这样,当您想要启用 Internet 访问时,无需更改链。当您不运行任何需要来自本地网络外部的连接的程序/守护程序时,此方法有效。
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
如果需要允许在本地网络之外发起的连接,则需要以INPUT
与链相同的方式配置链OUTPUT
并使用类似的机制来应用
要允许不受限制(WAN 访问)的网络访问,请将默认操作更改为ACCEPT
。要恢复限制,请将默认操作更改回REJECT
。通过添加/删除-j ACCEPT
最后一条规则可以达到相同的效果。
iptables -P OUTPUT ACCEPT
您还可以使用iptables 时间模块接受一天中特定时间的流量,在这种情况下您不需要使用 cron。例如,要允许 12:00 到 13:00 之间的任何传出流量,规则如下:
iptables -A OUTPUT -m time --timestart 12:00 --timestop 13:00 -j ACCEPT
答案2
删除默认路由
当您从主机的路由表中删除默认路由时,它会阻止它与本地网络外部的其他主机进行通信。默认路由配置为ip route
:ip route default add ...
添加默认路由和ip route del default
删除默认路由。
来自路由器的流量可能仍然能够到达您的主机。您可以通过启用来丢弃没有已知路由到源地址的流量反向路径过滤。
配置反向路径过滤有两种方法:系统控制或者iptables。这系统控制方法仅适用于ipv4,iptables规则可以为ipv4和ipv6编写。
要启用反向路径过滤,请使用系统控制
rp_filter
:sysctl net.ipv4.conf.all.rp_filter = 1
和iptables, 使用
rpfilter
模块:iptables -t raw -I PREROUTING -m rpfilter --invert -j DROP
同样的规则也适用于
ip6tables
.为了nftables, 使用fib
陈述。
要删除和恢复默认路由,您可以使用带有 cron 的简单脚本:
#!/bin/sh -e
FILE="/root/default.gw"
case "$1" in
"remove")
route="$(ip route show default 0.0.0.0/0)"
if [ -z "$route" ]; then
echo "no default route configured"
exit 1
fi
echo "$route" > $FILE
ip route del default
ip route flush cache
;;
"restore")
route="$(cat $FILE)"
if [ -z "$route" ]; then
echo "no default route saved"
exit 1
fi
ip route add $route
;;
*)
echo "invalid argument"
echo "usage: $(basename -- $0) remove|restore"
exit 1
esac