IPTABLES - составление правил [SOLVED]
Добрый день!
Прошу помочь форумчан с настройкой фаервола. После прочтения http://www.frozentux.net/documents/iptables-tutorial/ и всего что есть на ru.gentoo-wiki.com в голове полная каша.
Постановка задачи:
Есть роутер на Gentoo
в нем 3 сетевухи:
WAN: eth0 192.168.5.210
LAN3: eth1 192.168.3.254
LAN2: eth2 192.168.2.254
Задачи
есть прокси сервер 192.168.5.1:3128
можно ли для LAN2 192.168.2.0/24 перенаправлять все запросы по HTTP (порты 80, 8080, 3128) на проксик 192.168.5.1:3128
все остальные порты NAT'ить
далее в LAN3 есть несколько локальных серверов 192.168.3.252, *.251,*.253 - хочется что бы пользователи LAN2 ходили на них без проблем
Все компьютеры LAN2 не должны быть видны из WAN и LAN3(кроме 192.168.3.251)
для LAN3
Есть свой прокси крутится на 192.168.3.254, там же крутится DHCP+DDNS, Samba+OpenLDAP, NTP - нужно по максимуму защитить роутер от пользователей сети LAN3 без потери вышеперечисленного функционала
И еще я так и не понял какие политики ставить по умолчанию для INPUT, OUTPUT и FORWARD?
В мануале по IPTABLES так же сделаны дополнительные проверки через цепочку bad_tcp_packets и тд - я так понимаю мне тоже необходимо их ввести?
В общем кое что вроде понимаю но если кто в состоянии помочь и объяснить буду очень благодарен...
РЕШЕНО
Постановка задачи:
Есть роутер на Gentoo
в нем 3 сетевухи:
WAN: eth0 192.168.5.210
LAN3: eth1 192.168.3.254
LAN2: eth2 192.168.2.254
2 подсети LAN3 192.168.3.0/24 и LAN2 192.168.2.0/24
Задачи
Пускать всех из LAN2 в Интернет - NAT'ом через WAN
Пускать некоторые хосты из LAN3 в Интернет - NAT'ом через WAN
Пускать из LAN2 на некоторые серваки в LAN3
Не пускать никого из LAN3 в LAN2
Не пускать никого ниоткуда на роутер кроме разрешенных портов.
Проверять валидность пакетов если что не так не обрабатывать.
Решение скрипт firewall.sh:
-------------------------
#!/bin/bash
IPT='/sbin/iptables'
LAN2=eth2
LAN2_IP=192.168.2.254
LAN2_NET=192.168.2.0/24
LAN3=eth1
LAN3_IP=192.168.3.254
LAN3_NET=192.168.3.0/24
WAN=eth0
WAN_IP=192.168.5.210
WAN_NET=192.168.5.0/24
ALLOWED23_SERVERS='192.168.3.250 192.168.3.251 192.168.3.252 192.168.3.254'
ALLOWED_LAN3_HOSTS='192.168.3.250 192.168.3.251 192.168.3.202 192.168.3.241'
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
$IPT -F FORWARD
echo 1 > /proc/sys/net/ipv4/ip_forward
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done
# Создаем цепочку проверки правильности пакетов
$IPT -N bad_tcp_packets
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
# Для работы внутренних приложений разрешаем все пакеты на локальной петле
$IPT -A INPUT -p tcp -j bad_tcp_packets # Проверить плохие пакеты
$IPT -A INPUT -i lo -s 127.0.0.1 -j ACCEPT
$IPT -A INPUT -i lo -s ${LAN2_NET} -j ACCEPT
$IPT -A INPUT -i lo -s ${LAN3_NET} -j ACCEPT
$IPT -A INPUT -i lo -s ${WAN_NET} -j ACCEPT
# Входящие соединения к роутеру
#$IPT -A INPUT -i $WAN -d 224.0.0.0/8 -j DROP # блокируем широковещательные запросы с по SMB WAN
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить уже установленные соединения
$IPT -A INPUT -p tcp --dport http -i ${LAN3} -j ACCEPT # Разрешить ходить на http из LAN3
$IPT -A INPUT -p tcp --dport ssh -i ${LAN3} -j ACCEPT # Разрешить ходить на ssh из LAN3
$IPT -A INPUT -p tcp --dport rsync -i ${LAN3} -j ACCEPT # Разрешить rsync из LAN3
$IPT -A INPUT -p tcp --dport domain -i ${LAN3} -j ACCEPT # Разрешить DNS Lookup для LAN3
$IPT -A INPUT -p udp --dport domain -i ${LAN3} -j ACCEPT
$IPT -A INPUT -p udp --dport bootps:bootpc -i ${LAN2} -j ACCEPT # Разрешить DHCP для LAN2
$IPT -A INPUT -p udp --dport bootps:bootpc -i ${LAN3} -j ACCEPT # Разрешить DHCP для LAN3
$IPT -A INPUT -p udp --dport ntp -i ${LAN2} -j ACCEPT # Разрешить NTP для LAN2
$IPT -A INPUT -p udp --dport ntp -i ${LAN3} -j ACCEPT # Разрешить NTP для LAN3
$IPT -A INPUT -p icmp --icmp-type 8 -j ACCEPT # Разрешить пинговать роутер
$IPT -A INPUT -p icmp --icmp-type 11 -j ACCEPT # Разрешить трасить роутер
$IPT -P INPUT DROP # все остальные в сад!
# Форвард соединения
$IPT -A FORWARD -p tcp -j bad_tcp_packets # Проверить плохие пакеты
$IPT -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Разрешить уже установленные соединения
for i in ${ALLOWED23_SERVERS}; do
$IPT -A FORWARD -m conntrack --ctstate NEW -i ${LAN2} -s ${LAN2_NET} -o ${LAN3} -d $i -j ACCEPT
done
$IPT -A FORWARD -i ${LAN2} -o ${LAN3} -j DROP # запрещаем-с 2 -> 3, кроме исключений выше
$IPT -A FORWARD -m conntrack --ctstate NEW -i ${LAN2} -s 192.168.2.0/24 -j ACCEPT # Форвардить новые соединения приходящие с интерфейса LAN2 с адресами 192.168.2.0/24
for i in ${ALLOWED_LAN3_HOSTS}; do
$IPT -A FORWARD -m conntrack --ctstate NEW -i ${LAN3} -s $i -j ACCEPT
done
$IPT -P FORWARD DROP # все остальные в сад!
$IPT -t nat -F POSTROUTING # очистим POSTROUTING
$IPT -t nat -A POSTROUTING -o ${WAN} -j SNAT --to-source ${WAN_IP} # все что идет на eth0 подменять на 192.168.5.210
$IPT -t nat -A POSTROUTING -d 192.168.3.252 -o ${LAN3} -j SNAT --to-source ${LAN3_IP} # ходить с LAN2 на 192.168.3.252
$IPT -A OUTPUT -p tcp -j bad_tcp_packets # Проверить плохие пакеты
$IPT -P OUTPUT ACCEPT
- Для комментирования войдите или зарегистрируйтесь
Варианта вижу два:1. Самому
Варианта вижу два:
1. Самому досконально разобраться, постепенно идя от решения простых задач к более сложным.
2. Поставить shorewall, решить задачу с помощью не очень сложных конфигов, и используя полученные правила в iptables, не спеша заниматься пунктом 1
Сейчас Вы выбрали вариант -- настройте мне бесплатно фаервол :)
Для прокси-сервера: Если он не работает в режиме "прозрачности", то простой порт-форвардинг портов назначения клиентов сети2 не прокатит. Им нужно будет явно в настройках броузеров указывать прокси, а на роутере обеспечить маршрутизацию.
Правила для ната очень простые. По одному на сеть, если не заморачиваться.
Масса примеров в инете и документации.
Политики по умолчанию. Решает каждый сам. Политика пропускать пакеты уменьшает число правил за счет меньшей безопасности, политика по умолчанию не пропускать пакеты требует прописывания правил на каждый требуемый протокол в явном виде на всех цепочках, что по умолчанию закрыты.
На мой взгляд, ключ к понимаю работы таблиц -- каким образом через неё проходят пакеты. С этим нужно разобраться в первую очередь.
Добавлено.
WAN: eth0 192.168.5.210 -- это не WAN и натить туда бесполезно, если только у Вас 5 подсеть не имеет прозрачного выхода в инет.
(Sir) * Windows looks like an open door, but no way to go *
Солидарен со всем, кроме
Солидарен со всем, кроме одного:
Это утверждение поспешно, ибо есть провайдеры, которые раздают по одному ip клиентам из внутренних адресов. То есть, полезно или бесполезно натить сразу сказать нельзя — неизвестна топология сети в сторону .5. Но обратить внимание на Ваше мнение топикстартеру обязательно стоит.
emacs — отличная операционка которой не хватает только хорошего текстового редактора.
Ну так строчка после "если"
Ну так строчка после "если" (if) разве не описывает всё множество подобных случаев? ))) Из приведённого описания это не ясно, а наличие в пятой сети прокси с адресом этой же сети, позволят с долей вероятности считать, что это не сесть провайдера.
В общем, если из 5 подсети любой хост без извращений имеет инет, то можно натить.
(Sir) * Windows looks like an open door, but no way to go *
в пятой сети все клиенты в
в пятой сети все клиенты в инет ходят через прокси без авторизации - все остальные порты оттуда натятся наружу для клиентов той же 5й сети
Тогда можно в цепочке nat
Тогда можно в цепочке nat POSTROUTING указать по правилу для 2 и 3 сети
И если http будет работать, можно специально на проксю людей не затаскивать -- это уже сделано в пятой сети. Если будут работать другие сервисы, кроме http, тогда портфорвардинг 80 на 3182 решит эту проблему.
(Sir) * Windows looks like an open door, but no way to go *
Задача размыта, давай начнем
Задача размыта, давай начнем с её конкретизаии. Верна ли такая постановка?
дано роутер в нем 3 сетевухи:
WAN: eth0 192.168.5.210 == сеть 5
LAN3: eth1 192.168.3.254 == сеть 3
LAN2: eth2 192.168.2.254 == сеть 2
Задачи
непосредственное обращение к роутеру блокируется.
.2 <=> .5
2:web перенаправляется на 5.1:proxy
остальные соединения 2->5 натятся
2 <=> 3
2 имеют доступ к серверам 3 и только
3.251 имеет доступ к 2
остальной обмен 2 <=> 3 блокируется
3 <=> 5
блокируется
3.254 настраивается отдельно, ибо он в третьей сети
emacs — отличная операционка которой не хватает только хорошего текстового редактора.
все верно
все верно
Я могу ошибаться, но похоже, что тебе надо что-то такое.
Дефолт правил - DROP
Таблица COMMON используется для общих проверок в ней - отброс пакетов, которые нельзя идентифицировать, отброс явной ерунды и разрешение уже установленных соединений.
Разрешение работы с серверами
Перенаправление на прокси и нат.
Рекомендую для составления правил писать скрипты. Можешь ознакомиться с вариантом для этой задачки. Хоть это и простой набросок, но, думаю, идея ясна.
emacs — отличная операционка которой не хватает только хорошего текстового редактора.
Эти правила уже не работают:
Эти правила уже не работают: цепока FORWARD имеет политику DROP, а раз все сливается в цепочку COMMON_TABLE то не вижу правил для пакетов пакетов --state NEW для случая -i eth2 -o eth0. Вообщем закваска не рабочая. Через FORWARD транзитный трафик не пройдет в WAN. Не забудте так же про файл /etc/sysctl.conf ... ну или sysctl -w net.ipv4.ip_forward=1 пропишите в скрипте
Цитата: цепока FORWARD имеет
Да надо же?
А чем отличается --jump от --goto? может посмотрим-с? ) И пройдемся-таки по мануалам.
Если правило внутри COMMON_TABLE не обработано, то управление возвращается назад.
emacs — отличная операционка которой не хватает только хорошего текстового редактора.
Ну давай пройдемся, только
Ну давай пройдемся, только без грубости, я всего лишь хочу помочь:
1. Как я понял пытаемся входящий пакет из eth2 -> eth0 (dport 80,443) переправить на прокси.
Итак пакет попадает из eth2 в таблицу mangle цепочки PREROUTING но там нет никаких правил она уйдет в таблицу nat. Там встретит правило:
-A PREROUTING -i eth2 -o eth0 -s 192.168.2.0/24 --m multiport -dports 80,443 -j TRPROXY --on-port 3128 -on-ip 192.168.5.1
Мало того что по мануалу сказано:
TPROXY
This target is only valid in the mangle table, in the PREROUTING chain and user-defined chains which are only called from this chain.
то есть твое правило дб определено в таблице мангл а не нат, цепоки PREROUTING. Так у тебя еще куча ошибок - дб так:
-A PREROUTING -i eth2 -o eth0 -s 192.168.2.0/24 -p tcp -m multiport --dports 80,443 -j TRPROXY --on-port 3128 --on-ip 192.168.5.1
2. Там же сказано (мануале), что:
It redirects the packet to a local socket without changing the packet header in any way.
--on-port port
This specifies a destination port to use. It is a required option, 0 means the new destination port is the same as the original. This is only valid if the rule also specifies -p tcp or -p udp.
--on-ip address
This specifies a destination address to use. By default the address is the IP address of the incoming interface. This is only valid if the rule also specifies -p tcp or -p udp.
Конклужн: По сути это действо работает как если бы мы перенесли прокси с одного порта на другой и изменением интерфейса - НО в пределах машины: что бы оно работало нужно явно указать протокол, этого требует как --on-port так и -m multiport --dports, так и указать на каком интерфейсе биндится локальный прокси. На 192.168.1.5 не прокатит по этому правилу отправлять пакеты. Для этого есть DNAT.
А по поводу твоего замечания "Если правило внутри COMMON_TABLE не обработано, то управление возвращается назад" - с тобой полностью согласен с одним но по мануалам если кончились правила то сработает политика по умолчанию - DROP.
Допустим мы и это побороли - но та же самая фигня остается с OUTPUT - исходящий локальный трафик от шлюза заблокирован с самым первым пакетом SYN.
Начнем с конца Цитата: А по
Начнем с конца
забей и пропингуй. http://dpaste.com/153478/
Удивишься, но получится. И политика DROP в случае с роутингом топикстартера выбрана не напрасно. Нельзя всё, кроме того, что можно. И это я уточнял выше - "всё ли правильно?" Топикстартер сказал - да. И в этом есть здравая мысль. Сам шлюз никуда не суётся. Ибо не фиг. Когда топикстартер определится что именно может шлюз, тогда и добавит правила сам.
С протоколом абсолютно согласен. Я и не претендую на готовое решение. Если уж ты собрался придираться, то что ж твой глаз великого гуру не заметил самой явной ошибочки?
/sbin/iptables -A FORWARD -i eth2 -o eth1 -d 192.168.3.252 192.168.3.251 192.168.3.253 -j ACCEPT . Это ж заготовка на три правила, а не одно, и так она работать не будет.
Или всё то же использование -o в PREROUTING
решение -то под носом:
/sbin/iptables -A FORWARD -i eth2 -o eth1 -d 192.168.3.253 -j ACCEPT
/sbin/iptables -A FORWARD -i eth2 -o eth1 -d 192.168.3.251 -j ACCEPT
/sbin/iptables -A FORWARD -i eth2 -o eth1 -d 192.168.3.252 -j ACCEPT
/sbin/iptables -t nat -A PREROUTING -i eth2 -s 192.168.2.0/24 -p tcp -m multiport --dport 80,... -j DNAT --to-destination 192.168.1.5:3128
А в общем -
Давай-ка без грубости.
С форвардингом на прокси, да не не то. В остальном — верно.
Критикуешь - предлагай.
emacs — отличная операционка которой не хватает только хорошего текстового редактора.
Цитата: забей и пропингуй.
В скрипте у тебя -P FORWARD DROP, а в ссылке -P FORWARD ACCEPT
По поводу "Критикуешь - предлагай" +1. В итоге вместе с тобою мы более-менее предложили афтару что-то рабочее ...
Всем спасибо буду смотреть -
Всем спасибо буду смотреть - если что отпишусь.
Вопрос сразу же - прокси обязательно должен прозрачным?
Я могу ошибаться, но это не
Я могу ошибаться, но это не критерий. То есть допустимо и так, и так. Но в случае "непрозрачного" прокси для внешнего мира все запросы будут идти от имени одного клиента - роутера, в то же время "прозрачный" ленится о себе сообщать вообще.
emacs — отличная операционка которой не хватает только хорошего текстового редактора.
Разобратся самому получилось
Разобратся самому получилось самым толковым советом хотя мож где то и накосячил
Собственно почитав все все еще раз - сел за написание с 0
вот что вышло
Единственное изменение начальных условий - прокси 192.168.5.1 непрозрачный потому пока клиенты прописывают его ручками у себя в браузере
Ну и своя прокси пока не накручена.
Скрипт:
#!/bin/bash
IPT='/sbin/iptables'
LAN2=eth2
LAN2_IP=192.168.2.254
LAN2_NET=192.168.2.0/24
LAN3=eth1
LAN3_IP=192.168.3.254
LAN3_NET=192.168.3.0/24
WAN=eth0
WAN_IP=192.168.5.210
WAN_NET=192.168.5.0/24
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
$IPT -F FORWARD
echo 1 > /proc/sys/net/ipv4/ip_forward
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done
# Создаем цепочку проверки правильности пакетов
$IPT -N bad_tcp_packets
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
# Для работы внутренних приложений разрешаем все пакеты на локальной петле
$IPT -A INPUT -p tcp -j bad_tcp_packets # Проверить плохие пакеты
$IPT -A INPUT -i lo -s 127.0.0.1 -j ACCEPT
$IPT -A INPUT -i lo -s ${LAN2_NET} -j ACCEPT
$IPT -A INPUT -i lo -s ${LAN3_NET} -j ACCEPT
$IPT -A INPUT -i lo -s ${WAN_NET} -j ACCEPT
# Входящие соединения к роутеру
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить уже установленные соединения
$IPT -A INPUT -p tcp --dport http -i ${LAN3} -j ACCEPT # Разрешить ходить на http из LAN3
$IPT -A INPUT -p tcp --dport ssh -i ${LAN3} -j ACCEPT # Разрешить ходить на ssh из LAN3
$IPT -A INPUT -p tcp --dport rsync -i ${LAN3} -j ACCEPT # Разрешить rsync из LAN3
$IPT -A INPUT -p tcp --dport domain -i ${LAN3} -j ACCEPT # Разрешить DNS Lookup для LAN3
$IPT -A INPUT -p udp --dport domain -i ${LAN3} -j ACCEPT
$IPT -A INPUT -p tcp --dport domain -i ${LAN2} -j ACCEPT # Разрешить DNS Lookup для LAN2
$IPT -A INPUT -p udp --dport domain -i ${LAN2} -j ACCEPT
$IPT -A INPUT -p udp --dport bootps:bootpc -i ${LAN2} -j ACCEPT # Разрешить DHCP для LAN2
$IPT -A INPUT -p udp --dport bootps:bootpc -i ${LAN3} -j ACCEPT # Разрешить DHCP для LAN3
$IPT -A INPUT -p udp --dport ntp -i ${LAN2} -j ACCEPT # Разрешить NTP для LAN2
$IPT -A INPUT -p udp --dport ntp -i ${LAN3} -j ACCEPT # Разрешить NTP для LAN3
$IPT -A INPUT -p icmp --icmp-type 8 -j ACCEPT # Разрешить пинговать роутер
$IPT -A INPUT -p icmp --icmp-type 11 -j ACCEPT # Разрешить трасить роутер
$IPT -P INPUT DROP # все остальные в сад!
# Форвард соединения
$IPT -A FORWARD -p tcp -j bad_tcp_packets # Проверить плохие пакеты
$IPT -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Разрешить уже установленные соединения
$IPT -A FORWARD -m conntrack --ctstate NEW -i ${LAN2} -s 192.168.2.0/24 -j ACCEPT # Форвардить новые соединения приходящие с интерфейса LAN2 с адресами 192.168.2.0/24
$IPT -A FORWARD -m conntrack --ctstate NEW -i ${LAN3} -s 192.168.3.250 -j ACCEPT # Форвардить новые соединения приходящие с интерфейса LAN3 с адресами 192.168.3.250
$IPT -A FORWARD -m conntrack --ctstate NEW -i ${LAN3} -s 192.168.3.251 -j ACCEPT # и 192.168.3.251
$IPT -A FORWARD -m conntrack --ctstate NEW -i ${LAN3} -s 192.168.3.202 -j ACCEPT # и 192.168.3.202
$IPT -A FORWARD -m conntrack --ctstate NEW -i ${LAN3} -s 192.168.3.241 -j ACCEPT #
IPT -P FORWARD DROP # все остальные в сад!
$IPT -t nat -F POSTROUTING # очистим POSTROUTING
$IPT -t nat -A POSTROUTING -o ${WAN} -j SNAT --to-source ${WAN_IP} # все что идет на eth0 подменять на 192.168.5.210
$IPT -t nat -A POSTROUTING -d 192.168.3.252 -o ${LAN3} -j SNAT --to-source ${LAN3_IP} # ходить с LAN2 на 192.168.3.252
$IPT -A OUTPUT -p tcp -j bad_tcp_packets # Проверить плохие пакеты
$IPT -P OUTPUT ACCEPT
Смущает пока ток последнее правило ната - как сделать так что бы те кто ломится на из LAN2 в LAN3 могли попадать ток на 192.168.3.252 251 и 250 ?
в текущем состоянии ходить можно из 2ой сети куда хошь
Кажется, что-то забыли,
Кажется, что-то забыли, очепяточка ;)
Смущаться не стоит ) ты просто забыл добавить два типа правил для потока NET2 -> NET3:
1. Разрешить конкретной подсети стучать к конкретному серверу другой подсети.
2. Запретить подсети клиентов стучать в подсеть сервера кроме исключений выше.
Это можно сделать примерно так:
emacs — отличная операционка которой не хватает только хорошего текстового редактора.
Та то следствия копирования -
Та то следствия копирования - в оригинале все стоит, попробую как до работы доберусь.
Вопрос а не должно ли
$IPT -A FORWARD -i ${LAN2} -o ${LAN3} -j DROP # запрещаем-с 2 -> 3, кроме исключений выше
работать само по себе по причине политики DROP для FORWARD цепочки?
конечно нет, ибо ниже
конечно нет, ибо ниже строка
$IPT -A FORWARD -m conntrack --ctstate NEW -i ${LAN2} -s 192.168.2.0/24 -j ACCEPT # Форвардить новые соединения
emacs — отличная операционка которой не хватает только хорошего текстового редактора.
Сработало спасибо
Сработало спасибо только
ALLOWED23_SERVERS='192.168.3.250 192.168.3.251 192.168.3.252 192.168.3.254'
for i in ${ALLOWED23_SERVERS}; do
$IPT -A FORWARD -m conntrack --ctstate NEW -i ${LAN2} -s ${LAN2_NET} -o ${LAN3} -d $i -j ACCEPT
done
$IPT -A FORWARD -i ${LAN2} -o ${LAN3} -j DROP # запрещаем-с 2 -> 3, кроме исключений выше
Нормальненько. Но с сылкой я
Нормальненько. Но с ссылкой я имел ввиду цепку OUTPUT
Это я к тому, что DROP в политике не така уж и дурная штука, а имхо, нужная.
emacs — отличная операционка которой не хватает только хорошего текстового редактора.
kstati
А ssh-лить роутером как? ) И еще, возможно, будут исключения.
(Sir) * Windows looks like an open door, but no way to go *
Все верно )
Все верно
)
emacs — отличная операционка которой не хватает только хорошего текстового редактора.