有没有办法允许内部 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 中的数据包的不同路径: