使用 iptables(或代理)将某些网址列入白名单

使用 iptables(或代理)将某些网址列入白名单

我正在尝试在 Ubuntu 服务器上设置强制门户。

我希望能够将所有流量路由到我的 Web 应用程序(同一个盒子),以便他们可以注册。注册后,用户的 MAC 地址将添加到 IP 集,然后允许正常使用互联网。

我当前的 iptables 配置是:

#!/bin/sh

# Aliases
IPT=/sbin/iptables
IPS=/sbin/ipset

# Create sets
$IPS create whitelist hash:mac -exist

# Add whitelisted devices to set
$IPS add whitelist 00:11:22:33:44:55 -exist

# flush the iptables
$IPT -F

# Set up the iptables
$IPT -P OUTPUT ACCEPT
$IPT -P INPUT DROP
$IPT -P FORWARD DROP

$IPT -t nat -A POSTROUTING -o WAN -j MASQUERADE
$IPT -A FORWARD -i LAN -o WAN -m set --match-set whitelist src,dst -j ACCEPT

$IPT -A FORWARD -i WAN -o LAN -m state --state RELATED,ESTABLISHED -j ACCEPT

$IPT -t nat -I PREROUTING 1 -p tcp -d bbc.co.uk -j ACCEPT

$IPT -t nat -A PREROUTING -i LAN -m set ! --match-set whitelist src,dst -j DNAT --to-destination 192.168.100.10

$IPT -A FORWARD -d 192.168.100.10 -j ACCEPT

$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i LAN -j ACCEPT
$IPT -A INPUT -i WAN -m state --state ESTABLISHED,RELATED -j ACCEPT

现在我想始终允许所有用户(无论是否注册)访问一个网站地址(例如 bbc.co.uk)——这也需要通过 SSL(443)工作。

我试过,$IPT -A OUTPUT -t tcp -d bbc.co.uk -j ACCEPT但没有成功

我还看到一些人建议不要使用 iptables 来定位 DNS 地址,而是使用 squid 代理。我不确定我能否使用 squid 实现这一点,因为我需要根据我与我的 Web 应用程序保持同步的 ipset 来制定规则。

如能得到任何帮助以解决该问题,我们将不胜感激。

答案1

为什么要使用:

$IPT -A OUTPUT -t tcp -d bbc.co.uk -j ACCEPT 

我为什么要问这个问题?首先,您使用 FORWARD 和 PREROUTING 规则来建立过滤器。但现在您使用不同的表来启用连接。这很可能不会按预期工作。请参阅维基百科上的图表

据我了解,您的设置禁用了 PREROUTING 链中的连接。因此,启用连接的命令将是:

$IPT -t nat -I PREROUTING 1 -t tcp -d bbc.co.uk -j ACCEPT

关于您的第二个问题:您已经将未经授权的系统发送到您的服务器。因此,您必须配置任何代理以允许 bbc.com 作为特殊规则,而不是将其重定向到您的表单。

答案2

根据@user2563336 的回答,我需要添加以下几行:

$IPT -A FORWARD -d $MYSERVER -j ACCEPT
$IPT -t nat -I PREROUTING 1 -d $MYSERVER -j ACCEPT

我还需要允许 DNS,以便可以解析我的主机名

我的完整 iptables 脚本是:

#!/bin/sh


# Aliases
IPT=/sbin/iptables
IPS=/sbin/ipset


MYSERVER=myserver.com


# Create sets
$IPS create gold hash:mac -exist
$IPS create silver hash:mac -exist


# Add whitelisted devices to set
# $IPS add gold 00:11:22:33:44:55 -exist  # macbook air


# flush the tables
$IPT -F
$IPT -t nat -F


# Set up the iptables
$IPT -P OUTPUT ACCEPT
$IPT -P INPUT DROP
$IPT -P FORWARD DROP


# Allow DNS
$IPT -A OUTPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT


# whitelist MYSERVER
$IPT -A FORWARD -d $MYSERVER -j ACCEPT
$IPT -t nat -I PREROUTING 1 -d $MYSERVER -j ACCEPT
$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT  # this one


# Nat
$IPT -t nat -A POSTROUTING -o WAN -j MASQUERADE
$IPT -A FORWARD -i WAN -o LAN -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A FORWARD -i LAN -o WAN -m set --match-set gold src,dst -j ACCEPT
$IPT -A FORWARD -i LAN -o WAN -m set --match-set silver src,dst -j ACCEPT


$IPT -t nat -A PREROUTING -i LAN -m set ! --match-set gold src,dst -j DNAT --to-destination 192.168.100.10
$IPT -A FORWARD -d 192.168.100.10 -j ACCEPT


$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i LAN -j ACCEPT
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

相关内容