Маршрутизация осуществляется на уровне IP 3. TCP — на уровне 4, поэтому одной маршрутизации недостаточно для решения этой проблемы.
Короче говоря, :интересующий трафик должен быть помечен iptables
, а помеченные пакеты выбраны с помощьюip rule
с fwmark
для использования отдельной таблицы маршрутизации. Затем необходимо применить еще два исправления для случая локально инициированного/полученного трафика, что сложнее, чем случай с маршрутизацией. Все настройки, разумеется, выполняются в локальной системе.
Таблица маршрутизации80
(соответствующее символическое имя может быть добавлено в /etc/iproute2/rt_tables
, но это не обязательно )и метка 0x80
была выбрана "произвольно".
ip route add table 80 192.168.1.0/24 dev eth0 scope link src 192.168.1.56
ip route add table 80 default dev eth0 via 192.168.1.1
Использование -I
, чтобы правила iptables не добавлялись слишком поздно. Вы должны проверить свои текущие правила, как изменить порядок, если это необходимо:
iptables -t mangle -N markports
iptables -t mangle -I PREROUTING 1 -j CONNMARK --restore-mark
iptables -t mangle -I OUTPUT 1 -m mark --mark 0 -j markports
iptables -t mangle -I OUTPUT 2 -j CONNMARK --save-mark
iptables -t mangle -A markports -p tcp --dport 80 -j MARK --set-mark 0x80
iptables -t mangle -A markports -p tcp --dport 443 -j MARK --set-mark 0x80
ip rule add fwmark 0x80 lookup 80
Этот блог:Netfilter Connmark » В Linux и дальше! дает хорошую информацию о CONNMARK
.
Это должно было работать, но на самом деле при первом решении о маршрутизации был выбран неправильный исходящий IP-адрес по умолчанию, потому что маршрут должен был проходить через tun0
. При проверке перенаправления, выполненной из-за метки mangle/OUTPUT
(, см. этот Поток пакетов в схеме Netfilter and General Networking для разъяснения ), этот IP-адрес не изменится. Если бы обрабатываемый трафик маршрутизировался, а не инициировался локально, эта проблема не возникла бы (с использованием отдельного сетевого пространства имен, чтобы убедиться, что это решение для служб, а не для рабочего стола ). Так что это требует также слояMASQUERADE
(или SNAT
для более сложных случаев )поверх него:
iptables -t nat -I POSTROUTING 1 -m mark --mark 0x80 -j MASQUERADE
Теперь, когда исходящий IP-адрес правильный, он по-прежнему не работает :фильтр обратного пути срабатывает на обратном пути примерно по той же причине, :решение о маршрутизации, принятое ранее PREROUTING
пока не знает fwmark
(, несмотря на предыдущую схему , помещающую mangle/PREROUTING
перед решением о маршрутизации,очевидно, это не так ), поэтому считает пакеты обратного трафика поддельными и отбрасывает их раньше. Интерфейс eth0
rp_filter
должен быть переведен в свободный режим, чтобы это было разрешено. Это может иметь некоторые (очень незначительные проблемы с безопасностью за NAT ), но я считаю это неизбежным для этого случая без -маршрутизации:
echo 2 > /proc/sys/net/ipv4/conf/eth0/rp_filter
Вам придется найти, как установить его на постоянной основе (например, echo net.ipv4.conf.eth0.rp_filter=2 > /etc/sysctl.d/90-local-loose-mode.conf
, если ничего больше не изменит его позже ).
Протестировано нормально при использовании пространств имен с настройками, аналогичными параметрам операционной системы.
ПРИМЕЧАНИЕ. :DNS-запросы по-прежнему будут проходить через туннель. Некоторые геолокализованные веб-сервисы могут работать не так, как ожидалось.
Это действительно похоже на ошибку, но на самом деле Bash просто пытается следовать указанному в POSIX поведению _
,
[count]_
Append a <space> after the current character position and then append the last bigword in the previous input line after the <space>. Then enter insert mode after the last character just appended. With a number count, append the countth bigword in the previous line.
В качестве обходного пути добавьте это в свой ~/.inputrc
. Вы можете изменить \M-h
на любой другой несвязанный ключ, если хотите.
set editing-mode vi
set keymap vi-command
"\M-h":history-expand-line
".":"a!$\e\M-hA"
Теперь откройте новый терминал. После удара . в обычном режиме,
!$
вставляется в командную строку -. \e
(означает, что Esc)возвращается в нормальный режим. \M-h
запускает действие history-expand-line
, которое расширяет $!
до значения последнего аргумента. A
перемещается в конец -строки -и переходит в режим вставки. $ echo "X Y Z"
X Y Z
$ "X Y Z" #<ESC>. inserts this
$ echo "X Y Z"
X Y Z
$ cat "X Y Z" #cat <ESC>. inserts this