内网的 NAS 上 Host 了一个 NextCloud 服务,路由器端口映射到外网,使用 V2RAY 和 REDSOCKS2 的时候,使用正常。
换用 CLASH,开启 CLASH 后,无法访问,log 一直提示如下
dial DIRECT error: dial tcp4 xxx.xxx.xxx.xxx:xx: connect: connection refused
我使用了动态 DNS 服务,DNS 解析没问题,IP 能正确解析出来
不过,DNS 也切换用 FAKE-IP 和 REDIR-HOST,均无法解决
请问是什么原因呢?
补充一下,我设置了 iptables,将 NextCloud 的这个设备的地址在 NAT 表里设置成了 RETURN
啊,我也遇到同样的问题。
我搭建了一台Debian作为旁路网关,主路由中映射的端口不起作用。
我试过在旁路网关中关掉:
iptables -t nat -D PREROUTING -p tcp -j clash
关掉之后端口映射正常。
啊,我也遇到同样的问题。
我搭建了一台Debian作为旁路网关,主路由中映射的端口不起作用。
我试过在旁路网关中关掉:iptables -t nat -D PREROUTING -p tcp -j clash关掉之后端口映射正常。
前两天时间太匆忙,没有详细描述使用环境。
我的使用环境是有一台主路由器负责拨号、DHCP、端口转发等。WAN口为公网IP,内网IP为10.0.0.1。
然后内网中我设置了一台Debian虚拟机,只有一个LAN口连接到主路由器,IP为10.0.0.254,网关指向10.0.0.1,开启了NAT转发,同时Clash也运行在这台虚拟机上。
Clash使用透明网关配置,开启redir-port,DNS采用redir-host模式。然后配置了iptables如下:
iptables -t nat -N clash
iptables -t nat -A clash -d 10.0.0.0/24 -j RETURN
iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7892
iptables -t nat -A PREROUTING -p tcp -j clash
然后内网中有一台Win 10,IP为10.0.0.250开启了3389,通过在主路由上设置端口映射,将公网的30333-->映射到10.0.0.250的3389。
具体现象如下:
如果通过以下语句:
iptables -t nat -D PREROUTING -p tcp -j clash
删掉Debian中的iptable规则,设备映射正常,可以通过外网直接访问内网服务器;
在Debian上添加iptables规则如下:
iptables -t nat -I clash -p tcp -j LOG --log-prefix "Clash IPT"
可以看到系统日志中有TCP连接记录:
Clash IPT IN=ens18 OUT= MAC=cxxxxxxxxxxxxxxxxxxxxxxxx:00 SRC=10.0.0.250 DST=a.b.c.d LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=63232 DF PROTO=TCP SPT=4443 DPT=60929 WINDOW=508 RES=0x00 ACK URGP=0
...
PREROUTING链,而是通过主路由(10.0.0.1)的转发直接到了Win 10上,所以系统log中只有SRC=10.0.0.250的日志,没有DST=10.0.0.250的日志;PREROUTING链,留下了系统日志;PREROUTING链。在主路由上做端口映射,将公网的30333-->映射到Debian透明网关的30333,然后再在Debian透明网关上将端口DNAT到Win 10主机的3389端口上。此方法测试通过,让外网进来的连接也通过了Clash;
iptables -t nat -I PREROUTING -p tcp -m multiport --sports 21,80,443,8006,3899,4443 -j RETURN
啊,我也遇到同样的问题。
我搭建了一台Debian作为旁路网关,主路由中映射的端口不起作用。
我试过在旁路网关中关掉:iptables -t nat -D PREROUTING -p tcp -j clash关掉之后端口映射正常。
前两天时间太匆忙,没有详细描述使用环境。
环境描述:
我的使用环境是有一台主路由器负责拨号、DHCP、端口转发等。WAN口为公网IP,内网IP为
10.0.0.1。
然后内网中我设置了一台Debian虚拟机,只有一个LAN口连接到主路由器,IP为10.0.0.254,网关指向10.0.0.1,开启了NAT转发,同时Clash也运行在这台虚拟机上。
Clash使用透明网关配置,开启redir-port,DNS采用redir-host模式。然后配置了iptables如下:iptables -t nat -N clash iptables -t nat -A clash -d 10.0.0.0/24 -j RETURN iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7892 iptables -t nat -A PREROUTING -p tcp -j clash然后内网中有一台Win 10,IP为
10.0.0.250开启了3389,通过在主路由上设置端口映射,将公网的30333-->映射到10.0.0.250的3389。
具体现象如下:
- 在Clash正常运行,Debian网关设备正常工作的情况下,无法通过外网访问内网服务器,连接超时,同时Clash中没有任何日志记录;
- 如果通过以下语句:
iptables -t nat -D PREROUTING -p tcp -j clash删掉Debian中的iptable规则,设备映射正常,可以通过外网直接访问内网服务器;
- 在Debian上添加iptables规则如下:
iptables -t nat -I clash -p tcp -j LOG --log-prefix "Clash IPT"可以看到系统日志中有TCP连接记录:
Clash IPT IN=ens18 OUT= MAC=cxxxxxxxxxxxxxxxxxxxxxxxx:00 SRC=10.0.0.250 DST=a.b.c.d LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=63232 DF PROTO=TCP SPT=4443 DPT=60929 WINDOW=508 RES=0x00 ACK URGP=0 ...通过日志可以判断:
- 外网进来的连接没有通过Debian透明网关的
PREROUTING链,而是通过主路由(10.0.0.1)的转发直接到了Win 10上,所以系统log中只有SRC=10.0.0.250的日志,没有DST=10.0.0.250的日志;- 当Win 10接收到连接命令之后,通过Debian透明网关发出响应,这时连接进入到Debian的
PREROUTING链,留下了系统日志;- Win 10响应的连接最终进入到了Clash中,但是这个TCP连接只有响应,Clash应该是丢弃了(瞎猜)。
临时的解决方法:
- 方法一:让外网进来的连接也通过Debian透明网关的
PREROUTING链。在主路由上做端口映射,将公网的30333-->映射到Debian透明网关的30333,然后再在Debian透明网关上将端口DNAT到Win 10主机的3389端口上。此方法测试通过,让外网进来的连接也通过了Clash;- 方法二: 保持之前的主路由映射规则,在Debian透明网关中设置iptables规则,将Win 10发出的响应连接不通过Clash(根据源端口过滤,一次性设置了多个端口):
iptables -t nat -I PREROUTING -p tcp -m multiport --sports 21,80,443,8006,3899,4443 -j RETURN
真是详细的说明
谢谢
@neroanelli 分析的挺对的,就是包来回的路径不一样。SYN 通过主路由直接发到内网机器上,SYN ACK 发给Clash了,除非 Clash 使用 Raw Socket 特别处理这样的数据包,否则 Clash 没有任何办法处理此类 SYN ACK。
猜测使用 conntrack 可以解决这种问题,只将 SYN 和已经建立连接的数据包发给 Clash,也许能解决问题。
尝试将
iptables -t nat -D PREROUTING -p tcp -j clash
改成
iptables -t nat -D PREROUTING -p tcp -m state --state NEW,ESTABLISHED -j clash
也许管用。
@vongoethe 上述的解決方案有效嗎?
请问一下我开启Clash后显示Connected却无法访问外网。在Connection处没有任何网站接入,也没有任何流量上传和下载。请问一下怎么解决?谢谢
ubuntu安装同样遇到这问题 dial DIRECT error: 请问可以如何解决呢
遇到同样的问题。群晖虚拟机的clash一开启,主路由端口映射到群晖的端口全部失效。例如互联网无法访问群晖的主页,webdav,emby等。
用楼上兄弟的
iptables -t nat -I PREROUTING -p tcp -m multiport --sports 21,80,443,8006,5000,8096 -j RETURN
解决了
This issue is stale because it has been open 120 days with no activity. Remove stale label or comment or this will be closed in 5 days
Most helpful comment
前两天时间太匆忙,没有详细描述使用环境。
环境描述:
我的使用环境是有一台主路由器负责拨号、DHCP、端口转发等。WAN口为公网IP,内网IP为
10.0.0.1。然后内网中我设置了一台Debian虚拟机,只有一个LAN口连接到主路由器,IP为
10.0.0.254,网关指向10.0.0.1,开启了NAT转发,同时Clash也运行在这台虚拟机上。Clash使用透明网关配置,开启
redir-port,DNS采用redir-host模式。然后配置了iptables如下:然后内网中有一台Win 10,IP为
10.0.0.250开启了3389,通过在主路由上设置端口映射,将公网的30333-->映射到10.0.0.250的3389。具体现象如下:
如果通过以下语句:
删掉Debian中的iptable规则,设备映射正常,可以通过外网直接访问内网服务器;
在Debian上添加iptables规则如下:
可以看到系统日志中有TCP连接记录:
通过日志可以判断:
PREROUTING链,而是通过主路由(10.0.0.1)的转发直接到了Win 10上,所以系统log中只有SRC=10.0.0.250的日志,没有DST=10.0.0.250的日志;PREROUTING链,留下了系统日志;临时的解决方法:
PREROUTING链。在主路由上做端口映射,将公网的30333-->映射到Debian透明网关的30333,然后再在Debian透明网关上将端口DNAT到Win 10主机的3389端口上。此方法测试通过,让外网进来的连接也通过了Clash;iptables -t nat -I PREROUTING -p tcp -m multiport --sports 21,80,443,8006,3899,4443 -j RETURN