Правила iptables не работают для разрешения определенного IP

Правила iptables не работают для разрешения определенного IP

У меня есть хост с 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_portIP-адрес или диапазон и порт 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

Они добавляют эти правила в конец цепочек. -Aoption добавляет правило в конец. Если вы используете -Ioption, вы поместите правило в начало цепочки.

Проблема здесь в том, что у вас, вероятно, уже есть правило 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 на пути.

Связанный контент