38 заметок с тегом

linux

Ctrl + ↑ Позднее

IPTABLES (firewall)

4 мая 2012, 9:55
iptables -t filter -nL — отобразить все цепочки правил

iptables -nL — отобразить все цепочки правил

iptables -t nat -L -отобразить все цепочки правил в NAT-таблице

iptables -t filter -F — очистить все цепочки правил в filter-таблице

iptables -F — очистить все цепочки правил в filter-таблице

iptables -t nat -F -очистить все цепочки правил в NAT-таблице

iptables -t filter -X -удалить все пользовательские цепочки правил в filter-таблице

iptables -t filter -A INPUT -p tcp —dport telnet -j ACCEPT — позволить входящее подключение telnet'ом

iptables -t filter -A OUTPUT -p tcp —dport http -j DROP -блокировать исходящие HTTP-соединения

iptables -t filter -A FORWARD -p tcp —dport pop3 -j ACCEPT  — позволить «прокидывать» (forward) POP3-соединения

iptables -t filter -A INPUT -j LOG —log-prefix «DROP INPUT»  — включить журналирование ядром пакетов, проходящих через цепочку INPUT, и добавлением к сообщению префикса «DROP INPUT»

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE -включить NAT (Network Address Translate) исходящих пакетов на интерфейс eth0. Допустимо при использовании с динамически выделяемыми ip-адресами.

iptables -t nat -A PREROUTING -d 192.168.0.1 -p tcp -m tcp —dport 22 -j DNAT —to-destination 10.0.0.2:22  — перенаправление пакетов, адресованных одному хосту, на другой хост

iptables -A INPUT -p tcp —syn —dport 23 -m connlimit —connlimit-above 2 -j REJECT — допускать не больше 2 соединений telnet с одного хоста

iptables -p tcp —syn —dport 80 -m connlimit —connlimit-above 16 —connlimit-mask 24 -j REJECT — ограничить число одновременных запросов http до 16 на подсеть класса C (24 первых разряда)
Примечание: Чтобы отменить ошибочное правило не обязательно очищать все цепочки правил, для  этого в опции iptables есть команда
-A, —append означает -добавить одно или несколько правил в конец указанной цепочки.

-D, —delete удалить

Так в нашем случае:

iptables -t filter -D OUTPUT -p tcp —dport http -j DROP — отменяет заданную нами ранее блокировку исходящих HTTP-соединений

можно также

iptables -t nat -D POSTROUTING 1
где 1 это номер правила по порядку, или удаляем все правила из таблицы POSTROUTING
iptables -t nat -F POSTROUTING

Еще примеры использования iptables:

Прописываем правила, закрывающие все порты за исключением 25 (smtp: принимаем почту) и 80 (http: показываем web страницы)

# iptables -A INPUT -i eth1 -p tcp —dport 25 -j ACCEPT
# iptables -A INPUT -i eth1 -p tcp —dport 80 -j ACCEPT
# iptables -A INPUT -i eth1 -p tcp -m tcp —tcp-flags FIN,SYN,ACK SYN -j REJECT —reject-with icmp-port-unreachable
# iptables -A FORWARD -o eth1 -p tcp -j DROP
Теперь наш сервер прикрыт с внешнего мира. Запуск команд netcat и nmap c самого сервера покажет тоже, что и до внесения правил, но если пробовать с другого компьютера, то заметим результат: доступ везде прикрыт, кроме как на разрешённые нами 25 и 80 порты.

iptables -t nat -A POSTROUTING -s 10.0.3.41 -d 217.217.217.217 -o eth1 -p tcp —dport 25 -j SNAT —to 116.116.116.116
Разрешаем прямой доступ к внешней почте. Подробнее: разрешаем доступ хосту 10.0.3.41 из внутренней сети обращаться к хосту 217.217.217.217 на 25 порт (smtp) протокола tcp; такие обращения пропускаем через интерфейс eth1, который имеет адрес 116.116.116.116
Для доступа к РОР добавляем такое же правило для порта 110

