У меня есть кластер riak, который мне нужен, чтобы разрешить доступ к информации только определенным IP-адресам. Я сейчас использую, -A INPUT -s 192.168.10.200 -j ACCEPT
, чтобы разрешить этот IP-адрес, и внизу моих правил я -A INPUT -j REJECT
и -A FORWARD -j REJECT
, чтобы отклонить другой трафик. Кто-нибудь может посоветовать, где я ошибаюсь? Спасибо!
Полные правила:
-A INPUT -s 192.168.1.181 -j ACCEPT
-I INPUT -p tcp --dport 8098 -j ACCEPT
-I INPUT -p tcp --dport 8099 -j ACCEPT
-I INPUT -p tcp --dport 4369 -j ACCEPT
-I INPUT -p tcp --dport 5678:5679 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 2500 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT -A FORWARD -j REJECT
Netfilter имеет 5 основных цепочек. На данный момент вы можете игнорировать PREROUTING и POSTROUTING, поэтому вам нужно манипулировать 3 INPUT, FORWARD и OUTPUT.
INPUT и OUTPUT контролируют трафик, направляемый в саму систему, а FORWARD контролирует трафик, который проходит через и направляется на другую машину (в случае шлюза).
В вашем случае, если вы хотите разрешить внешним пользователям подключаться к самой системе, вам понадобится следующий набор правил:
# Rule 1: accept packets from established connections to enter and leave the system
iptables -A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p udp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp -m state --state ESTABLISHED -j ACCEPT
# Rule 2: accept new connections entering the system
iptables -A INPUT -i eth0 -p tcp -s 192.168.10.200 -m state --state NEW -j ACCEPT
# Rule 3: block all connections entering and leaving the system (if not previously accepted)
iptables -A INPUT -i eth0 -j DROP
# note: only use the filtering on output if you want to control outgoing connection
# if you want to let all connections leave your system, just comment this out
iptables -A OUTPUT -o eth0 -j DROP
Правила 1 и 3 являются общими, Правило 2 относится к конкретному соединению. Просто используйте этот образец и добавьте новое Правило 2, когда вам понадобятся новые соединения.
Если хотите чего-то более солидного, взгляните на это: http://1nw.eu/!MJ
Хорошо, я прочитал ваши правила полностью.
Прежде всего, одна важная вещь: пожалуйста не смешайте -A с -I.
-A
добавляет правила до конца цепочки-I
вставки правила в цепочку (если позиция не указана, она вставляется в первое место)Итак, ваши правила iptables на самом деле:
-A INPUT -p tcp --dport 5678:5679 -j ACCEPT
-A INPUT -p tcp --dport 4369 -j ACCEPT
-A INPUT -p tcp --dport 8099 -j ACCEPT
-A INPUT -p tcp --dport 8098 -j ACCEPT
-A INPUT -s 192.168.1.181 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 2500 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT
-A OUTPUT -j ACCEPT
Как видите, правила INPUT с №1 по №4 не ограничить любой исходный адрес.
Теперь, если вы действительно хотите ограничить доступ к этим портам до 192.168.1.181, вам придется сделать это следующим образом:
# Established connections should just pass
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Loopbacks will not match 192.168.1.181, so we ACCEPT them here
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Other than 192.168.1.181, we reject
-A INPUT -s 192.168.1.181 -j in_allow
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
# Allow only the following ports
-A in_allow -p tcp --dport 5678:5679 -j ACCEPT
-A in_allow -p tcp --dport 4369 -j ACCEPT
-A in_allow -p tcp --dport 8099 -j ACCEPT
-A in_allow -p tcp --dport 8098 -j ACCEPT
-A in_allow -p tcp -m state --state NEW --dport 2500 -j ACCEPT
-A in_allow -p icmp -m icmp --icmp-type 8 -j ACCEPT
#
-A FORWARD -j REJECT
-A OUTPUT -j ACCEPT
Только один вопрос: почему -m state --state NEW
для --dport 2500
?
Важная заметка: Не забудьте сначала ПРОМЫВИТЬ и УДАЛИТЬ все правила iptables перед применением вышеуказанного.
Недостаточно разрешить входящий трафик, используя: -A INPUT -s 192.168.10.200
, или перенаправил трафик с помощью: -A INPUT -s 192.168.10.200
. Вам не хватает соответствующего трафика. Вам необходимо добавить:
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
INPUT
должен использоваться для трафика, направляемого на сам брандмауэр. FORWARD
должен использоваться для трафика, предназначенного для других машин. Кроме того, в этом случае не забудьте включить переадресацию IP.