я пытаюсь подключить порт от клиента Wireguard к хост-сети сервера.
Я пытался сделать это с помощью IPtables, но всегда получаю ответ «недоступен»
Кажется, проблема в моей конфигурации?
Спасибо!
root@wiretest3:~# curl -I 10.7.0.2:6060
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sun, 18 Jul 2021 10:37:38 GMT
Content-Type: text/html
Content-Length: 988
Last-Modified: Sat, 17 Jul 2021 10:07:05 GMT
Connection: keep-alive
ETag: "60f2abc9-3dc"
Accept-Ranges: bytes
root@wiretest3:~# curl -I 192.168.1.180:6060
curl: (28) Failed to connect to 192.168.1.180 port 6060: Connection timed out
root@wiretest3:~# curl -I 127.0.0.1:6060
curl: (7) Failed to connect to 127.0.0.1 port 6060: Connection refused
Хост: 192.168.1.183 Сеть Wireguard: 10.7.0.1
root@wiretest3:~# cat /etc/wireguard/wg0.conf
# Do not alter the commented lines
# They are used by wireguard-install
# ENDPOINT wireguard.demo.net
[Interface]
Address = 10.7.0.1/24
PrivateKey = QAOETAJYMK3PcDhN/y+xFJKcJetm4...........
ListenPort = 51823
# BEGIN_PEER client
[Peer]
PublicKey = YxM7cwbmBm7VIyNcRdDBhtiEwFWL........
PresharedKey = W9Y0qCku0Fv1uFiMpy5ImStbs+.........
AllowedIPs = 10.7.0.2/32, 192.168.1.183/32
# END_PEER client
IP a
root@wiretest3:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 2e:f5:1e:38:32:06 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.183/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::2cf5:1eff:fe38:3206/64 scope link
valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1420 qdisc mq state UNKNOWN group default qlen 500
link/none
inet 10.7.0.1/24 scope global wg0
valid_lft forever preferred_lft forever
inet6 fe80::6613:2cc4:bb7d:6bd4/64 scope link stable-privacy
valid_lft forever preferred_lft forever
Правила IPtables:
iptables -P FORWARD DROP;
iptables -A FORWARD -i eth0 -j ACCEPT;
iptables -t nat -A PREROUTING -p tcp --dport 6060:6060 -j DNAT --to-destination 10.7.0.2;
iptables -w -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
IPtables: (iptables-save )
root@wiretest3:~# iptables-save
# Generated by iptables-save v1.8.7 on Sun Jul 18 13:17:28 2021
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p udp -m udp --dport 51823 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.7.0.0/24 -j ACCEPT
-A FORWARD -i eth0 -j ACCEPT
COMMIT
# Completed on Sun Jul 18 13:17:28 2021
# Generated by iptables-save v1.8.7 on Sun Jul 18 13:17:28 2021
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 6060 -j DNAT --to-destination 10.7.0.2
-A POSTROUTING -s 10.7.0.0/24 ! -d 10.7.0.0/24 -j SNAT --to-source 192.168.1.183
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Sun Jul 18 13:17:28 2021
root@wiretest3:~#
IPtables: iptables -L -n -t nat (now)
root@wiretest3:~# sudo iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:6060 to:10.7.0.2
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 10.7.0.0/24 !10.7.0.0/24 to:192.168.1.183
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0
root@wiredocker:/etc/wireguard# cat /etc/wireguard/wg0.conf
[Interface]
Address = 10.7.0.2/24
DNS = 8.8.8.8, 8.8.4.4
PrivateKey = GAF31cqwu2YSWQPdiSvlWie2Pma.........
[Peer]
PublicKey = 3VMnaI8JvoXZ6DthLcDy5MnVmNq..............
PresharedKey = W9Y0qCku0Fv1uFiMpy5ImStbs+...............
AllowedIPs = 0.0.0.0/0, ::/0, 192.168.1.0/24
Endpoint = wireguard.demo.net:51823
PersistentKeepalive = 25
IP a
root@wiredocker:/etc/wireguard# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 76:d3:5b:64:b4:f0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.178.178/24 brd 192.168.178.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::74d3:5bff:fe64:b4f0/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:bb:9b:28:90 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:bbff:fe9b:2890/64 scope link
valid_lft forever preferred_lft forever
10: veth508c767@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether ea:cd:96:6e:33:0b brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::e8cd:96ff:fe6e:330b/64 scope link
valid_lft forever preferred_lft forever
15: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.7.0.2/24 scope global wg0
valid_lft forever preferred_lft forever
Оказалось, что сделать DNAT
подобным образом для 127.0.0.1
нереально (ну, по крайней мере, для случая OUTPUT
), возможно, из-за того, что 127.0.0.0/8
имеют scope host
или по аналогичным причинам.
Однако, следующий набор правил nftables должен помочь вам достичь желаемого:
table ip rewrite {
chain unloop {
type route hook output priority filter; policy accept;
ip daddr 127.0.0.1 tcp dport 80 ip daddr set 10.7.0.2 ip saddr set 10.7.0.1
}
chain reloop {
type filter hook input priority 101; policy accept;
ip saddr 10.7.0.2 tcp sport 80 ip saddr set 127.0.0.1 ip daddr set 127.0.0.1
}
}
table ip realnat {
chain dest {
type nat hook output priority filter; policy accept;
ip daddr 192.168.1.183 tcp dport 80 dnat to 10.7.0.2
}
chain source {
type nat hook postrouting priority srcnat; policy accept;
ip daddr 10.7.0.2 tcp dport 80 snat to 10.7.0.1
}
}
Вместо того, чтобы делать "правильный" NAT назначения, вам нужно сделать своего рода "неотслеживаемую" перезапись адреса назначения (и источника). С помощью цепочки type route
будет выполнен поиск нового маршрута. Кроме того, вам нужно сделать так, чтобы у отвечающих трафиков адреса источника и назначения изменились на 127.0.0.1
, чтобы curl
мог распознать трафик.
С hook input
, это должно (т.е. НЕ ПРОВЕРЕНО) избежать нежелательной перезаписи для трафиков, которые не предназначены для самого хоста (т.е. ответные трафики для перенаправленных трафиков). С другой стороны, приоритет 101
(т.е. 1
больше, чем srcnat
/ все стандартные приоритеты) позволит избежать нежелательной перезаписи для ответов, отвечающих на запросы, которые были правильно NAT'ированы.
Как вы видите, для случая 192.168.1.183
другая таблица, выполняющая нормальный NAT'ing, следует за таблицей для особого случая 127.0.0.1
.
Обратите внимание, что этот набор правил предназначен только для curl
инга изнутри контейнера (или, в крайнем случае, его хоста; я не знаком с контейнерами и, насколько я знаю, для них могут быть разные сетевые подходы). Если вам, например, нужно, чтобы контейнер пересылал для некоторых других хостов в 192.168.1.0/24
, вам дополнительно понадобится такое же dnat
правило в цепочке type nat hook prerouting priority dstnat
. IP-переадресация также должна быть включена и разрешена. И, как я уже сказал, я НЕ уверен, что трюки с переписыванием выше для 127.0.0.1
будут конфликтовать с этим.