У меня есть хост с 2 сетевыми интерфейсами: Wi-Fi и site-site vpn (zerotier).
root@host:~# ifconfig wlp0s20f3
wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.38 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::a098:2166:78af:d78d prefixlen 64 scopeid 0x20<link>
ether ac:12:03:ab:6e:31 txqueuelen 1000 (Ethernet)
RX packets 1071869 bytes 1035656551 (1.0 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 911450 bytes 134092251 (134.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@host:~# ifconfig ztklh3tu4b
ztklh3tu4b: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 2800
inet 10.147.18.192 netmask 255.255.255.0 broadcast 10.147.18.255
inet6 fe80::f8f6:d1ff:fe3d:4f09 prefixlen 64 scopeid 0x20<link>
ether fa:f6:d1:3d:4f:09 txqueuelen 1000 (Ethernet)
RX packets 8836 bytes 1146994 (1.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 667 bytes 281732 (281.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Я хочу заблокировать весь трафик (как входящий, так и исходящий) на этот хост, кроме IP за VPN. Поэтому я добавил следующие правила iptable:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -s 10.147.18.80 -j ACCEPT
iptables -A OUTPUT -d 10.147.18.80 -j ACCEPT
Когда я пингую этот 10.147.18.80, я не могу этого сделать. Вот результаты пинга:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3067ms
root@host:~# ping 10.147.18.80
PING 10.147.18.80 (10.147.18.80) 56(84) bytes of data.
^C
--- 10.147.18.80 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5097ms
Когда я меняю IP в правиле iptables на что-то другое, например, 8.8.8.8, все работает так, как и ожидалось, т. е. я не могу связаться ни с чем, кроме 8.8.8.8.
Редактировать Следующий вывод iptables -nvL показывает цепочки:
root@host:~# iptables -nvL
Chain INPUT (policy DROP 23 packets, 4560 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 10.147.18.80 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 330 packets, 25776 bytes)
pkts bytes target prot opt in out source destination
8 672 ACCEPT all -- * * 0.0.0.0/0 10.147.18.80
Вышеприведенный вывод iptables показывает, что пакеты отправляются на IP-адрес, но ответ не приходит, если правила действуют.
Tcpdump на моем хосте показывает то же самое поведение:
tcpdump: data link type LINUX_SLL2
tcpdump: listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
13:28:32.323064 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17342, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 1, length 64
13:28:33.330145 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17567, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 2, length 64
13:28:34.354178 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17694, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 3, length 64
13:28:35.378135 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17714, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 4, length 64
Tcpdump на 10.147.18.80 не показывает входящих ICMP-запросов эха от 10.147.18.192. Что могло пойти не так?
решение1
Если вы используете VPN-клиент на этом хосте для создания второго интерфейса, не забудьте такжеразрешить подключения к VPN-серверу, в противном случае ваш локальный IP-адрес 10.147.18.192
больше не будет доступен.
Вам необходимо как минимум разрешить исходящий и входящий трафик к/от VPN-сервера на интерфейсе wlp0s20f3
:
iptables -I OUTPUT -d $vpn_server_ip -p $proto --dport $vpn_port -j ACCEPT
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$proto
будет udp
или tcp
, и $vpn_server_ip
: $vpn_port
IP-адрес или диапазон и порт VPN-сервера(ов)
Я не могу точно угадать эти значения, но ваша документация по VPN или tcpdump/wireguard с работающим установленным соединением с VPN-туннелем должны предоставить вам эту информацию.
решение2
Эти две команды, которые вы упомянули в своем вопросе:
iptables -A INPUT -s 10.147.18.80 -j ACCEPT
iptables -A OUTPUT -d 10.147.18.80 -j ACCEPT
Они добавляют эти правила в конец цепочек.
-A
option добавляет правило в конец. Если вы используете -I
option, вы поместите правило в начало цепочки.
Проблема здесь в том, что у вас, вероятно, уже есть правило DROP
или REJECT
, перед ACCEPT
правилом в одной из цепочек, которое сбрасывает трафик до того, как он достигнет конца цепочки. Например, правило, которое сбрасывает трафик в или из целой подсети, содержащей IP 10.147.18.80.
Если у вас есть правило в цепочке, которое сбрасывает/отклоняет трафик на этот IP-адрес или с этого IP-адреса в зависимости от того, является ли это цепочкой INPUT или OUTPUT, перед правилом ACCEPT, то независимо от того, указывает ли правило только этот IP-адрес или всю подсеть, трафик сбрасывается, а все остальные правила в цепочке больше не обрабатываются.
DROP
, REJECT
, ACCEPT
являются завершающими целями, как только iptables сопоставляет это правило, он прекращает обработку других правил в цепочке и не переходит к следующему правилу.
Пытаться
iptables -I INPUT -s 10.147.18.80 -j ACCEPT
iptables -I OUTPUT -d 10.147.18.80 -j ACCEPT
Это поместит эти правила в начало цепочек, и они будут первыми правилами, которые будут обработаны, а другие правила не будут обрабатываться для этого трафика в этих цепочках.
Вы можете перечислить все правила в цепочке с помощью чего-то вроде
iptables -nvL
или если вы хотите просмотреть только определенные сети
iptables -nvL INPUT
iptables -nvL OUTPUT
РЕДАКТИРОВАТЬ
Учитывая вставленный вами вывод и тот факт, что вы можете выполнить ping, если измените действия по умолчанию на ACCEPT
эти, проблема, похоже, не в этом.
Вы можете использовать что-то вроде tcpdump, чтобы проверить, идет ли трафик и возвращается ли он обратно.
Команда, подобная этой, выдаст вам все пакеты ICMP, отправленные или полученные машиной.
tcpdump -nnvvi any icmp
Если вы получили что-то вроде этого на выходе
10:13:48.866598 IP (tos 0x0, ttl 255, id 30625, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 26621, seq 4, length 64
10:13:48.867771 IP (tos 0x0, ttl 53, id 0, offset 0, flags [none], proto ICMP (1), length 84)
10.147.18.80 > 10.147.18.192: ICMP echo reply, id 26621, seq 4, length 64
Затем ваши ping-пакеты отправляются и возвращаются, но отклоняются каким-то другим правилом.
Вы можете проверить, есть ли у вас какие-либо другие правила в других таблицах, например, в таблицах nat или mingle, и не конфликтуют ли некоторые из них с трафиком.
iptables -t nat -nvL
iptables -t mingle -nvL
Вы также можете увидеть, проходят ли пакеты через правило ACCEPT в цепочке OUTPUT по номеру ниже pkts
в листинге. Если это число увеличивается после попытки пинга, но число в цепочке INPUT остается 0, то проблема связана с правилами входящего трафика.
Также проверьте свои маршруты с помощью ip r
команды или чего-то подобного, возможно, трафик не выходит через интерфейс в той же подсети, поэтому исходный IP-адрес возвращаемых пакетов может быть изменен из-за некоторых правил NAT на пути.