Здравствуйте уважаемые учасники форума!
Очень хочу разобраться с настройкой iptables, читаю iptables tutorial 1.19 c opennet.ru, но мало чего понимаю.
Проблема в следующем: нужно открыть доступ к ssh на машине 192.168.0.1(linux, celeron) с адреса 192.168.0.3(windows, athlon).
Написал
IPT="/sbin/iptables"
echo 1 > /proc/sys/net/ipv4/ip_forward
$IPT -F
$IPT -X
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -I INPUT 1 -p tcp -d 192.168.0.1 --dport 22 -j ACCEPT
(я правильно понимаю? - разрешаем входящие пакеты для протокола tcp у которых адрес назначения 192.168.0.1 и порт 22)
$IPT -I OUTPUT 1 -p tcp -s 192.168.0.3 --dport 22 -j ACCEPT
(разрешаем исходящие пакеты для протокола tcp которые идут на 192.168.0.3 порт 22?)
iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere Celeron tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- Athlon anywhere tcp dpt:ssh
SSH не работает. Где я ошибся?
азы iptables (Пожалуйста, помогите разобраться!)
Модератор: Bizdelnick
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: азы iptables
А кто сказал, что SSH не работает из-за iptables? Вообще, ставим shorewall и не парим себе и людям моск - он довольно удобно оборачивает правила iptables в более удобоваримый вид.
-
little Jon
- Сообщения: 212
Re: азы iptables
$IPT -I INPUT 1
мне кажется что ключик -I лучше заменить на -A (append) циферка 1 вроде как тоже не понятно к чему, номера правил здесь явно излишни. Посмотри вот сюда. http://linuxforum.ru/index.php?showtopic=2...mp;#entry258634
А вообще твоя задача решается через TCP wrappers
/etc/host/allow /etc/host/deny
если мне не изменяет память руководство называется host_access
мне кажется что ключик -I лучше заменить на -A (append) циферка 1 вроде как тоже не понятно к чему, номера правил здесь явно излишни. Посмотри вот сюда. http://linuxforum.ru/index.php?showtopic=2...mp;#entry258634
А вообще твоя задача решается через TCP wrappers
/etc/host/allow /etc/host/deny
если мне не изменяет память руководство называется host_access
Linuxforum@conference.jabber.ru
-
loner
- Сообщения: 149
- ОС: Debian 5.0
Re: азы iptables
> А кто сказал, что SSH не работает из-за iptables?
Потому что без iptables он работает
> Вообще, ставим shorewall и не парим себе и людям моск
Извините что отнял у Вас пару минут драгоценного времени
Конечно, для двух правил iptables без shorewall никуда 
> мне кажется что ключик -I лучше заменить на -A (append) циферка 1 вроде как тоже не понятно к чему, номера правил здесь явно излишни
А это сильно важно? Результат один и тот же.
> А вообще твоя задача решается через TCP wrappers
Сейчас разбираюсь с iptables.
И все-таки проблема не в этом, а в понимании как работают правила. Есть какие то предположения что я не так написал?
Потому что без iptables он работает
> Вообще, ставим shorewall и не парим себе и людям моск
Извините что отнял у Вас пару минут драгоценного времени
> мне кажется что ключик -I лучше заменить на -A (append) циферка 1 вроде как тоже не понятно к чему, номера правил здесь явно излишни
А это сильно важно? Результат один и тот же.
> А вообще твоя задача решается через TCP wrappers
Сейчас разбираюсь с iptables.
И все-таки проблема не в этом, а в понимании как работают правила. Есть какие то предположения что я не так написал?
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: азы iptables
Ну раз нравится писать "эти два правила" вручную, кто же запрещает.
Но в таком случае стоит и заодно изучать детали стека TCP/IP. Например стоило бы знать, что помимо SYN на 22-й порт (запрос коннекта) нужно разрешить пакеты в состоянии RELATED и ESTABLISHED.
-
VisualN
- Сообщения: 213
- ОС: Gentoo Linux
Re: азы iptables
Перевожу то, что ты написал:
$IPT -I INPUT 1 -p tcp -d 192.168.0.1 --dport 22 -j ACCEPT
Пропускать входящие tcp пакеты с назначением 192.168.0.1 на порт 22.
Это значит что пройдет любой пакет посланный на 192.168.0.1, разве ты этого хотел?
Думаю подразумевалось вот это: $IPT -I INPUT 1 -p tcp -s 192.168.0.3 --dport 22 -j ACCEPT
Т.е. пропускать трафик на ssh только с ip 192.168.0.3.
Если нужно разрешить всей локалке то можно в качестве источника указать подсеть, или разрешить соединения не с какого то ip, а с интерфейса вообще.
Далее: $IPT -I OUTPUT 1 -p tcp -s 192.168.0.3 --dport 22 -j ACCEPT
Пропускать исходящие пакеты с источником 192.168.0.3 на порт 22
Во-первых: с интерфейса(192.168.0.1), в нормальной ситуации, ни как не может вылететь пакет с source 192.168.0.3, в цепочке OUTPUT source ip пакета всегда есть ip интерфейса с которого пакет отправлен.
Во-вторых: порт назначения может быть любым, т.к. мы не знаем с какого порта будет инициировано соединение на удаленной машине. Здесь скорее надо --sport использовать.
Думаю ты хотел вот так: $IPT -I OUTPUT 1 -p tcp -d 192.168.0.3 --sport 22 -j ACCEPT
Важно понимать что у каждого TCP/IP пакета есть такие параметры как source ip, dest ip, source port и dest port. И в разных цепочках абсолютно идентичные пакеты должны фильтроваься по-разному. Например source ip в цепочке INPUT это "с какого ip к нам пришел пакет", а в цепочке OUTPUT это "с какого ip мы его отправили", понимаешь разницу? То же касается и --sport, и --dport
По поводу RELATED и ESTABLISHED:
В приведенных мною выше правилах есть один ньюанс, они разрешают инициировать соединение с порта 22 на ip 192.168.0.3,
и будучи параноиком можно запретить и это. Как сделать не запретив отвечать по ssh на ip 192.168.0.3?
Для этого и есть правила RELATED и ESTABLISHED, которые разрешают пакеты уже установленных tcp поединений.
P.S. Мое представление о работе iptables не претендует на точноть, т.е. могу ошибаться, я не спец в этом
$IPT -I INPUT 1 -p tcp -d 192.168.0.1 --dport 22 -j ACCEPT
Пропускать входящие tcp пакеты с назначением 192.168.0.1 на порт 22.
Это значит что пройдет любой пакет посланный на 192.168.0.1, разве ты этого хотел?
Думаю подразумевалось вот это: $IPT -I INPUT 1 -p tcp -s 192.168.0.3 --dport 22 -j ACCEPT
Т.е. пропускать трафик на ssh только с ip 192.168.0.3.
Если нужно разрешить всей локалке то можно в качестве источника указать подсеть, или разрешить соединения не с какого то ip, а с интерфейса вообще.
Далее: $IPT -I OUTPUT 1 -p tcp -s 192.168.0.3 --dport 22 -j ACCEPT
Пропускать исходящие пакеты с источником 192.168.0.3 на порт 22
Во-первых: с интерфейса(192.168.0.1), в нормальной ситуации, ни как не может вылететь пакет с source 192.168.0.3, в цепочке OUTPUT source ip пакета всегда есть ip интерфейса с которого пакет отправлен.
Во-вторых: порт назначения может быть любым, т.к. мы не знаем с какого порта будет инициировано соединение на удаленной машине. Здесь скорее надо --sport использовать.
Думаю ты хотел вот так: $IPT -I OUTPUT 1 -p tcp -d 192.168.0.3 --sport 22 -j ACCEPT
Важно понимать что у каждого TCP/IP пакета есть такие параметры как source ip, dest ip, source port и dest port. И в разных цепочках абсолютно идентичные пакеты должны фильтроваься по-разному. Например source ip в цепочке INPUT это "с какого ip к нам пришел пакет", а в цепочке OUTPUT это "с какого ip мы его отправили", понимаешь разницу? То же касается и --sport, и --dport
По поводу RELATED и ESTABLISHED:
В приведенных мною выше правилах есть один ньюанс, они разрешают инициировать соединение с порта 22 на ip 192.168.0.3,
и будучи параноиком можно запретить и это. Как сделать не запретив отвечать по ssh на ip 192.168.0.3?
Для этого и есть правила RELATED и ESTABLISHED, которые разрешают пакеты уже установленных tcp поединений.
P.S. Мое представление о работе iptables не претендует на точноть, т.е. могу ошибаться, я не спец в этом
Nothing ever changes...
-
loner
- Сообщения: 149
- ОС: Debian 5.0
Re: азы iptables
Замечательное обьяснение. Спасибо.
> Думаю подразумевалось вот это: $IPT -I INPUT 1 -p tcp -s 192.168.0.3 --dport 22 -j ACCEPT
Согласен
> Во-вторых порт назначения может быть любым
хм...
При установленном соединении
cat /proc/net/ip_conntrack
tcp 6 431999 ESTABLISHED src=192.168.0.3 dst=192.168.0.1 sport=1044 dport=22 packets=11382 bytes=652760 src=192.168.0.1 dst=192.168.0.3 sport=22 dport=1044 packets=17315 bytes=1885096 [ASSURED] mark=0 use=1
Это как? Windows использует 1044 порт (причем прошлый раз был другой )??????
Подскажите доку насчет портов (желательно с примерами на С и полегче
(пытался читать Стивенса "Unix разработка сетевых приложений" - ниасилил) ). Я почему то думал что если к примеру я конекчусь к 80 порту, то у меня на компьютере тоже открываеться 80 порт (и не мог понять как например при открытии Оперой 10 сайтов я с одного порта соединяюсь с восьмедисятыми портами разных ip адресов. )
Поменял как Вы написали, проблему это не решило.
Буду читать по поводу RELATED и ESTABLISHED.
> Думаю подразумевалось вот это: $IPT -I INPUT 1 -p tcp -s 192.168.0.3 --dport 22 -j ACCEPT
Согласен
> Во-вторых порт назначения может быть любым
хм...
При установленном соединении
cat /proc/net/ip_conntrack
tcp 6 431999 ESTABLISHED src=192.168.0.3 dst=192.168.0.1 sport=1044 dport=22 packets=11382 bytes=652760 src=192.168.0.1 dst=192.168.0.3 sport=22 dport=1044 packets=17315 bytes=1885096 [ASSURED] mark=0 use=1
Это как? Windows использует 1044 порт (причем прошлый раз был другой )??????
Подскажите доку насчет портов (желательно с примерами на С и полегче
Поменял как Вы написали, проблему это не решило.
Буду читать по поводу RELATED и ESTABLISHED.
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: азы iptables
loner писал(а): ↑09.10.2006 00:59Замечательное обьяснение. Спасибо.
> Думаю подразумевалось вот это: $IPT -I INPUT 1 -p tcp -s 192.168.0.3 --dport 22 -j ACCEPT
Согласен
> Во-вторых порт назначения может быть любым
хм...
При установленном соединении
cat /proc/net/ip_conntrack
tcp 6 431999 ESTABLISHED src=192.168.0.3 dst=192.168.0.1 sport=1044 dport=22 packets=11382 bytes=652760 src=192.168.0.1 dst=192.168.0.3 sport=22 dport=1044 packets=17315 bytes=1885096 [ASSURED] mark=0 use=1
Это как? Windows использует 1044 порт (причем прошлый раз был другой )??????
Клиент ssh (в вашем случай Винда) коннетится к серверу на 22-й порт. Но для обмена у клиента 22-й порт не должен открываться, это бы означало например что можно по SSH коннектится только из-под root'а потому что только root может на UNIX-машине этот порт открыть. Поэтому у клиента выбирается любой, первый попавшийся порт выше 1024.
При создании соединения серверу посылается пакет SYN, сервер отвечает пакетом SYN/ACK, клиент подтвержает получение ответа от сервера пакетом ACK после этого соединение считается установленным. Чтобы дальше проходил нормальный обмен между клиентом и сервером нужно разрешить установленные соединения:
iptables -A INPUT -p ALL -d 192.168.0.1 -m state --state ESTABLISHED,RELATED
-
VisualN
- Сообщения: 213
- ОС: Gentoo Linux
Re: азы iptables
С теми 2-мя правилами что я написал должно работать и без ESTABLISHED,RELATED
Nothing ever changes...
-
malor
- Сообщения: 335
Re: азы iptables
Я каждый раз перезагружаясь смотрю на вывод iptables -L и вижу пару строчек типа DROP(было дело, ставил когда-то...). Сьрасываю iptables -F, сохраняю iptables-save. Больше ничего не изменяю. Но при следующей загрузке те два правила снова как ни в чем не бывало на месте. Почему снова воскресают?
ASPLinux 11
ASPLinux 11
-
little Jon
- Сообщения: 212
Re: азы iptables
mallory писал(а): ↑09.10.2006 21:13Я каждый раз перезагружаясь смотрю на вывод iptables -L и вижу пару строчек типа DROP(было дело, ставил когда-то...). Сьрасываю iptables -F, сохраняю iptables-save. Больше ничего не изменяю. Но при следующей загрузке те два правила снова как ни в чем не бывало на месте. Почему снова воскресают?
11
iptables-save делает вывод правил. Похоже в приведенном примере вывод делается на консоль. А надо в файл iptables-save > my_iptables. Вместо my_iptables должен быть другой файл который загружает правила по умолчанию. я не использовал ASPLinux поэтому не знаю полное имя файла.
Linuxforum@conference.jabber.ru
-
loner
- Сообщения: 149
- ОС: Debian 5.0
Re: азы iptables
Вот так вот работает:
$IPT -A INPUT -p tcp -s 192.168.0.3 --dport 22 -j ACCEPT
$IPT -A OUTPUT -p tcp -d 192.168.0.3 -j ACCEPT
Но для второй цепочки указать --sport я не могу, потому что неизвесно на какой порт будет отправлять пакеты 192.168.0.1. А так небезопасно, потому что все открыто на выход для 192.168.0.3. А если нужно было бы открыть доступ для целой подсети? Тогда всем бы были на выход открыты все порты?
$IPT -A INPUT -p tcp -s 192.168.0.3 --dport 22 -j ACCEPT
$IPT -A OUTPUT -p tcp -d 192.168.0.3 -j ACCEPT
Но для второй цепочки указать --sport я не могу, потому что неизвесно на какой порт будет отправлять пакеты 192.168.0.1. А так небезопасно, потому что все открыто на выход для 192.168.0.3. А если нужно было бы открыть доступ для целой подсети? Тогда всем бы были на выход открыты все порты?
-
VisualN
- Сообщения: 213
- ОС: Gentoo Linux
Re: азы iptables
--sport в цепочке OUTPUT это твой порт, --sport 22 по идее должно работать, но раз не получается, тут как раз -m state --state ESTABLISHED,RELATED и поможет, вместо второго правила прописать:
iptables -A OUTPUT -p ALL -i имя_интерфейса(который 192.168.0.1) -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p ALL -i имя_интерфейса(который 192.168.0.1) -m state --state ESTABLISHED,RELATED -j ACCEPT
Nothing ever changes...