ОБНОВЛЕНИЕ: Решение: Я должен был использовать цепочку ВЫХОДА, а не цепочку ПРОГНОЗИРОВАНИЯ. Этот пример все еще не работает, но я скоро обновлю его.
Мне кажется, это должно работать. Я перенес все правила маршрутизации из основной таблицы в таблицу 4, а затем MARK и перенаправил пакеты, предназначенные для порта 80/443, в таблицу 4. Я ожидал бы, что порт 80 будет работать так же, как если бы я ничего не делал, но gethostbyname просто не работает?
#!/bin/bash -x
#
# Reset/Flush iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# Reset/Flush table 4
ip route flush table 4
# move all routing rules from the main table to table 4
ip route show table main | grep -v linkdown |
while read ROUTE
do
ip route add table 4 $ROUTE
ip route del table main $ROUTE
done
# MARK all HTTP(S) destination packets with a 4
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 4
# packets marked as 4 find their routes via table 4
ip rule add fwmark 4 table 4
ip route flush cache