阻止 WAN 访问 - 允许 LAN 访问 - Linux 主机

阻止 WAN 访问 - 允许 LAN 访问 - Linux 主机

我想要做的是阻止对 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 routeip 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

相关内容