我需要将 UDP 协议的一系列端口转发到容器。
在文件中before.rules
,包含一行:
-A PREROUTING -p tcp -i eth0 --src-range 49000-60000 -j DNAT --to-destination 10.100.100.2
但ufw
对选项有抱怨--src-range
。该怎么办?
我需要将 UDP 协议的一系列端口转发到容器。
在文件中before.rules
,包含一行:
-A PREROUTING -p tcp -i eth0 --src-range 49000-60000 -j DNAT --to-destination 10.100.100.2
但ufw
对选项有抱怨--src-range
。该怎么办?
我有一个程序“SillyTavern”,它使用 WebUI,本质上是一个 Web 服务器。我的第一个目标是让这个程序的 WebUI 可以通过我的智能手机从任何地方访问。我通过在路由器中设置端口转发规则来实现这一点,该规则将我的 PC 的私有 IP 链接到路由器的公共 IP([我的公共 IP]:7215 到 192.168.0.10:7215)。
我的下一个目标是找到一种方法来加密我的两个设备之间的流量。我找到的解决方案是 WireGuard,我的实现如下:
PrivateKey = [. . .]
ListenPort = 7215
[Peer]
PublicKey = [. . .]
PresharedKey = [. . .]
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 10
Addresses = 192.168.0.201/24
DNS Servers = 8.8.8.8
Listen Port = 7215
MTU = "Auto"
Allowed IPs = 0.0.0.0/0
Persistent Keepalive = 10
我所做的任何研究都没有给我任何提示,让我知道我哪里出了问题。我尝试将端口转发规则改回以前的样子,结果是一样的。如果我尝试仅在 PC 上运行 WireGuard 进行连接,我可以正常连接。提前感谢您提供的任何见解。
[更新于 08/18/24] 我在手机配置中的“端点”字段中添加了“[我的路由器的公共 IP]:7215”。这似乎完成了隧道,因为现在我的手机显示以下内容:
Transfer
rx: 440B, tx: 3.66KiB
Latest handshake
3 seconds ago
但是,当我尝试通过手机浏览器访问我的网络服务器时,仍然会出现连接超时的情况。
我遇到了一个奇怪的情况。
我有 ISP 路由器,但没有密码!我无法登录 192.168.1.1 并配置端口转发。
我还有一台未使用的第二个华硕路由器。我连接了 isprouter lan 1 -> 华硕的互联网端口,现在我家里有一个工作正常的辅助网络。我可以将具有 LAN 或 WiFi 的设备连接到华硕路由器,然后它们可以访问互联网。
问题:
如果我在华硕路由器中进行端口转发,这是否可以正常工作,并且我不必更改 isp 路由器本身的端口转发?
示例:具有 mac aa:bb 的设备通过 WIFI 连接到 AsusRouter,并且 IP 地址为 192.168.50.7
我想端口转发 udp 和 tcp 6667
。如果我将 AsusRouter 配置为端口转发,即使 ISPRouter 没有这样的规则,它也会工作吗?
我正在尝试将松下录音机设置为可以在本地网络之外查看。里面工作得很好。没有任何规则,它根本就行不通。如果没有最终的 UDP 规则,一切都会正常 - 节目会显示,但播放会失败并出现connection failed
错误。
规则在这里
服务器的IP地址 | 协议 | 港口 |
---|---|---|
114.179.237.36 | 传输控制协议 | 48443 |
114.179.237.36 | 传输控制协议 | 48501~48502 |
114.179.237.129 | 传输控制协议 | 47808 |
114.179.237.23 | 传输控制协议 | 47825 |
114.179.237.54 | 传输控制协议 | 49000~49030 |
114.179.237.55 | 传输控制协议 | 49000~49030 |
任何 | 传输控制协议 | 第443章 |
任何 | UDP协议 | 任何 |
我已将它们设置为
我对最终的 UDP 规则有一些疑问
如果我为 UDP 规则输入端口 1-65000,那么我就可以播放。
有谁知道用于此用途的 UDP 端口的限制范围?
请注意,这是从本地网络外部连接到我的计算机。
我已将 Ubuntu pc 配置为路由器,并且对具有多个输入接口的 DNAT 规则感到困惑。当我尝试 ping ISP-1 IP时,路由器从 external_p 应答,ISP-2 IP从 external_s 应答。但是当我打开ISP-1 IP :80 或ISP-2 IP :80 时,它会从 external_p 回答两个 IP。如何使用收到请求的接口配置它对 DNAT 的应答?
ip rule show
0: from all lookup local
300: from <ISP-1 IP> lookup external_p
400: from <ISP-2 IP> lookup external_s
32766: from all lookup main
32767: from all lookup default
ip route
default via <ISP-1 GW> dev vlan_ext_p metric 100
default via <ISP-2 GW> dev vlan_ext_s metric 200
ip route show table external_p
default via <ISP-1 GW> dev vlan_ext_p proto static
ip route show table external_s
default via <ISP-2 GW> dev vlan_ext_s proto static
iptables-save
*nat
-A PREROUTING -i vlan_ext_p -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.4.2
-A PREROUTING -i vlan_ext_s -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.4.2
-A POSTROUTING -s 172.16.0.0/12 -o vlan_ext_p -j MASQUERADE
-A POSTROUTING -s 172.16.0.0/12 -o vlan_ext_s -j MASQUERADE
COMMIT
*filter
-A FORWARD -d 172.17.4.2/32 -i vlan_ext_p -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A FORWARD -d 172.17.4.2/32 -i vlan_ext_s -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -s 172.16.0.0/12 -j ACCEPT
我有环回 IP127.0.a.b
和远程(非公共)IPx.x.x.x
我需要在我的 ubuntu 机器上实现流量“转发”,这样所有来/去的流量都x.x.x.x:9092
将被重定向到127.0.a.b:9092
.
根据我的理解,做nc -zv x.x.x.x 9092
应该是成功的(这就是我要测试转发的方式)
我正在尝试使用 iptables 来实现这一点。这是我尝试过的,但这不起作用
./fw_helper.sh xxxx 127.0.ab 9092
#!/bin/bash
src_ip=$1
dst_ip=$2
port=$3
sudo iptables -X
sudo iptables -F
sudo iptables -t nat -F
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
sudo iptables -A FORWARD -p tcp -s $src_ip --sport $port -d $dst_ip --dport $port -j ACCEPT
sudo iptables -A FORWARD -p tcp -s $dst_ip --sport $port -d $src_ip --dport $port -j ACCEPT
sudo iptables -t nat -A PREROUTING -p tcp -s $src_ip --sport $port --dport $port -j DNAT --to-destination $dst_ip
sudo iptables -t nat -A POSTROUTING -p tcp -d $dst_ip --sport $port --dport $port -j MASQUERADE
sudo iptables -A INPUT -p tcp --sport $port --dport $port -d $dst_ip -s $src_ip -j ACCEPT
我做错了什么?
前提:
我正在尝试将最近关于网络接口和端口的 学习汇总在一起,并尝试将新的学习与 Docker 联系起来。
快速总结一下我学到的与这个问题相关的东西:
与使用软件的许多方面一样,我首先按照我学到的“仪式”做事,因为“这就是它的完成方式”。然后随着时间和经验,我开始思考和探究其中的缘由。所以我想把这个新的学习与 Docker 联系起来。
我学到的“惯例”是,如果容器化应用程序正在侦听 TCP 套接字,则需要“公开”该套接字的端口,以便到达该端口的主机接口之一的流量被“转发”到容器。
例如docker run -d -p 81:80 httpd
,如果我将 Web 浏览器指向 127.0.0.81,那么进行设置,HTTP/TCP/IP 流量将“转发”到httpd容器的端口 80。
因此,当我将 Web 浏览器指向 127.0.0.1:81 时,我看到 Apache 的“It works!” 信息。
而且:如果我将我的网络浏览器指向 127.0.0. 2:81或 127.0.0。16:81,然后我也看到了 Apache 的“It works!” 信息。
正如我从链接的帖子中了解到的那样,DHCP 为我的 NIC 接口分配了 IP 地址 10.0.0.17,如果我将 Web 浏览器指向 10.0.0.17:81,我再次看到 Apache 的“It works!” 信息。
如果我将同一网络上另一台 PC 的 Web 浏览器指向 10.0.0.17:81,它也可以工作。
问题:
我的主要问题是:当您docker run
使用-p
参数时,哪个主机 PC 的接口(IP 地址)是从主机转发到容器的端口?通过注意到的观察,答案似乎是“所有接口”——是这样吗?
不过,更广泛地说:主机 PC 和 Docker 容器之间的接口和端口之间的关系是什么?
我试过的
我尝试阅读docker run
帮助文本,但它的文本-p
没有达到我可以将其与我提出的问题联系起来的水平:
-p, --publish list 将容器的端口发布到主机
我尝试在ifconfig
我的 PC 和正在运行的httpd容器的上下文中运行查看。
ifconfig
在主机 PC 上:
$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:caff:fe23:f0f4 prefixlen 64 scopeid 0x20<link>
ether 02:42:ca:23:f0:f4 txqueuelen 0 (Ethernet)
RX packets 3079 bytes 322688 (322.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6429 bytes 15942682 (15.9 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 17975 bytes 1557651 (1.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17975 bytes 1557651 (1.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.17 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::5f8c:c301:a6a3:6e35 prefixlen 64 scopeid 0x20<link>
ether f8:59:71:01:89:cf txqueuelen 1000 (Ethernet)
RX packets 1672559 bytes 2237440808 (2.2 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 726083 bytes 113598143 (113.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ifconfig
在正在运行的httpd容器中(我安装了它apt-get
):
# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 1326 bytes 8916833 (8.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1134 bytes 76866 (75.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
把这个问题放在上面ifconfig
输出的上下文中,主机 PC 上的那些接口和 docker 容器中的接口有什么关系?
从这里,我的理解是 DHCP 为我的主机 PC 上的 NIC 分配了 10.0.0.17。但是 172.17.0.3 是从哪里来的呢?
所以我建立了一个简单的网络:首先是调制解调器,然后是路由器,路由器后面是我的终端设备。我可以从路由器后面的局域网访问调制解调器网络,但是当我尝试从调制解调器端访问路由器后面的局域网时,什么也没有发生。为什么呢?我不太明白这一点,想知道路由器是否将调制解调器视为其本地网络上的设备,因此连接有效,但调制解调器没有将其自己的 NAT 视为本地网络的一部分?我应该怎么做才能从调制解调器与路由器后面的本地网络进行通信?
这是一个与我在 2019 年提出的另一个问题相似但不同的问题。我认为它完全不同,可以提出一个新问题。
我编写了一个使用 CORS(跨源资源共享)的 Node Express 应用程序。我仍在尝试远程开发(SSH 到服务器)。VS Code 运行良好,我可以通过 SSH 连接到服务器和路由器 (OpenWRT) 以供管理员使用。
当我运行应用程序时,它告诉我它正在运行。通过 SSH 使用 Links(命令行浏览器)到服务器,我可以看到 JSON 响应,所以我知道它正在运行。
我已经运行export PORT=8080
它现在被代码正确拾取
应用程序代码是:
// Based on a // Tutorial from https://www.bezkoder.com/react-node-express-mysql/ converted to access database of solar power generation values
const express = require("express");
const cors = require("cors");
const HOSTNAME = '0.0.0.0';
const PORT = process.env.PORT || 8082;
const app = express();
// const db = require("./app/models");
// db.sequelize.sync();
var corsOptions = {
origin: `http://${HOSTNAME}:${PORT}`
};
app.use(cors(corsOptions));
// parse requests of content-type - application/json
app.use(express.json());
// parse requests of content-type - application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: true }));
//const PORT = process.env.PORT || 8082;
// simple route
app.get("/", (req, res) => {
res.json({ message: `Welcome to Greg's application on localhost: ${PORT}.` });
});
// set port, listen for requests
app.listen(PORT, () => {
console.log(`Server is running on port:- ${PORT}.`);
});
出于某种原因,它从 中获取后备端口 8082,而const PORT = process.env.PORT || 8082;
不是
var corsOptions = { origin:
http://${HOSTNAME}:8080中指定的端口 };
如果我curl -v -X -H http://<my static WAN IP>:8082/
从远程终端运行。我明白No route to host
了 - 请参阅下面的 DNAT 规则
如果我curl -v -X -H http://<localhost> or <0.0.0.0>:8082/
通过 ssh 从我的服务器终端运行。我明白了
* Trying ::1:8082...
* TCP_NODELAY set
* Connected to localhost (::1) port 8082 (#0)
> -H / HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.66.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 400 Bad Request
< Connection: close
<
* Closing connection 0
我相信我已经正确设置了用于端口转发的 DNAT 路由规则(我有三个规则。8080,8081 和 8082 各有一个,用于实验目的) - 已编辑(另请参阅 OpenWRT链接以获取规范和链接用于解释“选项”与“列表”)
config redirect
option dest_port '8080'
option src 'wan'
option name 'Tranq8080'
option src_dport '8080'
option target 'DNAT'
option proto 'tcp'
option dest_ip '<server's LAN address>'
option dest 'lan'
我找不到远程访问应用程序 http 的方法。我不知道是防火墙、代码还是浏览器中的某种跨脚本巫术(我认为远程 CURL 拒绝表明它不是后者)?
帮助?
从另一篇文章中,我考虑到我可能落后于“运营商级 NAT”.. 这种技术禁用端口转发.. 好的.. 我不知道如何解决我目前的情况.. 我可以使用 IPv6,然后这个将使我能够转发?.. 我不确定我的 ISP 是否支持 IPv6(他们通常都支持吗?).. 也请不要忘记标题中的问题..