对于开发来说,很多平台都提供了webhook事件,但需要HTTPS和有效的域名。很多人使用ngrok,但我手头有一个EC2示例,它允许我为webhook获取一个非随机子域。
我在nginx
上做了以下工作:
subdomain -> ec2 instance running nginx as a process -> tunnel -> local machine
字符串
更改是在使用caddy-docker-proxy
的docker示例中从nginx
移动到caddy
:
subdomain -> docker/caddy-docker-proxy running on ec2 instance -> tunnel -> local machine
型
这是我的球童设置:
caddy:
image: lucaslorentz/caddy-docker-proxy:ci-alpine
container_name: caddy
ports:
- 80:80
- 443:443
environment:
- CADDY_INGRESS_NETWORKS=caddy
networks:
- caddy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- caddy_data:/data
restart: unless-stopped
labels:
caddy_0: dev.domain.com
caddy_0.reverse_proxy: 172.17.0.1:9000
型
我可以根据日志确认caddy
从子域获取请求。我还可以确认如果我从EC2示例curl localhost:9000/test
,它可以工作。
这意味着运行caddy-docker-proxy
的docker容器和主机/EC2示例之间存在断开连接。
以下是来自Caddy的错误日志:
{
"level": "error",
"ts": 1695592513.784038,
"logger": "http.log.error",
"msg": "dial tcp :9000: connect: connection refused",
"request": {
"remote_ip": "redacted",
"remote_port": "60083",
"client_ip": "redacted",
"proto": "HTTP/2.0",
"method": "GET",
"host": "dev.domain.com",
"uri": "/test",
"headers": {
"Sec-Fetch-User": [
"?1"
],
"Accept-Encoding": [
"gzip, deflate, br"
],
"Accept-Language": [
"en-US,en;q=0.9,de;q=0.8"
],
"Sec-Ch-Ua": [
"\"Chromium\";v=\"116\", \"Not)A;Brand\";v=\"24\", \"Google Chrome\";v=\"116\""
],
"Sec-Ch-Ua-Mobile": [
"?0"
],
"Sec-Ch-Ua-Platform": [
"\"macOS\""
],
"Upgrade-Insecure-Requests": [
"1"
],
"User-Agent": [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
],
"Accept": [
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
],
"Sec-Fetch-Site": [
"none"
],
"Sec-Fetch-Mode": [
"navigate"
],
"Cache-Control": [
"max-age=0"
],
"Sec-Fetch-Dest": [
"document"
]
},
"tls": {
"resumed": false,
"version": 772,
"cipher_suite": 4865,
"proto": "h2",
"server_name": "dev.domain.com"
}
},
"duration": 0.00028104,
"status": 502,
"err_id": "ra595z5i9",
"err_trace": "reverseproxy.statusError (reverseproxy.go:1248)"
}
型
我从我的MacBook运行我的隧道:
tunneldev() {
emulate -LR bash;
echo "Tunneling $1 on core server to $2 on localhost";
ssh -R $1:localhost:$2 -N lab;
}
tunneldev 9000 3000
型
感觉我只需要再做一个设置就可以让docker容器通过隧道正确发送流量,但是找不到。
1条答案
按热度按时间sauutmhj1#
您面临的连接问题与网络接口的错误组合有关。
字符串
您的docker容器被认为是与您的EC2示例不同的主机。这就是为什么在Caddy配置中,您通过使用其在docker子网(
172.17.0.1
)上的IP来定位主机。因此,从docker容器到主机的流量通过与docker相关的网络接口进入主机。您的SSH
-R port:ip:port
反向端口转发命令绑定到主机(127.0.0.1
)的Telnet接口,这既是因为您没有在命令中指定任何其他内容,也是因为您的SSH服务器可能不允许任何其他内容。由于您的转发端口是在容器发送流量到的与docker相关的网络接口上打开的,因此docker容器无法连接到它。
要修复端口绑定,您可以通过使用较长的
-R ip:port:ip:port
标志来告诉SSH在特定接口上打开端口,该标志允许您选择要在主机上绑定的IP(本例中为docker接口的IP172.17.0.1
)。这样,端口将在正确的接口上打开。要允许执行此命令,您需要将服务器的SSHd配置选项
GatewayPorts
设置为clientspecified
,而不是默认值off
,该值将您限制为NTFS接口。危险:不要将
GatewayPorts
设置为yes
,这将暴露所有接口上的转发端口,包括面向Internet的公共接口。您的curl测试命令需要调整为使用IP而不是
localhost
(解析为127.0.0.1
),因为没有任何东西会监听到127.0.0.1
接口。标签:https://serverfault.com/questions/379344/selecting-interface-for-ssh-port-forwarding