
Для выполнения некоторых задач пересылки я использую скрипт для добавления пользовательской цепочки. Часть кода здесь (запустить как root):
iptables -t nat -N v2ray_forwarder
iptables -t nat -I OUTPUT -j v2ray_forwarder
iptables -t nat -A v2ray_forwarder -p tcp -m set --match-set srv_ip dst -j RETURN
iptables -t nat -A v2ray_forwarder -d 0.0.0.0/8 -j RETURN
iptables -t nat -A v2ray_forwarder -d 10.0.0.0/8 -j RETURN
iptables -t nat -A v2ray_forwarder -d 127.0.0.0/8 -j RETURN
iptables -t nat -A v2ray_forwarder -d 192.168.0.0/16 -j RETURN
iptables -t nat -A v2ray_forwarder -p tcp -m set --match-set gfw_ip dst -j REDIRECT --to-port 1081
iptables -t nat -A v2ray_forwarder -p tcp -m set ! --match-set chn_ip dst -j REDIRECT --to-port 1081
Код работает отлично, и я уверен, что пакеты были правильно переданы. Но после того, как я нажимаю sudo iptables -L
, выводится:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
На моем роутере (OpenWRT) iptables -L
всегда показывает, что все цепи существуют, но на моем ноутбуке это не работает. Может кто-нибудь сказать мне, почему?
Спасибо!
решение1
Пользовательские цепочки привязаны к таблице. Это означает, что вы не можете использовать цепочку, которая была создана в mangle
таблице, в правилах filter
или nat
таблицах.
Команда iptables -L
показывает только filter
цепочки таблиц. Проверьте вывод iptables -t nat -L
. Но лучше использовать iptables-save -c
команду для вывода полного набора правил со счетчиками.