Я настроил iptables следующим образом:
Table: mangle
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
Table: filter
Chain INPUT (policy DROP)
num target prot opt source destination
1 VZ_INPUT all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP)
num target prot opt source destination
1 VZ_FORWARD all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 VZ_OUTPUT all -- 0.0.0.0/0 0.0.0.0/0
Chain VZ_FORWARD (1 references)
num target prot opt source destination
Chain VZ_INPUT (1 references)
num target prot opt source destination
1 ACCEPT tcp -- 12.123.12.myip 0.0.0.0/0 tcp dpt:22
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
7 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
8 ACCEPT tcp -- 127.0.0.1 127.0.0.1
9 ACCEPT udp -- 127.0.0.1 127.0.0.1
13 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255
Chain VZ_OUTPUT (1 references)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255
4 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 state NEW udp dpt:53
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:53
Table: nat
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Я могу пинговать хосты по IP, однако я не могу пинговать хосты по имени и wget http://ipaddress/
из командной строки.
root ~ # ping google.com
root ~ # ping 89.33.254.54
PING 89.33.254.54 (89.33.254.54) 56(84) bytes of data.
64 bytes from 89.33.254.54: icmp_seq=1 ttl=54 time=82.2 ms
--- 89.33.254.54 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 82.263/82.263/82.263/0.000 ms
root ~ # wget http://89.33.254.50
--2011-12-09 17:21:03-- http://89.33.254.50/
Connecting to 89.33.254.50:80...
Почему, если разрешен весь выходной трафик, я не могу подключиться к удаленным хостам? Думаю, мне нужно открыть еще несколько портов INPUT, но что это?
Я рекомендую вам добавить правила в цепочку INPUT, которая позволяет устанавливать пакеты ESTABLISHED и RELATED:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Если позже вы еще больше заблокируете свою цепочку OUTPUT, вам также понадобится соответствующее правило OUTPUT:
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Эти правила безопасны, и вы обнаружите, что они обычно являются одними из первых правил, добавляемых почти во все сценарии брандмауэра. ESTABLISHED означает, что «после того, как я разрешил установить соединение, пропустить все пакеты для этого соединения», он не позволяет создавать запрещенные иным образом соединения. «СВЯЗАННЫЙ» позволяет использовать полезные пакеты, такие как «Поскольку я отправил запрос на запуск соединения, разрешить возврат пакета ICMP, который сообщает мне, что этот хост недоступен» или «Поскольку я разрешил подключение по ftp, также разрешить подключение для передачи данных по ftp». Опять же, он не должен разрешать создание дополнительных подключений, которые еще не разрешены другими правилами.
Прямо сейчас вы позволяете DNS-запросу уходить, но не возвращаете ответ. В настоящее время вы разрешаете dpt: 53, который позволит кому-либо запрашивать ваш DNS-сервер, но не помогает с ответом DNS (который, как вы ожидаете, будет 53 для исходного порта, но не для порта назначения)
Еще одно примечание: поскольку ваша политика OUTPUT по умолчанию - ACCEPT, все остальные правила бесполезны (поскольку все они также ACCEPT). Таким образом, вы, по сути, говорите: «Если пакет является одним из следующих типов пакетов, тогда ПРИНИМАЙТЕ их, в противном случае также ПРИНИМАЙТЕ их в любом случае», вы можете пропустить все правила в этом случае и просто сказать «Принять все исходящие пакеты». Это звучит как Однако это временно, пока вы не улучшите работу DNS-трафика.