Не удается получить доступ к службам на сервере с использованием общедоступного IP-адреса после запуска Wireguard

При использовании if [... ]вы фактически используете утилиту [(, которая аналогична test, но требует, чтобы последний аргумент был]).

[не понимает запуска вашей функции, он ожидает строки. К счастью, вам вообще не нужно использовать [здесь (для функции как минимум):

if [ "$docheck" -eq 1 ] && notContainsElement "$fruit" "${blacklist[@]}"; then
 ...
fi

Обратите внимание, что я также сначала проверяю целое число, чтобы мы могли вообще избежать вызова функции, если $docheckне равно 1.

Это работает, потому что ifпринимает произвольную команду и решает, что делать, исходя из состояния выхода этой команды. Здесь мы используем тест [... ]вместе с вызовом вашей функции с &&в -между ними, создавая составную команду. Статус выхода составной команды был бы истинным, если бы и тест [... ], и функция возвращали ноль в качестве своих статусов выхода, сигнализируя об успехе.

В качестве примечания к стилю я не хотел бы, чтобы функция проверяла, содержит ли массив не элемент, а если содержит ли элемент, а затем

if [ "$docheck" -eq 1 ] && ! contains "$fruit" "${blacklist[@]}"; then...

Отрицательное значение функционального теста приведет к нарушению логики в тех случаях, когда вы действительно хотите проверить, содержит ли массив элемент(if ! notContainsElement...).

0
30.08.2020, 19:28
1 ответ

Я понял. Проблема, конечно, в том, что запрос идет в eth0, но ответ отправляется через туннель Wireguard (wg1 )и доходит до клиента с другим IP:

Request: Client -> Internet -> Router [NAT] -> Server  
Response: Server -> Router [NAT] -> Internet -> VPN Provider [NAT] -> Internet -> Client

Поэтому в этих случаях вам нужно обойти VPN-туннель, добавив правило для использования вместо него основной таблицы маршрутизации:

ip rule add from <interface IP> lookup main

Пример:

$ ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:ed:fc:a5:65 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.2/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever

$ ip rule add from 192.168.0.2 lookup main

$ ip route show table main
default via 192.168.0.1 dev eth0 src 192.168.0.2 metric 202
192.168.0.0/24 dev eth0 proto dhcp scope link src 192.168.0.2 metric 202

$ ip rule show
0:      from all lookup local
32756:  from 192.168.178.2 lookup main
32761:  from all lookup main suppress_prefixlength 0
32762:  not from all fwmark 0xca6c lookup 51820
32766:  from all lookup main
32767:  from all lookup default

В моем случае сервис, к которому он хотел получить доступ из-за пределов локальной сети, был сервером Wireguard. Чтобы клиенты Wireguard могли получить доступ к локальной сети и Интернету, вам дополнительно необходимо добавить следующее правило:

ip rule add from <Wireguard IP range> lookup main

Пример:

$ ip a
11: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.6.0.1/24 scope global wg0
   valid_lft forever preferred_lft forever

$ ip rule add from 10.6.0.1/24 lookup main
1
18.03.2021, 23:09

Теги

Похожие вопросы