
Я работаю над улучшением правил 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-адреса, блокируется. Я пробовал ! с тем же результатом.
Может ли кто-нибудь помочь мне понять, что я упускаю из виду?
Спасибо
решение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