当我在局域网内时,iptables 允许访问我的个人网站,但当我在局域网外时,iptables 会阻止访问

当我在局域网内时,iptables 允许访问我的个人网站,但当我在局域网外时,iptables 会阻止访问

我正在使用透明代理将请求从源(客户端)转发到目标(服务器)。我使用 iptables 使透明位工作……即:即使请求通过中间代理,它也会使客户端 ip 出现在目标位置……实际上它称为 SSLH。https://github.com/yrutschle/sslh

规则如下:

iptables -w -t mangle -N SSLH
iptables -w -t mangle -A PREROUTING -p tcp -m socket --transparent -j SSLH
iptables -w -t mangle -A OUTPUT --protocol tcp --out-interface eth0 -m multiport --sport 80,443,4480 --jump SSLH
iptables -w -t mangle -A SSLH --jump MARK --set-mark 0x1
iptables -w -t mangle -A SSLH --jump ACCEPT
ip rule add fwmark 0x1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

我在与代理相同的机器上运行 apache 上的网站,它是我家局域网内的一台 Pi。

当我尝试访问该 apache 上的网站并且请求来自局域网之外时...比如如果我连接到手机上的 wifi 热点,页面就会出现在浏览器中,但是如果我连接到我的局域网 wifi 网络并尝试打开同一个页面我会得到超时...除非我禁用那些 iptables 规则...但是当我这样做时来自局域网之外的请求会超时。

为了使事情稍微复杂一些,我还使用在同一个 Pi 上运行的 dnsmasq 来模拟 NAT 环回,这样我就可以使用它的域名而不是仅仅使用本地 IP 地址从我自己的 LAN 内访问该网站。

如果我只是使用网络服务器的本地 IP 地址,它仍然不会工作,除非我

我是否需要修改 iptables 规则以便像这样的 Web 请求:

https://www.example.com/test.html

无论我在局域网外部还是内部,都会显示该页面吗?

谢谢你,

柔性

答案1

我有一个可行的解决方案。

我的问题是......

我是否需要修改 iptables 规则以便像这样的 Web 请求:
https://www.example.com/test.html
无论我在局域网外部还是内部,都会显示该页面吗?

我的 iptables 规则似乎阻止了来自 LAN 内部的连接请求。我仍然不知道这到底是为什么,除非一定是 iptables 规则在这么做,因为来自 LAN 外部的请求在规则生效时可以正常工作,而来自外部或内部的请求在规则完全关闭时也可以正常工作。

我有一个想法,添加规则以接受来自本地 LAN 上所有 IP 的传入和传出流量。路由器上的 dhcp 服务器将 IP 分配给 LAN 上 192.168.1.1 到 192.168.1.200 范围内的设备

通过指定 192.168.1.0/24,我可以引用该范围内的所有 IP。

以下是我现在使用的规则:

iptables -t mangle -N SSLH
iptables -t mangle -A INPUT -p tcp -s 192.168.1.0/24 -j ACCEPT
iptables -t mangle -A OUTPUT -p tcp -d 192.168.1.0/24 -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j SSLH
iptables -t mangle -A OUTPUT -p tcp --out-interface eth0 -m multiport --sport 80,443,4480 -j SSLH
iptables -t mangle -A SSLH -j MARK --set-mark 0x1
iptables -t mangle -A SSLH -j ACCEPT
ip rule add fwmark 0x1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

我很高兴地说,像这样的网址https://www.example.com/它指向我局域网上 Pi 上的个人 Apache 服务器上的网页,如果我从局域网内部或外部请求该页面,就会打开该网页。

为了弄清楚为什么我的原始规则会阻止来自 LAN 内部的请求,我尝试进行以下更改:

iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j SSLH

到:

iptables -t mangle -A PREROUTING -p tcp -j SSLH

因为透明套接字匹配会忽略非透明套接字,而未通过 sslh 的请求将会是非透明套接字。但来自本地 IP 地址的流量仍然被阻止。

这条规则可能是罪魁祸首……它将我 Web 服务器(端口 443)的所有传出数据包发送到用户定义的链 SSLH。此链中的所有数据包都经过标记,并在之后的规则的帮助下路由到环回接口以供 sslh 代理处理。

iptables -t mangle -A OUTPUT -p tcp --out-interface eth0 -m multiport --sport 80,443,4480 -j SSLH

但是当这些数据包是“传入”的并且首先没有通过 sslh 代理到达目的地时,当它们“传出”并被路由到环回接口以由 sslh 处理时,我猜它不知道如何处理它们,它们只是丢失了..在这种情况下,需要这些数据包来使网页出现在客户端浏览器上,因此网站超时。

干杯,

柔性

相关内容