пятница, 27 декабря 2013 г.

NAT через IPIP-туннель.

Понадобилось для определенного теста сымитировать выход в интернет из другого города. В том городе имеется небольшой сервер, доступный по внутренней сети (предположим, некие VPN от провайдера, сервер и тестовая машина находятся в локальных маршрутизируемых сетях).

У сервера есть белый ip-адрес и выход в интернет, у клиента такой роскоши нет.

Сервер
IP-адрес локалки: 192.168.1.1/24
IP-адрес белый: 1.2.3.4

Клиент
IP-адрес локалки: 192.168.2.2/24
Шлюз 192.168.2.1

Решение состоит из двух шагов: Поднятие туннеля между клиентом и сервером и настройка NAT на сервере.

На сервере:
ip tun add tun0 mode ipip local 192.168.1.1 remote 192.168.2.2 ttl 255
ip l s dev tun0 up
iptables -I INPUT -p 4 -s 192.168.2.2 -j ACCEPT
iptables -I FORWARD -s 192.168.2.2 -j ACCEPT
iptables -I FORWARD -d 192.168.2.2 -j ACCEPT
iptables -t nat -I POSTROUTING -s 192.168.2.2 -j MASQUERADE

На клиенте:
ip tun add tun0 mode ipip local 192.168.2.2 remote 192.168.1.1 ttl 255
ip l s dev tun0 up
ip r a 192.168.1.1 via 192.168.2.1
ip r d default
ip r a default dev tun0
Надо помнить, что здесь не используется шифрование.
Forwarding должен быть включен, а rp_filter на всякий случай выключен.

воскресенье, 15 декабря 2013 г.

Почему не запускается бинарник?

user@book:~$ /home/user/some_program/program_bin
bash: /home/user/some_program/program_bin: Нет такого файла или каталога

user@book:~$ ls -l /home/user/some_program/program_bin
-rwxr-xr-x 1 user user 286567 май 27  2012 /home/user/some_program/program_bin

user@book:~$ file /home/user/some_program/program_bin
/home/user/some_program/program_bin: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.0, not stripped

user@book:~$ /home/user/some_program/program_bin
bash: /home/user/some_program/program_bin: Нет такого файла или каталога

user@book:~$ mount | grep home
/dev/mapper/_dev_dm_3 on /home/user type ext4 (rw,relatime,data=ordered)

user@book:~$ ls -ld /home/user/some_program
drwxr-xr-x 15 user user 4096 окт 24 19:38 /home/user/some_program


user@book:~$ ld /home/user/some_program/program_bin
ld: i386 architecture of input file `/home/user/some_program/program_bin' is incompatible with i386:x86-64 output

пятница, 27 сентября 2013 г.

Пара ссылок для диагностики доступа к Youtube

Пара ссылок для диагностики доступа к Youtube, чтоб не забыть. http://redirector.c.youtube.com/report_mapping покажет, на какую ноду Гугл-кеша происходит редирект
http://www.youtube.com/my_speed статистика по скорости

понедельник, 26 августа 2013 г.

Различия между IPv4 и IPv6

IPv4IPv6
Адреса IPv4 длиной 32 бита.Адреса IPv6 длиной 128 бит.
Опциональная поддержка IPSec.Обязательная поддержка IPSec.
Фрагментация производится как отправителем, так и промежуточными передающими устройствами.Фрагментацию производит только отправитель.
Нет идентификации потока.Идентификация потока пакетов доступна благодаря полю Flow Label в составе заголовка IPv6.
В заголовке пакета есть поле Checksum.Поля Checksum в заголовке нет.
В заголовке пакета есть поле Options.Поля Options в заголовке нет, зато есть дополнительные заголовки (идут после основного заголовка).
Для сопоставления IPv4 адресов с MAC адресами используется протокол ARP.Вместо ARP используется Neighbor Discovery Protocol.
Для управления групповой (multicast) передачей данных используется IGMPВместо IGMP используется Multicast Listener Discovery (MLD).
Доступен broadcast.Broadcast недоступен, вместо него используется особый link-local multicast адрес.
Для работы требуется ручная настройка или DHCPДоступна автонастройка
Прямая запись DNS имеет тип A.Прямая запись DNS имеет тип AAAA.
Обратная DNS запись (PTR) находится в зоне IN-ADDR.ARPA.Обратная DNS запись (PTR) находится в зоне IP6.ARPA.

пятница, 31 мая 2013 г.

Многопоточный pktgen

Хороший способ протестировать пропускную способность сети -- pktgen. Это модуль ядра Linux, генерирующий пакеты и стреляющий ими в указанный сетевой интерфейс. Но бывает так, что одно ядро процессора не способно забить всю полосу сетевой карты (при использовании, например 10G сетей). Тогда можно подключить второе ядро. Скрипт понятен без комментариев:
#!/bin/bash
echo "rem_device_all" > /proc/net/pktgen/kpktgend_0 
echo "rem_device_all" > /proc/net/pktgen/kpktgend_1
echo "add_device eth1@0" > /proc/net/pktgen/kpktgend_0 
echo "add_device eth1@1" > /proc/net/pktgen/kpktgend_1 
echo "pkt_size 1500" > /proc/net/pktgen/eth1\@0
echo "pkt_size 1500" > /proc/net/pktgen/eth1\@1
echo "count 1000000000" > /proc/net/pktgen/eth1\@0
echo "count 1000000000" > /proc/net/pktgen/eth1\@1
echo "dst_mac 05:05:05:05:05:05" > /proc/net/pktgen/eth1\@0
echo "dst_mac 05:05:05:05:05:05" > /proc/net/pktgen/eth1\@1
echo "start" > /proc/net/pktgen/pgctrl 

вторник, 30 апреля 2013 г.

Запись в memcache через telnet

Очередная напоминалка самому себе. Для отладки определенного приложения требуется заполнить memcache нужными данными. Это можно сделать через telnet: set key flags expire bytes
Например:
$ telnet localhost 11211

set key 0 3600 6
mydata

понедельник, 22 апреля 2013 г.

NAT, диапазон белых адресов и ICQ

При создании NAT-сервера для большого числа пользователей естественно используется диапазон "белых" адресов. Делается просто
iptables -t nat -A POSTROUTING -s 172.16.0.0/12 -j SNAT --to-source 192.0.32.1-192.0.47.254
Но появляется проблема -- netfilter выдаёт псевдослучайный новый адрес для каждого потока, т.е. соединения типа RELATED получают адрес, отличный от адреса, который получило основное соединение. Например ICQ использует два подключения и в такой схеме не работает. Решение:
iptables -t nat -A POSTROUTING -s 172.16.0.0/12 -j SNAT --to-source 192.0.32.1-192.0.47.254 --persistent

пятница, 1 марта 2013 г.

tcpdump и lldp

Просто напоминалка самому себе, как отловить lldp-трафик с помощью tcpdump:
tcpdump -ni eth0 ether proto 0x88cc

понедельник, 11 февраля 2013 г.

rsync через ssh

Сегодня столкнулся с проблемой передачи файла с помощью scp. Каждый раз передача останавливалась на случайном месте, scp показывал статус передачи -stalled-, после чего (выждав таймаут) закрывался с ошибкой broken pipe. Не помогло даже снижение скорости (ключ -l). Канал, через который шла передача, меня уже неоднократно подводил, но другого способа попасть в защищенную сеть нет. Зато нашел способ передачи с использованием rsync:
rsync --rsh='ssh' -av --progress --partial username@server1.example.com:/path/file ./
Передача рвалась как и прежде, но теперь у меня появилась возможность докачивать файл. Rsync должен быть установлен на обоих машинах.

sudo через ssh

Иногда бывает необходимо срочно выполнить какую-то команду на куче серверов одновременно. И даже при наличии puppet на это уйдёт некоторое время. Поэтому я использую такой приём:
for i in $(seq 1 7); do ssh -t username@server${i}.example.com sudo ifconfig ix0 promisc up; done
А суть этого поста в параметре -t, без которого sudo не хочет запрашивать пароль.