我一直在努力增强我的 iptable 规则。以下是我迄今为止所做的工作以及我计划完成的工作和我遇到的问题的背景:
我有一台 RPi,还有一个 WiFi 模块,并且已将 3G 调制解调器与其连接。我希望将 WiFi 的所有流量转发到我的 3G 接口。我创建了这些规则,它们运行良好,当我配对时,我可以在平板电脑上完全访问互联网:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -F
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -A FORWARD -i ppp0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan1 -o ppp0 -j ACCEPT
现在我想阻止这一切,只允许发往两个 IP 地址的流量通过。我创建了一个链,但事情并没有像我希望的那样顺利:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -F
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -N TEST
iptables -A TEST -d 34.215.23.64 -j RETURN
iptables -A TEST -d 52.37.29.39 -j RETURN
iptables -A TEST -j ACCEPT
iptables -A FORWARD -i wlan1 -o ppp0 -j TEST
iptables -A FORWARD -i wlan1 -o ppp0 -j DROP
当我执行此操作时,包括这两个 IP 地址在内的所有 Internet 访问都会被阻止。我尝试了 !,结果相同。
有人能帮我弄清楚我遗漏了什么吗?
谢谢
答案1
iptables -A TEST -d 34.215.23.64 -j RETURN
iptables -A TEST -d 52.37.29.39 -j RETURN
您的主要问题是这些规则不是有状态的,而且您只处理了一个方向的规则。如果我们假设没有其他问题,这些规则将只处理一个方向的流量。但由于您可能需要双向通信,您将如何获得对任何以“34.215.23.64”为目的地的邮件的回复?回复将是一个数据包,其源地址为“34.215.23.64”,目的地是您的 IP。
因此你至少应该考虑重新添加(iptables ... --state RELATED,ESTABLISHED ...
)规则。
iptables -N TEST
iptables -A TEST -d -j RETURN
iptables -A TEST -d 34.215.23.64 -j RETURN
iptables -A TEST -d 52.37.29.39 -j RETURN
iptables -A TEST -j ACCEPT
iptables -A FORWARD -i wlan1 -o ppp0 -j TEST
iptables -A FORWARD -i wlan1 -o ppp0 -j DROP
但这不是唯一的问题。你的链条的逻辑被破坏了。
因此,发往的数据包34.215.23.64
将首先在转发中处理。它将首先匹配规则-j TEST
。在 TEST 链上,该数据包将被发送回链(-j RETURN),然后下一个匹配的规则是 DROP。
无论如何,尝试一下这样的方法。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -F
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# permit all established connections
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# chain for wlan -> ppp0 traffic
iptables -N WLAN2PPP
iptables -A WLAN2PPP -d 34.215.23.64 --state NEW -j ACCEPT
iptables -A WLAN2PPP -d 52.37.29.39 --state NEW -j ACCEPT
# everything else from wlan to ppp0 is dropped
iptables -A WLAN2PPP -j DROP
# send wlan1 -> ppp0 traffic to the chain.
iptables -A FORWARD -i wlan1 -o ppp0 -j WLAN2PPP