iptables 太他妈难用了

2023-02-11 19:05:58 +08:00
 huiyanpohundh123

搞了一下午,想在部署了 docker 的机器上搞个透明代理,看了一天也没看懂 docker 的 nat 是怎么配的,模拟怎么也跑不通

话说有了第一条规则后,后面的规则还有屁用啊

10057 次点击
所在节点    程序员
68 条回复
xicole
2023-02-12 10:01:41 +08:00
刚好搞了几天的 clash ,iptables 搞通了但是用一段时间会断不知何解,后来转用 Tun 模式关了 iptables ,暂时可用没有发现什么大问题,用的 clash.meta ,docker 里面安装的,另外还使用了 mosdns ,也是 docker ,
硬件:N1 刷的 F 大的固件,
huiyanpohundh123
2023-02-12 10:11:56 +08:00
@Yuanandyuan -P PREROUTING ACCEPT
-P INPUT ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT
-N LIBVIRT_PRT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -j LIBVIRT_PRT
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 9443 -j MASQUERADE
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 9000 -j MASQUERADE
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 8000 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 6969 -j MASQUERADE
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A LIBVIRT_PRT -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A LIBVIRT_PRT -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 9443 -j DNAT --to-destination 172.17.0.3:9443
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 9000 -j DNAT --to-destination 172.17.0.3:9000
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8000 -j DNAT --to-destination 172.17.0.3:8000
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6969 -j DNAT --to-destination 172.17.0.2:6969
huiyanpohundh123
2023-02-12 10:18:19 +08:00
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER 这条规则也很怪匹配本地地址,但非环回地址,那 127.0.0.1 岂不是没法进入 docker 链,但是测试是可以的
xuanbg
2023-02-12 10:21:45 +08:00
docker 我都直接--network host ,直接挂宿主机。这样只要宿主机网络搞定就万事大吉了。
zhyl
2023-02-12 14:32:02 +08:00
@huiyanpohundh123
`-A DOCKER -i docker0 -j RETURN`
只有 docker0 接口的流量 RETURN 不会走 DOCKER 表,并不是所有的 DOCKER 表流量都 RETURN

127.0.0.1 能进 docker 有一篇文章说的很清楚 https://www.ipspace.net/kb/DockerSvc/40-userland-proxy.html
简单的说就是 docker 监听了::port ,请求 127.0.0.1:port 会被 docker 处理,docker 内部再转发到 docker 容器内的 ip 段
qwq11
2023-02-12 14:59:28 +08:00
没太懂你透明代理怎么搞的,看上面的回复应该是在 prerouting 表里 dnat 到了你的代理端口上。那那这样你就得在 prerouting 表里匹配然后 accpet ,让他进到你本机里,规则优先级要比你之前那条高,大概是

iptables -t nat -A PREROUTING -s 192.168.1.1/24 -d 192.168.1.2 -j accept

这样?

建议把整个 iptables 配置发上来
sudo iptables -L -v -n | curl -F 'file=@-' 0x0.st
qwq11
2023-02-12 15:04:22 +08:00
@qwq11 #46
忘了加 dport 了
iptables -t nat -A PREROUTING -s 192.168.1.1/24 -d 192.168.1.2 --dport 9000 -j accept
liuxu
2023-02-12 15:38:46 +08:00
iptables 不是给普通用户用的,总归是得有点基础才行,要不然怎么会还有 firewared 和 ufw 这些应用

docker 只是在 iptables 插入自己的 chain 而已,正常不需要自己处理 iptables

想手动干涉 DOCKER chains ,用 iptables -I 插入到 RETURN 前面
liuxu
2023-02-12 15:40:04 +08:00
firewalld
adoal
2023-02-12 16:08:59 +08:00
iptables 固然不亲善,docker 则是另一坨屎。需要自己配置防火墙规则的应用,不建议凑热闹放到 docker 里。有条件的话还是用虚拟机来跑吧。
koplonjaslon02
2023-02-12 16:26:54 +08:00
现在在折腾 nftables ,资料比 iptables 还少,但感觉上手后能和 iptables 拉开差距
yinmin
2023-02-12 18:05:04 +08:00
换一种思路,不折腾 iptables 。你在 Docker 容器里的 /root/.bashrc 文件最后加上 4 行:
export use_proxy=on
export http_proxy=http://ip:port
export https_proxy=http://ip:port
export all_proxy=http://ip:port

然后容器里的应用都会走代理了,是不是也能解决实际问题?
yinmin
2023-02-12 18:15:48 +08:00
换一种思路,不折腾 iptables 。在 Docker 里安装 openwrt 旁路由。
zhzy0077
2023-02-12 18:29:51 +08:00
在世上还没有 docker 和 cgroup 之前 iptables 就已经特别难用了 而且还没得选

难学 难调试 难开发 难部署
ccming
2023-02-12 19:36:54 +08:00
请注意文明用语
zhanlanhuizhang
2023-02-12 20:50:36 +08:00
研究一下,不难的,不要一下子去看网上的文章,直接看教程。就能自己组合了。
2kCS5c0b0ITXE5k2
2023-02-12 20:52:47 +08:00
主要是调试麻烦..
HungryOrangeCat
2023-02-13 08:49:45 +08:00
@yinmin 这个只能限定那些走 http 代理的,没法限定比如直接 tcp ,udp 或者不按照代理走的,前些时间我也在研究 OP 的这个问题
julyclyde
2023-02-13 08:56:31 +08:00
说白了这事其实是你误以为可以无基础使用 docker ,结果使用了 docker 带来无尽的麻烦的问题

用 network=host 就行了!!
zero01
2023-02-13 09:35:51 +08:00
docker 透明代理可以用 v2rayA 非常好用
https://v2raya.org/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/915216

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX