长话短说:

长话短说:

有没有办法允许内部 LAN 主机伪装成单个静态 Internet IP?

我一直在使用以下脚本,并且仅阻止网关控制台,但我的 LAN 系统仍然可以通过网关系统到达任何地址。

#iptables -I FORWARD -j DROP all; echo blocked everything!

LAN_IN="eth0"
INTERNET="eth1"

#get IP of FQDN
ip="184.28.161.165"
#ip=`nslookup $1 | grep -m2 Address | tail -n1 | cut -d : -f 2`
#[[ -z "$ip" ]] && { echo "Error: URL not found in $_db"; exit 1; }


# Clean old firewall
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
        
# Unlimited access to loop back
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

iptables --table nat --append POSTROUTING --out-interface $INTERNET -j MASQUERADE


echo "Attemptin to open ip $ip"
echo "----------------------------"

# Now, allow connection to website site on port 80, 443, and icmp
iptables -A OUTPUT -p tcp -d $ip  -j ACCEPT
iptables -A OUTPUT -p udp -d $ip  -j ACCEPT
iptables -A OUTPUT -p icmp -d $ip -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT


# unlimited access to LAN
iptables -A INPUT -i $LAN_IN -j ACCEPT
iptables -A OUTPUT -o $LAN_IN -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

echo " "
echo " --------- new fw -------------- "
iptables --list-rules

我的结果在列表中反映了这一点

Attempting to open just access to www.apple.com( 184.28.161.165)
----------------------------

 --------- new fw --------------
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -d 184.28.161.165/32 -p tcp -j ACCEPT
-A OUTPUT -d 184.28.161.165/32 -p udp -j ACCEPT
-A OUTPUT -d 184.28.161.165/32 -p icmp -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT

任何帮助,将不胜感激。

答案1

这是一个旧问题,但如果仍然需要,我会尽力做出答案。

长话短说:

您需要限制 MASQUERADE 规则,以便它不会在允许的约束之外应用。

更多背景/细节

您需要了解,根据网络数据包的条件/路径,并非总是触发所有表/链。

路由流量将经过多个表+链,但不会像本地生成或目标流量那样经过。

更具体地说,主表的 INPUT/OUTPUT 链在路由外部接收的数据包时没有任何用途,但是它们将经过(不限于)表 raw、mangle 和 nat 中的 PREROUTING/POSTROUTING 链,以及转发表。

在您的情况下,如果您只想允许伪装 LAN 数据包定位苹果网站你可以这样写你的伪装规则:

LAN_NETWORK=192.168.0.0/24
TARGET_IP=184.28.161.165
iptables --table nat --append POSTROUTING --source $LAN_NETWORK --destination $TARGET_IP --out-interface $INTERNET -j MASQUERADE

您会更经常地看到“限制目的地”和损坏/绑定阶段的分割,但您可能仍然需要根据源以不同的方式处理流量(例如,如果您有多个 NAT IP)。

LAN_NETWORK=192.168.0.0/24
TARGET_IP=184.28.161.165
# allow routing/forwarding this specific trafic:
iptables --append FORWARD --source $LAN_NETWORK --destination $TARGET_IP -j ALLOW
# disable everything else (using a custom LOGDROP chain that would LOG and then DROP)
# you could simply DROP, or even change the default for FORWARD to DROP
iptables --append FORWARD -j LOGDROP
# Then you'd have a more generic NAT rule in POSTROUTING:
iptables --table nat --append POSTROUTING --source $LAN_NETWORK --out-interface $INTERNET -j MASQUERADE

多个目的地

如果您有多个需要允许的地址/网络,那么您有多种解决方案,最好的解决方案可能是切换到直接 nftable 语法,但使用 iptables 您可以:

将每个目的地塞入相同的规则中:

iptables --append FORWARD --source $LAN_NETWORK --destination $TARGET_IP,$TARGET_IP2,$TARGET_NET1 -j ACCEPT

使用多个规则

iptables --append FORWARD --source $LAN_NETWORK --destination $TARGET_IP -j ACCEPT
iptables --append FORWARD --source $LAN_NETWORK --destination $TARGET_IP2 -j ACCEPT
iptables --append FORWARD --source $LAN_NETWORK --destination $TARGET_NET1 -j ACCEPT

或使用自定义链

如果在多个规则中使用目标列表,则它可以帮助提高配置的可读性,例如:

iptables -N IPLIST
iptables --append IPLIST --destination $TARGET_IP -j ACCEPT
iptables --append IPLIST --destination $TARGET_IP2 -j ACCEPT
iptables --append IPLIST --destination $TARGET_NET1 -j ACCEPT

# limit routed (and so masqueraded) trafic:
iptables --append FORWARD --source $LAN_NETWORK -j IPLIST
iptables --append FORWARD -j DROP
# also limit local outbound trafic:
iptables --append OUTPUT -j IPLIST
iptables --append OUTPUT -j DROP

有很多方法可以做这种事情

详细架构

如果您想了解更多有关该主题的信息那里这是 Phil Hagen 提供的一个出色的图表,显示了可用于处理 iptables 中的数据包的不同路径:

iptable处理图

相关内容