Я решил и задокументировал его здесь: http://aftermanict.blogspot.it/2015/11/bash-iptables-iproute2-and-multiple.html
Это сделает ядро постоянно маршрутизировать пакеты, разрешает несколько маршрутов и даже для сетей, не подтвержденных на компьютере:
nano /etc/sysctl.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.ip_forward = 1
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >| $f ; done
Это приведет к инициализации iptables и, в частности, mangle и nat, которые необходимы для маркировки трафика:
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
добавить альтернативные маршруты редактирование:
nano /etc/iproute2/rt_tables
Добавить (имена являются вашими ссылками):
1 tunnel0
2 tunnel1
добавить маршруты и правила, мы используем таблицы ID вместо имен, которые Как вы можете заметить, шлюз не имеет значения, особенно для туннелей, которые могут иметь динамические шлюзы:
ip route add 0.0.0.0/0 dev tun0 table 1
ip route add 0.0.0.0/0 dev tun1 table 2
добавьте правила, чтобы отметить трафик и привязать к соответствующей таблице:
ip rule add from all fwmark 1 table 1
ip rule add from all fwmark 2 table 2
ip route flush cache
проверьте, если вы хотите:
ip route show table 1
ip route show table 2
ip rule show
если вы что-то упускаете, вы можете удалить таким образом:
ip rule del table 1
ip route flush table 1
NOW THE MISSING PART: WONT WORK:
iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 1
THIS WILL:
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables-save
Нужно ли выбирать трафик и одновременно перемещать его в устройство/туннель? Нет проблемы, я решил и это:
iptables -A OUTPUT -t mangle -p tcp --dport 10001 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -p tcp --dport 10002 -j MARK --set-mark 2
iptables -t nat -A OUTPUT -p tcp --dport 10001 -j DNAT --to :80
iptables -t nat -A OUTPUT -p tcp --dport 10002 -j DNAT --to :80
NAT обязателен для ответа
iptables -t nat -A POSTROUTING -o $DEV1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $DEV2 -j MASQUERADE
iptables-save
-121--174231-
На основании ваших дополнительных выходных данных кажется, что pywwetha прослушивает порт 80.
Остановите его с помощью:
systemctl stop pywwetha.service
, а затем отключите с помощью:
systemctl disable pywwetha.service
, а затем попробуйте запустить nginx после этого.
-121--87535-
Попробуйте. Ему не нужны xargs
, просто найти
, sed
и скопировать
. Файлы не будут изменены, но распечатает список команд оболочки для копирования файлов. Таким образом, если вам нравятся команды, которые он печатает, то вы запустите его снова и удалите #
перед sh -x
в последней строке и дайте оболочке выполнить команды.
find "${FOLDER:-.}" -iname "*${SOME_STRING:-ABC}*" |
sed "
s/^/'/ # surround filename with single quotes
s/$/'/
h # save filename in the sed hold space
s/ABC/XYZ/g # change filename
H # append to hold space (separates with newline)
g # get original and modified from hold
s/\n/ /g # replace the newline with a space
s/^/cp -i/ # make it into a copy command
" #| sh -x # optionally pipe to shell
Почему в данном случае этот подход лучше xargs
? Поскольку этот метод запускается только 3 процессов total ( find
, sed
и sh
) в дополнение к требуемой команде cp
для каждого файла.
Для использования xargs
обработка каждого имени файла потребует больше процессов, чем одна требуемая команда cp
.
Гораздо эффективнее позволить одному вызову sed генерировать все команд cp
, чем вызывать новый процесс sed
для каждого имени файла.
Вывод не такой, как я изначально просил, но он работает, так что вот как я это сделал:
users=""
/bin/cp -f "$CURRENTDIR"/sshd_config /etc/ssh/sshd_config
sed -i "s/Port 22/Port $PORT/" /etc/ssh/sshd_config
for user in `awk -F: '$3 >= 1000 { print $1 }' /etc/passwd`
do
users+="${user} "
done
if grep "AllowUsers" /etc/ssh/sshd_config
then
sed -i "/AllowUsers/c\AllowUsers $users" /etc/ssh/sshd_config
else
sed -i "6 a \
AllowUsers $users" /etc/ssh/sshd_config
fi
Эта строка находит строку с шаблоном AllowUsers
и заменяет всю строку новымAllowUsers $users
sed -i "/AllowUsers/c\AllowUsers $users" /etc/ssh/sshd_config
Эта строка добавляет текст AllowUsers $users
после 6th line
, если файл еще не содержит AllowUsers
уведомление о том, что он написан в две строки:
sed -i "6 a \
AllowUsers $users" /etc/ssh/sshd_config
Теперь программа пишет sshd_config
таким образом, AllowUsers
используется один раз с space
разделенным списком пользователей:
1 # Package generated configuration file
2 # See the sshd_config(5) manpage for details
3
4 # What ports, IPs and protocols we listen for
5 Port 22300
6
7 AllowUsers user something78 something79 something7
8
sed -i "/AllowUsers/a AllowUsers $user" /etc/ssh/sshd_config
добавляет «AllowUsers $user» после каждой существующей строки AllowUsers.
Я бы просто заменил sed на
echo "AllowUsers $user" >> /etc/ssh/sshd_config
echo "AllowUsers $USERNAME" >> /etc/ssh/sshd_config