透明代理中iptables设置
关键点说明:
- 透明代理端口 : tport=3333,这里使用Clash的
redir-port
参数值 - 无污染的DNS服务转发端口: dns_port=1053,这里使用Clash的
dns.listen
参数值 - iptables命令: 内网消息转发规则配置
- dnsmasq: 内置DNS服务
透明代理配置方法有:
- 简单粗暴: 所有HTTP(S)请求都转发给
透明代理端口
处理,由透明代理
决定是否使用代理转发。 - 精细化分: 根据
ipset
规则识别流量是否需要转发给透明代理端口
,减少透明代理
处理的消息量(透明代理出问题也不会影响直连的网站)。
方法一:所有流量都转发给透明代理处理
这种方法适合这样的场景:
- 透明代理具备规则转发功能,可以根据URL规则或IP规则判断是否使用代理。
透明代理
的处理能力还不错,对于家庭内部流量足够支撑情况下,Clash通常足够。
详细的配置iptables
规则如下:
# 添加iptables规则
table_name="CLASH_RULES"
lan_ipaddr=$(nvram get lan_ipaddr) # 局域网地址
redir_port=3333 # 透明代理端口
dns_port=1053 # 无污染的DNS服务端口(Clash内置DNS服务或者其他安全DNS服务)
iptables -t nat -N ${table_name}
iptables -t nat -F ${table_name}
# Fake-IP 规则添加
iptables -t nat -A OUTPUT -p tcp -d 198.18.0.0/16 -j REDIRECT --to-port ${redir_port}
iptables -t nat -A PREROUTING -p tcp -s ${lan_ipaddr}/16 -j ${table_name}
# 本地地址请求不转发
iptables -t nat -A ${table_name} -d 10.0.0.0/8 -j RETURN
iptables -t nat -A ${table_name} -d 127.0.0.0/8 -j RETURN
iptables -t nat -A ${table_name} -d 169.254.0.0/16 -j RETURN
iptables -t nat -A ${table_name} -d 172.16.0.0/12 -j RETURN
iptables -t nat -A ${table_name} -d ${lan_ipaddr}/16 -j RETURN
# 服务端口${redir_port}接管HTTP/HTTPS请求转发, 过滤 22,1080,8080一些代理常用端口
iptables -t nat -A ${table_name} -s ${lan_ipaddr}/16 -p tcp -m multiport --dport 80,443 -j REDIRECT --to-ports ${redir_port}
# 转发DNS请求到端口 dns_port 解析
iptables -t nat -N ${table_name}_DNS
iptables -t nat -F ${table_name}_DNS
iptables -t nat -A ${table_name}_DNS -p udp -s ${lan_ipaddr}/16 --dport 53 -j REDIRECT --to-ports $dns_port
iptables -t nat -I OUTPUT -p udp --dport 53 -j ${table_name}_DNS
iptables -t nat -A PREROUTING -p udp -s ${lan_ipaddr}/16 --dport 53 -j ${table_name}_DNS
# 清理iptables规则
table_name="CLASH_RULES"
lan_ipaddr=$(nvram get lan_ipaddr) # 局域网地址
redir_port=3333 # 透明代理端口
# Fake-IP 规则清理
iptables -t nat -D OUTPUT -p tcp -d 198.18.0.0/16 -j REDIRECT --to-port ${redir_port}
iptables -t nat -D PREROUTING -p tcp -s ${lan_ipaddr}/16 -j ${table_name}
iptables -t nat -F ${table_name}
iptables -t nat -X ${table_name}
iptables -t nat -D PREROUTING -p udp -s ${lan_ipaddr}/16 --dport 53 -j ${table_name}_DNS
iptables -t nat -D OUTPUT -p udp --dport 53 -j ${table_name}_DNS
iptables -t nat -F ${table_name}_DNS
iptables -t nat -X ${table_name}_DNS
方法二:精细化分流量后转发给透明代理处理
这种方法适合这样的场景:
- 透明代理不具备规则转发功能,不能根据URL规则或IP规则判断是否使用代理。
- 内网的流量很大,而
透明代理
的处理能力不足时。
ipset
配置过程如下:
# 创建ipset黑名单(命中规则走代理)
ipset -! create gfwlist nethash && ipset flush gfwlist
# /jffs/configs/dnsmasq.d
conf_dir=`awk -F'=' '/conf-dir/{ print $2 }' dnsmasq.conf`
echo "配置ipset规则目录: ${conf_dir}"
# 添加Ipset规则到 dnsmasq 服务中(只要ipset表创建正确dnsmasq就会更新对应的数据)
cd ${conf_dir} && ln -sf /koolshare/clash/gfwlist.conf gfwlist.conf && ln -sf /koolshare/clash/wblist.conf wblist.conf
# 重启dnsmasq
service restart_dnsmasq
其中,gfwlist.conf
文件下载地址在这里。
iptables
配置过程(添加、删除规则操作)如下:
# 添加iptables规则
table_name="CLASH_RULES"
lan_ipaddr=$(nvram get lan_ipaddr) # 局域网地址
redir_port=3333 # 透明代理端口
iptables -t nat -N ${table_name}
iptables -t nat -F ${table_name}
iptables -t nat -A PREROUTING -p tcp -s ${lan_ipaddr}/16 -m set --match-set gfwlist dst -j ${table_name}
# 使用 ipset 规则转发处理请求
iptables -t nat -A ${table_name} -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-ports ${redir_port}
# 清理iptables规则
table_name="CLASH_RULES"
lan_ipaddr=$(nvram get lan_ipaddr) # 局域网地址
redir_port=3333 # 透明代理端口
iptables -t nat -D PREROUTING -p tcp -s ${lan_ipaddr}/16 -m set --match-set gfwlist dst -j ${table_name}
iptables -t nat -D ${table_name} -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-ports ${redir_port}
iptables -t nat -F ${table_name}
iptables -t nat -X ${table_name}
最后
两种方法可以看出,第二种方法更通用一些,比如启动一个ss/ssr/v2ray代理,通过方法二就可以实现透明代理功能。
而第一种方法就不那么通用,更适合使用Clash来实现透明代理功能。
windows下面弄个 WSL2 +docker desktop+ clash 透明代理,最终目的是局网其他机器利用宿主机A的高带宽,同时自动翻墙,所有大网流量走宿主机A的无线网卡。clash 用桥接+端口映射在docker desktop里建立。映射了“0.0.0.0:7892”等一系列的常规端口,运行起来以后,宿主机和其他主机均可通过宿主机IP:7890的方式上网。IPtables模式怎么也搞不定。clash设置host模式宿主机访问不到。
在nat表中新建一个clash规则链简单粗暴的试了3条,希望全部走宿主机A的网卡。局网内机器网关和DNS分别试过宿主机,WSL2 ,docker desktop的IP,都无法连接,clash看不到访问信息。按理说如果是正常的ubuntu应该可以上网了,我现在是在clash的log里看不到有连接,log设info。ubuntu的ip转发也设成pv4/ip_forward=1。
sudo iptables -t nat -N CLASH
重定向tcp流量到本机7892端口sudo iptables -t nat -A CLASH -p tcp -j REDIRECT --to-port 7892
拦截外部tcp数据并交给clash规则链处理sudo iptables -t nat -A PREROUTING -p tcp -j CLASH
dnsmasq: 好像 WSL2的ubuntu没开。
确保 让局域网所有流量经过 clash虚拟主机B , 方法有:
修改现有网关C转发某些或全部流量给B处理,简单操作,但有网关操作权限。手动修改局域网内需要外网的主机 route路由规则,不是内网网段IP消息都转发给网关B(适合办公网络,不影响工作)转发,我以前这样搞过,写个route规则bat脚本执行一下就搞定。如果B已经是默认网关了,那上面操作忽略。
让内网消息转发到网关B是 前提,之后才能验证 clash透明代理 的问题。
就是因为单位网关设定了一堆规则,办公电脑默认账号wifi网络全速100M/s,其他账号wifi和所有lan口10M/s。现在我就是想把办公电脑默认账号wifi的100M分享给自己电脑手机。办公电脑clash f win的yunxulan代理模式能解决一部分,电脑代理选择全部代理基本上可以。但是子网的手机访问国内网站还是走自己的小水管,
主机 route路由规则已改,内网访问nas用有线,访问外网用无线。
共享脑默认账号wifi无线网卡也不行,被绑定了登录信息