Centos 7.0 и Squid 3.3.8
В новой центоси обновили некоторые пакеты, в том числе squid, и теперь он может перестать работать со старым конфигом iptables. Здесь необходимо пояснение: у меня шлюз и прокси-сервер находятся на разных машинах, а NAT должен осуществляться строго на машине со сквидом. Конечно, можно попробовать гнать трафик через два сквида, но я так не пробовал делать и считаю, что это вариант для тех, кто знает толк в извращениях.
На шлюзе пока что Centos 6.5, но это не имеет значения, а на прокси — уже 7.0, и это таки важно. Прокси ходит в инет не через шлюз, а вообще по другому маршруту, так что следующие конфиги могут заработать не у всех.
На шлюзе надо маркировать http трафик:
iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j MARK --set-xmark 1
добавить таблицу для прокси:
echo "2 proxy" >> /etc/iproute2/rt_tables
посредством iproute2 добавить правило и маршрут для маркированного трафика:
ip rule add fwmark 1 table proxy
ip route add default via 192.168.1.1 dev eth0 table proxy
Чтобы не прописывать правило и маршрут после каждого перезапуска, можно добавить их в специально обученные файлы:
echo "fwmark 1 table proxy" > /etc/sysconfig/network-scripts/rule-eth0
echo "default via 192.168.1.1 dev eth0 table proxy" > /etc/sysconfig/network-scripts/route-eth0
На прокси-сервере тоже надо кое-что сделать, например редирект с 80 порта на 3128 и отправку трафика далее:
iptables -t nat -A PREROUTING -s 192.168.1.1 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
порт 3128 больше не нужен:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 3128 -j DROP
а 3129 порт пригодится для https в ручном режиме — по очевидным причинам это непрозрачно и настраивается со стороны пользователя. В конфиге squid’а должно быть такое:
http_port 3128 intercept
http_port 3129
У пользователя https via proxy можно настроить посредством FoxyProxy в браузере.
Условные обозначения:
eth0
— сетевой интерфейс шлюза, смотрящий в локальную сеть;
--set-xmark 1
— можно использовать любое число для маркировки разнообразного трафика;
2 proxy
— можно использовать любое число, главное чтобы оно было уникальным в /etc/iproute2/rt_tables
, слово “proxy” тоже можно заменить по аналогичному принципу;
192.168.1.1
— ip-адрес прокси-сервера, через него гоним исходящий http-трафик.
eth1
— сетевой интерфейс прокси-сервера, смотрящий в интернет;
Ссылки по теме:
http://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.netfilter.html
http://www.reddit.com/r/linux/comments/1dv2×2/on_mitigating_the_great_squid_31x_33x_upheaval/
http://www.faqs.org/docs/Linux-mini/TransparentProxy.html
http://grokbase.com/t/centos/centos/099bmc07mq/persisting-iproute2-routes-and-rules
P. S.: если у вас firewalld
, то проще всего начать с его удаления и установки iptables-services
.
11.07.2014, 13:22
Замена wi-fi адпаптера или анальная акробатика
Изначально в ноутбуке Lenovo Thinkpad L420 стоял ваф-фай от Realtek, который не умел работать в режиме точке доступа, а в целом для нормальной работы требовалось загружать модуль для него с особыми параметрами. Конечно, Realtek не такое говно, как Broadcom, но такая работа меня тоже устраивала не полностью, т. к. раздавать сеть иногда приходилось. Но внезапно ко мне в руки попал wi-fi адаптер Intel, который обещал быть заебатым.
На самом деле анальная акробатика только началась! Оказывается, пидарасы из леново прописывают в биос вайтлист устройств, которые разрешено подключать. И интеловский вай-фай в этот список не входит. Если подключено “неавторизованное” устройство, то система не загружается. Есть несколько вариантов как обойти это ограничение, они описаны здесь: Problem with unauthorized MiniPCI network card. Ни один из адекватных способов необратимого улучшения биоса мне не помог, и я отправился искать хакнутый биос. Нашёл его здесь: Lenovo L420 whitelist removal. Но ведь пидарасы из леново ссучены вдвойне, и их биос нельзя прошить с флэшки, а утилита для прошивки есть только виндовая, причём винда нужна полноценная (если такое слово вообще к ней применимо), а не livecd.
Очевидно, самым первым этапом анальной акробатики становится изготовление установочной флэшки с виндой. Можно было бы описать здесь этот процесс, но нет смысла делать это, т. к. винда при установки с флэшки потребовала некий драйвер для дисковода компакт-дисков, которого у меня физически нет, и устанавливаться отказывалась. Да, привет, 90-е, привет, индусы из микрософта… Конечно, я не программист, но мудачество налицо, уже в третий раз за сегодня. Судя по выхлопу гугла, проблема эта довольно распространённая, причём индусософт реагирует на неё в своём стиле, т. е. никак. Кому-то помогает переключение режимов sata, у кого-то установка идёт после втыкания флэшки в другой разъём, а кто-то таки покупает дисковод и ставит с диска.
Но на этот раз мне повезло: у коллеги совершенно случайно оказался с собой ноут с дисководом, и этот дисковод после снятия лишних деталей без проблем влез в мой ноут. Интересно, существует ли вайтлист для дисководов?
С диска венда установилась без ошибок и даже стала видеть флэшки, чему я был несказанно рад. Ну, а перепрошить после этого биос из готового образа — невелика наука.
Вообще, изначально планировалось взять с этого же ноута винчестер с виндой, но, как выяснилось, винда не умеет в переносимость между устройствами. Ну, это неудивительно.
Официальный биос таки можно прошить из линукса, но немного по-хакерски: BIOS update without optical disk, и это работает. Это действие я тоже совершал чтобы уравнять версии установленного биоса и хакнутого. Вроде как это важно.
P. S.: недавно приходилось прошивать супермикровский ipmi, через веб-интерфейс он тоже прошивается очень херово, но его хотя бы можно прошить с флэшки. И это в двадцать первом веке!
30.06.2014, 03:00
Обрезание/сворачивание текста в html
Где-то у меня использовалось сворачивание не шибко нужного текста, подробностей, списков и т. п. Больше это мне не нужно, а скрипт пускай лежит здесь, чтобы не потерялся. Вот он:
<script>
function op(obj) {
x=document.getElementById(obj);
if(x.style.display == "none") x.style.display = "block";
else x.style.display = "none"
}
</script>
“Заголовок” для свёрнутого текста делается так:
<a href="/" onClick="op('div_id'); return false;">title for full text</a>
А то, что нужно свернуть, заключается в такую конструкцию:
<div id="div_id" style="display:none">
fulltext
</div>
Пример использования: title for full text
fulltext
07.05.2014, 22:17
Проверка почты в режиме реального времени
Нетрудно догадаться, что постоянно держать открытым почтовый клиент впадлу, и поэтому я запилил на своём сервере электропочты мощную штуковину: теперь procmail
не только кладёт письмо в почтовый ящик user@domain.tld, но и отсылает уведомление об этом в одноимённый джаббер.
Реализуется всё довольно просто — отправкой копии письма на stdin скрипта-информатора. Вот это добавляется в центровой procmailrc
:
:0c
| /usr/local/sbin/newmail_notify
Cам скрипт /usr/local/sbin/newmail_notify
выглядит примерно так:
#!/bin/sh
while read line
do
message[$n]=$(echo ${line})
let n=$n+1
done < "${1:-/proc/${$}/fd/0}"
sender="`for ((l=0; l<${#message[@]}; l++)); do echo ${message[$l]}; done|grep -m 1 "From: "|cut -d ' ' -f2-`"
return_patch="`for ((l=0; l<${#message[@]}; l++)); do echo ${message[$l]}; done|grep -m 1 "Return-Path: "|cut -d ' ' -f2-`"
recepient="`for ((l=0; l<${#message[@]}; l++)); do echo ${message[$l]}; done|grep -m 1 "Delivered-To: "|cut -d ' ' -f2-`"
encoded_subject="`for ((l=0; l<${#message[@]}; l++)); do echo ${message[$l]}; done|grep -m 1 "Subject: "|cut -d ' ' -f2-`"
charset="`echo "${encoded_subject}"|cut -d ? -f2`"
decoded_subject="`echo "${encoded_subject}"|cut -d ? -f4|/usr/bin/base64 --decode|/usr/bin/iconv -f ${charset} -t UTF-8`"
/usr/local/sbin/jabbersend "${recepient}" "You have received new message from ${sender}, return patch is ${return_patch} — Subject: ${decoded_subject}"
Очевидно, упущен ещё один момент — непосредственно скрипт для отправки сообщений в джаббер, который в данном случае упоминается как /usr/local/sbin/jabbersend
. Вот он:
#!/usr/bin/env python
import xmpp,sys
xmpp_jid = 'notifier@domain.tld'
xmpp_pwd = 'notifier_password'
to = sys.argv[1]
msg = sys.argv[2]
jid = xmpp.protocol.JID(xmpp_jid)
client = xmpp.Client(jid.getDomain(),debug=[])
client.connect()
client.auth(jid.getNode(),str(xmpp_pwd),resource='xmpppy')
client.send(xmpp.protocol.Message(to,msg))
client.disconnect()
Для работы последнего скрипта потребуется пакет с питоньими либами, который в центоси называется python-xmpp
, а в рачлинуксе — xmpppy
.
Я не стал упоминать всякие мелочи типа настройки selinux
‘а, потому что об этом можно прочитать здесь: HowTos/SELinux.
P. S.: также выражаю благодарность LOR’у.
05.05.2014, 01:16
Репозиторий ArchLinux’а
|
Официальные зеркала уже отказались от ftp, пришло время и мне сделать это.
Если внезапно возникло желание воспользоваться моим зеркалом, то строка в /etc/pacman.d/mirrorlist должна выглядеть так:
Server = http://archlinux.opgsff.org/$repo/os/$arch
|
10.12.2013, 01:56
ejabberd + gmail
Пришло время окончательно решить вопрос отсутствия связи между моим джаббер-сервером и гмэйлом. Для начала посмотрел логи:
=INFO REPORT==== 2012-08-07 22:33:44 ===
I(<0.6620.0>:ejabberd_s2s_out:1204) : Trying to open s2s connection: opgsff.info -> gmail.com with TLS=true
=INFO REPORT==== 2012-08-07 22:33:45 ===
I(<0.6620.0>:ejabberd_s2s_out:375) : Closing s2s connection: opgsff.info -> gmail.com (TLS is required but unavailable)
Надо включить TLS, который и так включен. Конфиг /etc/ejabberd/ejabberd.cfg
и так правильный и в соответствии с комментариями:
%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
%% Allowed values are: false optional required required_trusted
%% You must specify a certificate file.
%%
{s2s_use_starttls, required}.
Посредством гугла и русского форума арчлинукса я нашёл пример чужого конфига. Вот такой:
%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
%% Allowed values are: false optional required required_trusted
%% You must specify a certificate file.
%%
{s2s_use_starttls, true}.
Можно заметить значение “true”, которое нигде не упоминается, но работает. Связь с гмэйлом есть, вопрос можно считать решённым.
10.12.2013, 01:09