iptables -t nat -A POSTROUTING -s 10.0.3.41 -p tcp —dport 25 -j MASQUERADE
Более короткое правило, аналогичное вышеприведённому, только здесь пользователь с ip 10.0.3.41 имеет доступ к любому почтовому серверу в Интернете.




Можно посмотреть действующие правила в виде команд:
# iptables-save

Чтобы запомнить эти правила сохраняем новую конфигурацию в этот файл:

# iptables-save > /etc/sysconfig/iptables
Теперь при запуске системы прописанные нами правила восстановятся.



Дополнение: Разрешаем маршрутизацию на на один раз до перезагрузки
sysctl -w net.ipv4.ip_forward=1
Проверить
sysctl -a |grep forwarding
увидеть net.ipv4.conf.lo.forwarding = 1 или 0 если не открыт
Для того чтобы правило вступало в силу и после перезагрузки заходим в /etc/net/sysctl.conf находим
net.ipv4.ip_forward = 0 и изменяем на 1



Проверим, осуществляется ли автоматический запуск iptables, то есть запускается при перезагрузки сервера проверяем
chkconfig —list iptables
iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off
видим, что нет. Добавляем и проверяем:
chkconfig —level 35 iptables on
chkconfig —list iptables
iptables 0:off 1:off 2:off 3:on 4:off 5:on 6: off



http://www.opennet.ru/docs/RUS/iptables/
http://ru.wikipedia.org/wiki/Iptables
linux

Маршрутизация через несколько каналов/провайдеров.

4 мая 2012, 9:53
http://www.opennet.ru/docs/RUS/LARTC/x348.html#SPLITACCESS

Ниже представлена обычная конфигурация, когда локальная сеть (или даже одна машина) подключена к Internet через двух провайдеров.

________
+—————+ /
| | |
+—————-
+ Провайдер 1+——-
__ | | | /
___/ \_ +——
+——-+ +—————+ |
_/ \__ | if1 | /
/ \ | Linux | |
| Локальная сеть—-+ маршрутизатор| | Internet
\_ __/ | | |
\__ __/ | if2 | \
\___/ +——
+——-+ +—————+ |
| | | \
+—————-+ Провайдер 2+——-
| | |
+————+ \________




В этом случае обычно возникает два вопроса.

4.2.1. Раздельный доступ

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

Давайте определим некоторые переменные. Пусть $IF1 будет именем первого интерфейса (if1 на рисунке), а $IF2 — именем второго. Тогда $IP1 будет IP адресом $IF1 , а $IP2 — IP адресом $IF2 . Далее, $P1 это IP-адрес шлюза провайдера 1, а $P2 — IP адрес шлюза провайдера 2. Наконец, $P1_NET это IP сеть, к которой принадлежит $P1 , а $P2_NET — сеть, к которой принадлежит $P2 .

Создадим две дополнительные таблицы маршрутизации, скажем T1 и T2. Добавим их в файл /etc/iproute2/rt_tables. Теперь можно настроить эти таблицы следующими командами:

ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2


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

