4

Имейте коробку linux, хотите, чтобы это было заперто, но только сможете выходить в интернет. Почему этот скрипт тоже блокирует http?

#!/bin/sh
#
#
iptables -F

#
#Set default policies for INPUT, FORWARD and OUTPUT chains
#
iptables -P INPUT DROP                
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

#
# Allow TCP connections on tcp port 80
#
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

#
# Set access for localhost
#
iptables -A INPUT -i lo -j ACCEPT


#
# List rules
#
iptables -L -v

6 ответов6

3

Потому что правило

iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

с политикой DROP в цепочке OUTPUT требуются две вещи, которые здесь очень актуальны:

  1. Соединение должно быть уже установлено
  2. Исходный порт должен быть 80/ TCP

Исходные порты ниже 1024 являются привилегированными и, как правило, не используются для исходящих соединений, даже когда процесс владения сокетом выполняется от имени пользователя root. Вы, скорее всего, увидите, что выходящий порт с большим исходным номером выходит гораздо выше, чем 30000, что кажется распространенным явлением.

Также невозможно установить соединение, так как единственный разрешенный исходящий трафик должен быть связан с уже установленным соединением.

Следовательно, на практике ничто не может соответствовать этому правилу.

Попробуйте вместо этого:

iptables -A OUTPUT -o eth0 -p tcp --dport 80 -j ACCEPT

который должен разрешать любые исходящие соединения к TCP-порту назначения 80, где трафик направляется через eth0, что намного больше соответствует тому, что вы хотите.

И потом, как уже было отмечено, не забывайте о HTTPS, DNS, ...

2

Глядя на эти два правила у вас есть

iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

То, что у вас есть, - это то, что вы бы сказали, чтобы разрешить вход на веб-сервер, который вы запускаете.

То, что у вас есть, идентично тому, что написано на этой веб-странице. http://crm.vpscheap.net/knowledgebase.php?action=displayarticle&id=29

6. Allow Incoming HTTP and HTTPS

The following rules allow all incoming web traffic. i.e HTTP traffic to port 80.
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Но вы хотите разрешить исходящие, согласно вашему вопросу. Вы можете просмотреть эту страницу снова

Вот пример, чтобы разрешить исходящие.

iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

На этой веб-странице ясно, похоже, что вы обращались не к тому разделу.

Итак, оба правила, которые вы имели, были неверны.

1

Если возможно, попробуйте сбросить IP-таблицы и посмотреть, действительно ли вы можете подключиться через http. (iptables -F)

Как говорил Darth Android, убедитесь, что вы не пытаетесь подключиться через https.

Кроме того, у вас есть более одного интерфейса Ethernet? Или ваш интерфейс Ethernet называется что-то еще, кроме eth0. быстрый ifconfig покажет вам, как называются ваши интерфейсы.

1
iptables -I  INPUT 1 -i lo -j ACCEPT
iptables -I  INPUT 2 -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I  INPUT 3 -j DROP
iptables -I  OUTPUT 1 -o lo -j ACCEPT
iptables -I  OUTPUT 2 -p tcp -m multiport --dports 80,443 -j ACCEPT 
iptables -I  OUTPUT 3 -j DROP
iptables -I  FORWARD 1  -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I  FORWARD 2 -j DROP

Давайте не будем делать наши правила сложнее, чем нужно.

НИКОГДА не блокируйте петлевой адаптер.

------ ВХОД

  1. DNS и веб-серфинг и т.д. Генерируют трафик только на основе результатов, поэтому считается связанным или установленным.
  2. УБРАТЬ все остальное, потому что это не нужно.

-----ВЫХОД

  1. Принять ЛО
  2. Вы хотите принимать только веб-трафик 80,443 эти порты УБРАТЬ остатки

-----ВПЕРЕД

Если у вас 1 ник, здесь не должно быть много трафика, но то же самое применимо, если он НЕ СВЯЗАН или УСТАНОВЛЕН, мы просто не хотим его.

0

Вы также должны разрешить ICMP в обоих направлениях или обнаружение MTU пути и восстановление после ошибки, пытаясь сломать другой IP-адрес.

Как правило, вы хотите разрешить весь установленный и связанный трафик.

0

Ну, если вы используете Google DNS, как я, то это должно быть что-то вроде этого:

sudo ip6tables -P INPUT DROP
sudo iptables -P INPUT ACCEPT
sudo iptables -F

sudo iptables -A INPUT -i lo -p udp -s 127.0.0.1 -d 127.0.1.1 --sport 40000:65535 --dport 53 -m limit --limit 50/s -j ACCEPT
sudo iptables -A INPUT -i lo -p udp -d 127.0.0.1 -s 127.0.1.1 --dport 40000:65535 --sport 53 -m limit --limit 50/s -j ACCEPT
sudo iptables -A INPUT -p udp -s 8.8.4.4 --sport 53 -m limit --limit 50/s -j ACCEPT
sudo iptables -A INPUT -p udp -s 8.8.8.8 --sport 53 -m limit --limit 50/s -j ACCEPT
sudo iptables -A INPUT -p tcp -m multiport --sports 443,80 -m state --state NEW,ESTABLISHED -m limit --limit 50/s -j ACCEPT
sudo iptables -P INPUT DROP

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .