我想让用户轻松将NAT上的端口转发到我的C++应用程序的本地机器上.我想在OSX和Windows上做这个工作.Linux将是一个很好的奖励,但Linux用户可能更容易手动转发端口,所以它不是一个问题.LGPL类型代码没问题,但我不能使用任何直接GPL.
我很想听听任何人在这个领域有过的想法或经历,但我想到了一些具体的问题:
我试图使用ssh端口转发来打败企业防火墙:
ssh git@GIT_SERVER -L9418:GIT_SERVER:9418
Run Code Online (Sandbox Code Playgroud)
在另一个终端我跑
git clone git://localhost:repositories/project.git
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
/Users/aboxer/tmp/glucosia/.git/中初始化的空Git存储库
致命:无法查找localhost(端口存储库)(提供节点名称或服务名称,或未知)
谢谢!
我构建了一个打开ServerSocket的简单应用程序,在连接时,它将自身连接到远程计算机上的另一个服务器套接字.为了实现端口转发,我使用两个线程,一个从本地输入流读取并流到远程套接字输出流,反之亦然.
实现感觉有点无法实现,所以我问你是否知道更好的实现策略,或者甚至有一些代码可以以高效的方式实现.
PS:我知道我可以在Linux上使用IPTables,但这必须在Windows上运行.
PPS:如果你发布这个简单任务的实现,我将创建一个基准来测试所有给定的实现.对于许多小型(~100字节)包和稳定数据流,解决方案应该是快速的.
我当前的实现是这样的(在每个方向的两个线程中执行):
public static void route(InputStream inputStream, OutputStream outputStream) throws IOException {
byte[] buffer = new byte[65536];
while( true ) {
// Read one byte to block
int b = inputStream.read();
if( b == - 1 ) {
log.info("No data available anymore. Closing stream.");
inputStream.close();
outputStream.close();
return;
}
buffer[0] = (byte)b;
// Read remaining available bytes
b = inputStream.read(buffer, 1, Math.min(inputStream.available(), 65535));
if( b == - 1 ) {
log.info("No data available anymore. Closing stream.");
inputStream.close();
outputStream.close(); …Run Code Online (Sandbox Code Playgroud) 我试图使用c#设置端口转发,但我在visual studio中不断收到此错误.
Interop type 'NATUPNPLib.UPnPNATClass' cannot be embedded. Use the applicable interface instead.
这是代码:
NATUPNPLib.UPnPNATClass upnpnat = new NATUPNPLib.UPnPNATClass();
NATUPNPLib.IStaticPortMappingCollection mappings = upnpnat.StaticPortMappingCollection;
mappings.Add(9099, "UDP", 9099, "192.168.1.101", true, "Local Web Server");
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我在这里找到了代码.
我已经尝试通过路由器端口转发,也禁用了我的防火墙.我还编辑了httpd.conf.我改变了
Listen 80
Run Code Online (Sandbox Code Playgroud)
至
Listen 8080
Run Code Online (Sandbox Code Playgroud)
我也改变服务器名称由localhost:80到<private-ip>:80 i.e 192.168.1.2:80.
最后我改
Order Allow,Deny
Allow from all
Run Code Online (Sandbox Code Playgroud)
在offlineonline标签中.我有DLink DSL-2730U.在高级设置> NAT>外部端口启动8080和结束8080>内部端口启动8080和结束8080>服务器IP我保持为192.168.1.2然后重新启动所有服务,即路由器和wamp.但我仍然无法通过我的公共IP访问wamp,这是59.95.81.56.
我尝试与nodejs ws(einaros)创建聊天,这是我的代码:
服务器:
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({ port: 80 });
wss.on('connection', function(ws) {
console.log('connecting count:' + wss.clients.length);
});
Run Code Online (Sandbox Code Playgroud)
客户:
var hostname = location.hostname;
var port = 80;
var url = 'ws://'+hostname+':'+port+'/';
window.WebSocket = window.WebSocket || window.MozWebSocket;
var w = new WebSocket(url);
Run Code Online (Sandbox Code Playgroud)
当我用我的计算机或其他与我的路由器连接的计算机进行测试时,它运行良好.但是,通过Internet访问的其他客户端无法建立连接.当然,他们使用公共IP,如218.xxx.xxx.xxx,而不是192.168.xxx.xxx.
我想知道如何解决这个问题.
谢谢你的回答.但是,这可能不是NAT问题.例如,我的公共IP是218.100.50.50,而我的私有IP是192.168.1.1.当连接来自我的网络外部并访问218.100.50.50:80时,路由器将其重定向到192.168.1.1:80.有一个可以通过这种方式访问的网页,但仍然无法连接到我的websocket服务器.这个问题让我很困惑.
我已经设置了Docker容器来访问我的机器docker容器到本地的另一台机器.
在命令下创建一个容器:
docker run -it -d --name containerName -h www.myhost.net -v /var/www/html -p 7000:8000 --net mynetwork --ip 172.11.0.10 --privileged myimagename bash
Run Code Online (Sandbox Code Playgroud)
创建容器详细信息后:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e1e5e9b74b4 myimgaename "bash" 21 minutes ago Up 6 minutes 0.0.0.0:7000->8000/tcp containername
Run Code Online (Sandbox Code Playgroud)
网络细节:
"NetworkSettings": {
"Bridge": "",
"SandboxID": "fe357c54c816fff0f9d642037dc9a173be7f7e42a80776d006572f6a1395969e",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"8000/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "7000"
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果我在mymachine(hostmachine)访问docker ipaddr(172.11.0.10)或hostname(www.myhost.net)它工作
但是,如果我使用端口访问不起作用:hostmachine ip:192.168.1.1
go to the browser 192.168.1.1:7000 hostmachine and locally …Run Code Online (Sandbox Code Playgroud) 我正在编写一个 P2P 应用程序,希望避免用户手动设置端口转发。
我有点困惑,因为似乎有两种不同的协议来配置 NAT,UPnP/IGD 和 NAT-PMP。我应该使用哪一个?所有 NAT 都支持它们吗?或者我应该同时支持两者以确保 NAT 至少支持其中之一?
我正在尝试在 Windows 电脑上使用 ssh 从本地网络中的 Raspberry pi 进行远程端口转发
ssh -R 5941:localhost:8000 pi@192.168.1.191
Run Code Online (Sandbox Code Playgroud)
因此,根据上面的命令,我尝试将连接从 Raspberry pi 服务器 (192.168.1.191) 上的端口 5941 转发到我的电脑 (localhost) 上的端口 8000,该电脑在端口 8000 上托管一个 Web 服务器
上面的 ssh 命令执行没有错误,但是当我尝试在 Raspberry Pi (192.168.1.191) 上访问 http://localhost:5941/ 时,我得到
ERR_EMPTY_RESPONSE
Run Code Online (Sandbox Code Playgroud)
我努力了
$ sudo netstat -a | grep 5941
tcp 0 0 0.0.0.0:5941 0.0.0.0:* LISTEN
tcp6 0 0 [::]:5941 [::]:* LISTEN
Run Code Online (Sandbox Code Playgroud)
ssh -R 5941:localhost:8000 pi@192.168.1.191 -v
我得到了这个debug1: Remote connections from LOCALHOST:5941 forwarded …Run Code Online (Sandbox Code Playgroud) 我想在 Github Actions 中运行数据库迁移。数据库位于堡垒后面。
我的解决方案是通过堡垒将 Postgres 端口 5432 转发到数据库主机。
我尝试了下面的脚本,但似乎不起作用。
mkdir ~/.ssh
ssh-keyscan -H <bastion_ip> >> ~/.ssh/known_hosts
echo "${{secrets.BASTION_SSH_KEY}}" >> key
chmod 600 ./key
ssh -T -i ./key -L 5432:<db_host_url>:5432 user@<bastion_ip> &
make migrate
rm ./key
Run Code Online (Sandbox Code Playgroud)
make migrate针对 运行迁移localhost:5432。
当我运行管道时出现以下错误
Error: AssertionError [ERR_ASSERTION]: ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:5432
Run Code Online (Sandbox Code Playgroud)
无论如何要修复它吗?我对其他方式持开放态度。