Теперь нужно настроить главную таблицу маршрутизации. Хорошо бы маршрутизировать пакеты для сетей провайдеров через соответствующие интерфейсы. Обратите внимание на аргумент `src', который обеспечивает правильный выбор исходного IP-адреса.

ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2


Теперь задаем маршрут по умолчанию:

ip route add default via $P1


Зададим правила маршрутизации. Они будут отвечать за то, какая таблица будет использоваться при маршрутизации. Вы хотите, чтобы пакет с определенным адресом источника маршрутизировался через соответствующий интерфейс:

ip rule add from $IP1 table T1
ip rule add from $IP2 table T2


Этот набор команд обеспечивает маршрутизацию ответов через интерфейс, на котором был получен запрос.

Внимание!

Заметка читателя Рода Роака (Rod Roark): ' если $P0_NET это локальная сеть, а $IF0 — соответствующий ей интерфейс, желательно задать следующие команды:

ip route add $P0_NET dev $IF0 table T1
ip route add $P2_NET dev $IF2 table T1
ip route add 127.0.0.0/8 dev lo table T1
ip route add $P0_NET dev $IF0 table T2
ip route add $P1_NET dev $IF1 table T2
ip route add 127.0.0.0/8 dev lo table T2


Итак, мы рассмотрели очень простой пример. Он будет работать для всех процессов, выполняющихся на маршрутизаторе и для локальной сети, если настроено преобразование адресов (NAT/masquerading). В противном случае, вам будет необходим диапазон IP адресов обоих провайдеров, или выполнять маскирование для одного из провайдеров. В любом случае, вы можете задать правила выбора провайдера для каждого конкретного адреса вашей локальной сети.

4.2.2. Распределение нагрузки.

Второй вопрос заключается в балансировке нагрузки между двумя провайдерами. Это не сложно, если у вас уже настроен раздельный доступ, описанный в предыдущем разделе.

Вместо выбора одного из провайдеров в качестве маршрута по-умолчанию, вы настраиваете т. н. многолучевой (multipath) маршрут. В стандартном ядре это обеспечит балансировку нагрузки между двумя провайдерами. Делается это следующим образом (повторюсь, мы основываемся на примере из раздела Раздельный доступ):

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
nexthop via $P2 dev $IF2 weight 1


Результатом команды будет попеременный выбор маршрута по-умолчанию. Вы можете изменить параметр weight, так чтобы один из провайдеров получал большую нагрузку.

Обратите внимание, что балансировка не будет идеальной, так как она основывается на маршрутах, а маршруты кэшируются. Это означает, что маршруты к часто посещаемым сайтам не будут проходить через разных провайдеров.

Если вы действительно интересуетесь этим, вам стоит посмотреть на патчи Юлиана Анастасова (Julian Anastasov), расположеные по адресу http://www.ssi.bg/~ja/#routes. Они могут вам помочь.
linux

Настройка маршрутизации в Ubuntu Linux, для начинающих

4 мая 2012, 9:51
Оригинал: http://forum.ubuntu.ru/index.php?topic=12454.

Правила маршрутизации определяют, куда отправлять IP-пакеты. Данные
маршрутизации хранятся в одной из таблиц ядра. Вести таблицы
маршрутизации можно статически или динамически. Статический маршрут —
это маршрут, который задается явно с помощью команды route.
Динамическая маршрутизация выполняется процессом-демоном (routed или
  gated), который ведет и модифицирует таблицу маршрутизации на основе
сообщений от других компьютеров сети. Для выполнения динамической
маршрутизации разработаны специальные протоколы: RIP, OSPF, IGRP, EGP,
BGP и т. д.

Динамическая маршрутизация необходима в том случае, если у вас
сложная, постоянно меняющаяся структура сети и одна и та же машина
может быть доступна по различным интерфейсам (например, через разные
Ethernet или SLIP интерфейсы). Маршруты, заданные статически, обычно
не меняются, даже если используется динамическая маршрутизация.
Для персонального компьютера, подключаемого к локальной сети, в
  большинстве ситуаций бывает достаточно статической маршрутизации
командой route. Прежде чем пытаться настраивать маршруты, просмотрите
таблицу маршрутизации ядра с помощью команды netstat -n -r. Вы должны
увидеть что-то вроде следующего

rigon@ubuntu-comp:~$ netstat -n -r

Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.254.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.254.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
0.0.0.0 192.168.254.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.254.1 0.0.0.0 UG 0 0 0 eth1


Если таблица пуста, то вы увидите только заголовки столбцов. Тогда
надо использовать route. С помощью команды route можно добавить или
  удалить один (за один раз) статический маршрут. Вот ее формат:

route -f операция -тип адресат шлюз интерфейс


Здесь аргумент операция может принимать одно из двух значений: add
(маршрут добавляется) или delete (маршрут удаляется). Аргумент адресат
может быть IP-адресом машины, IP-адресом сети или ключевым словом
default . Аргумент шлюз  — это IP-адрес компьютера, на который
следует пересылать пакет (этот компьютер должен иметь прямую связь с
  вашим компьютером). Команда

route -f


удаляет из таблицы данные обо всех шлюзах. Необязательный аргумент тип
принимает значения net или host . В первом случае в поле адресата
указывается адрес сети, а во втором — адрес конкретного компьютера
(хоста).

Как правило, бывает необходимо настроить маршрутизацию по
  упоминавшимся выше трем интерфейсам:
* локальный интерфейс (lo),
* интерфейс для платы Ethetnet (eth0),
* интерфейс для последовательного порта (PPP или SLIP).

Локальный интерфейс поддерживает сеть с IP-номером 127.0.0.1. Поэтому
для маршрутизации пакетов с адресом 127.... используется команда:

route add -net 127.0.0.1 lo


Если у вас для связи с локальной сетью используется одна плата
Ethernet, и все машины находятся в этой сети (сетевая маска
255.255.255.0), то для настройки маршрутизации достаточно вызвать:

route add -net 192.168.36.0 netmask 255.255.255.0 eth0


Если же вы имеете насколько интерфейсов, то вам надо определиться с
  сетевой маской и вызвать команду route для каждого интерфейса.
Поскольку очень часто IP-пакеты с вашего компьютера могут отправляться
не в одну единственную сеть, а в разные сети (например, при просмотре
разных сайтов в Интернете), то в принципе надо было бы задать очень
много маршрутов. Очевидно, что сделать это было бы очень сложно,
точнее просто невозможно. Поэтому решение проблемы маршрутизации
пакетов перекладывают на плечи специальных компьютеров —
маршрутизаторов, а на обычных компьютерах задают маршрут по умолчанию,
который используется для отправки всех пакетов, не указанных явно в
  таблице маршрутизации. С помощью маршрута по умолчанию вы говорите
ядру «а все остальное отправляй туда». Маршрут по умолчанию
настраивается следующей командой:

route add default gw 192.168.1.1 eth0


Опция gw указывает программе route, что следующий аргумент — это
IP-адрес или имя маршрутизатора, на который надо отправлять все
пакеты, соответствующие этой строке таблицы маршрутизации.
Вот немного теории с сайта linuxcenter.ru

А теперь пример из жизни
Имеются следующие интерфейсы /etc/network/interfaces

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.17.8
hwaddress ether 00:E0:4C:A2:C4:48
netmask 255.255.255.0
broadcast 192.168.17.255
auto eth1
iface eth1 inet static
address 192.168.254.2
netmask 255.255.255.0
gateway 192.168.254.1
broadcast 192.168.254.255


Интерфейс eth0 это связь с локальной сетью состоящей из 20 подсетей
192.168.1.х-192.168.20.х

Интерфейс eth1 это связь с ADSL модемом с выходом в интернет. Так
большинство запросов идут в Инет на этом интерфейсе прописываем шлюз
(gateway 192.168.254.1) данный параметр указывает в системе шлюз
по-умолчанию, обращаю внимание, что шлюз надо прописывать только на
  одном интерфейсе, иначе в системе появятся 2 маршрута по умолчанию и
  естно будет затупление в работе. С интернетом разобрались.

Но требуется еще просматривать ресурсы локальной сети
для этого надо выполнить вот эти команды

route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.17.254 eth0
route add -net 192.168.12.0 netmask 255.255.255.0 gw 192.168.17.254 eth0
route add -net 192.168.21.0 netmask 255.255.255.0 gw 192.168.17.254 eth0


На этом примере маршрутизируются 3 подсети

Все эти команды и многие другие можно прописать в файлк
/etc/network/interfaces в итоге получится следующее:

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.17.8
hwaddress ether 00:E0:4C:A2:C4:48
netmask 255.255.255.0
broadcast 192.168.17.255
up route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.17.254 eth0
up route add -net 192.168.12.0 netmask 255.255.255.0 gw 192.168.17.254 eth0
up route add -net 192.168.21.0 netmask 255.255.255.0 gw 192.168.17.254 eth0
auto eth1
iface eth1 inet static
address 192.168.254.2
netmask 255.255.255.0
gateway 192.168.254.1
broadcast 192.168.254.255


Ну вот и все по аналогии настраиваются любое кол-во маршрутов и
  сетевых интерфейсов

Дополнение 1.

Обратите внимание

hwaddress ether 00:E0:4C:A2:C4:48


так легко можно изменить MAC, не забываем после редактирования файла
делать рестарт

sudo /etc/init.d/networking restart


Дополнение 2.

Следует отметить, что:
1) Для того, чтобы просмотреть таблицу маршрутов достаточно запуска
команды route без параметров или route -n, если в сети нет DNS.
2) Маска может быть записана проще, в виде /x, где x — число единичных
битов, например:

route add -net 192.168.36.0/24 eth0


вместо

route add -net 192.168.36.0 netmask 255.255.255.0 eth0


Настройки сети размещаются в файле /etc/network/interfaces
При подключение к Inet через VPN (ppp0...), необходимо заменять
маршрут по умолчанию на ppp0.

А проще указать в файле /etc/ppp/options следующее:

defaultroute
replacedefaultroute


тогда маршрут заменяется сам и при отключении восстанавливается.

Дополнение 3.

Есть прога, серверная часть которой стоит во внутренней сети, например
Radmin Server, чтобы к нему подключиться клиентская прога (Radmin
Viewer) запрашивает соединение по порту 4799 (например). Все работает
внутри локальной сети. Есть шлюз (с внешним IP), через который
обеспечивает доступ в и-нет всех компов внутренней сети. Теперь
вопрос, как настроить шлюз, чтобы при обращении из вне клиентсокой
частью к IP шлюза по порту 4799, он пробрасывал этот запрос дальше,
например на 192.168.0.2 по томуже порту?

Для этого есть команда iptables:

iptables -t nat -D PREROUTING -i <интерфейс> -s <IP откуда будет коннект>
-p tcp —dport 4899 -j DNAT —to-destination 192.168.0.2:4899


Если ограничивать входящие IP не требуется, то опцию -s можно
опустить.
Пример:

iptables -t nat -D PREROUTING -i vlan1 -s 213.87.34.20/24 -p tcp
 —dport 4899 -j DNAT —to-destination 192.168.128.24:4899

iptables -t nat -A PREROUTING -i eth0 -p udp —dport 3658 -j DNAT
 —to-destination 192.168.0.2:3658
linux   ubuntu

Утилита Screen

4 мая 2012, 9:47
Введение

Данная утилита GNU Screen имеет множество функций. Очень удобно использовать эту утилиту при удаленном подключении к системе по ssh. Но наиболее частое ее применение — сворачивание в фон программ, которые сами этого не умеют, с возможностью последюущего возврата к ним. это может быть полезно при работе с программами, которые реализованы не в виде «демон+клиент», а единым целым, и не работают без запуска интерфейса. Типичный пример — rtorrent, который при всех своих преимуществах запускается только в виде консольного интерфейса, а в фон уходить не умеет, можно только «выйти вообще». Его и возьмем в качестве примера.

Запуск и основы работы Screen

Screen создает отдельные объекты, называемые иногда «скринами». Каждый скрин — это что-то вроде окна, которое можно свернуть-развернуть, если проводить аналогию с графическим интрефейсом. Только вместо окна вы получаете виртуальную консоль, которую можно отправить в фон или вывести на передний план, и в которой запускается указанное приложение.
Простейший запуск осуществляется командой:

screen

При запуске в таком виде, т. е. без параметров, программа создаст новый скрин, в котором откроет сессию командной оболочки, как если бы вы залогинились в tty-консоли или открыли новую вкладку в графическом терминале, для наглядности выполните что-нибудь в командной строке — например, ls.
Теперь о том, как свернуть запущенный скрин вместе со всем, что в нем работает. Для этого нужно нажать Ctrl+A, после чего нажать D. в принципе, это единственная комбинация, которую простому пользователю стоит запомнить. Сtrl+A переведет screen в командный режим. клавиша D даст команду свернуть текущий скрин. Теперь вы можете закрыть терминал или разлогиниться с tty-консоли — запущенный в свернутом скрине процесс продолжит работу в фоне.
Для того, чтобы вернуться к свернутому скрину, достаточно запустить:

screen -r

Ключ -r как раз и укажет программе, что нужно развернуть свернутый скрин (если таковой, конечно, имеется). Перед вами должна предстать та самая сессия в консоли, которую вы свернули, со всем, что в ней было.
Теперь выйдете из сессии с помощью команды exit. Screen сообщит о завершении своей работы. Таким образом, вам достаточно выйти из запущенного в скрине процесса, а screen выключится сама.
Далее запустим вышеупомянутый rtorrent. Делается это предельно просто — нужно указать screen команду для запуска. Тогда вместо командной оболочки откроется указанная программа:

screen rtorrent

Перед вами открылся rtorrent, его можно свернуть, а потом вернуться к нему, как описано выше. Rtorrent будет качать/раздавать в фоне, избавляя вас от необходимости держать ради него открытую вкладку терминала или tty-консоль (что еще и небезопасно).

Работа с несколькими скринами

Eсли вам нужно запустить лишь одну программу — вышеописанного более чем достаточно, но в случае если таких программ несколько — скринам нужно будет раздать имена, чтобы screen знала, к какому именно свернутому скрину вы хотите вернуться. Имя создаваемого скрина задается с помощью ключа -S:

screen -S rtor rtorrent

Cверните скрин с rtorrent'ом и запустите еще что-нибудь, к примеру nano:

screen -S nano nano

Этот скрин также сверните. Теперь можно вернуться к любому из двух скринов аналогично вышеописанному, только с указанием имени скрина, который вы хотите развернуть, например:

screen -r nano

Список запущенных скринов можно посмотреть с помощью:

screen -list

или

screen -ls

Возможно так-же вернуться к уже развернутому в ином терминале скрину:

screen -x nano

Запуск скрина в свернутом виде

Программу можно запустить сразу в свернутом скрине. Это полезно в случае с автозапуском, или когда вы знаете, что программа сама все сделает (установит соединение и продолжит закачку/раздачу в нашем примере с rtorrent), и смотреть там не на что. Делается все опять же просто. Команда на запуск будет такой:

screen -dmS rtor rtorrent

Ключ -d укажет, что скрин нужно свернуть, а ключ -m — что его нужно для начала создать. Процесс «усложняется» по той причине, что ключ -d по умолчанию используется для сворачивания ранее запущенного скрина, развернутого на другой консоли или в соседней вкладке, с той целью, чтобы развернуть его в текущем месте (ибо если одна и та же программа управляется из двух мест — это может и к конфузу привести). Таким образом нужная программа запустится сразу в фоне, а screen лишь выведет сообщение о том, что программа запущена, и скрин свернут.

Прочие возможности

Данная статья описывает лишь основы. На самом деле утилита screen обладает массой возможностей, например: можно разбить экран пополам, отобразив несколько скринов с разными программами; можно задать множество разных параметров, настроить под разные типа терминалов. Во всем этом поможет разобраться screen —help или man screen. Также есть еще одна полезная комбинация клавиш. Как сказано в мануале, «если вам лень читать кучу текста — запомните эту комбинацию» — Ctrl+A и затем ? 1). Вам будет выведен список доступных сочетаний клавиш и команд, которые они выполняют. Все это нажимается также после Ctrl+A.
linux   ubuntu
Ctrl + ↓ Ранее