使用 iptables、-m recent(可能)和 -m string(肯定)仅允许通过 HTTPS 连接到特定的 URL

使用 iptables、-m recent(可能)和 -m string(肯定)仅允许通过 HTTPS 连接到特定的 URL

假设我想允许连接仅有的到 subdomain.mydomain.com;我让它部分工作,但一旦允许客户端问候,它有时会与客户端密钥交换陷入怪异的循环。啊,更烦人的是,它是一个自签名证书,页面需要身份验证,而 HTTPS 正在监听非标准端口……因此,对于许多用户来说,TCP/SSL 握手体验会大不相同。

-m recent 是正确的路线吗?有没有更优雅的方法可以在看到字符串后允许完整的 TCP 流?

以下是我目前所掌握的信息:

#iptables -N SSL
#iptables -A 输入 -i eth0 -p tcp -j SSL
#iptables -A SSL -m recent --set -p tcp --syn --dport 400
#iptables -A SSL -m recent --update -p tcp --tcp-flags PSH,SYN,ACK SYN,ACK --sport 400
#iptables -A SSL -m recent --update -p tcp --tcp-flags PSH,SYN,ACK ACK --dport 400
#iptables -A SSL -m recent --remove -p tcp --tcp-flags PSH,ACK PSH,ACK --dport 400 -m string --algo kmp --string “subdomain.mydomain.com” -j 接受

是的,我曾尝试通过调整 nginx 来解决这个问题,但是我无法让 nginx 在客户端 hello 之前返回 444 或突然断开连接,如果你能想到一种方法来实现这一点,我洗耳恭听,呃,睁大眼睛。

(根据一位用户的建议,将此查询从https://stackoverflow.com/questions/4628157/allow-connections-to-only-a-specific-url-via-https-with-iptables-m-recent-pote

答案1

这似乎是一种非常复杂的解决问题的方法。如果你只是把子域名.mydomain.com然后使用在你的 iptables 规则中?

我很好奇...您到底想解决什么问题,而使用 nginx 允许/拒绝选项无法解决?确实,这需要完成 SSL 协商(因为 nginx 在建立 SSL 连接之前不知道客户端请求什么),但在大多数情况下这是可以的。

答案2

我想我已经找到了一个解决方案,它比我之前过于复杂的解决方案简单得多:

iptables -A INPUT -i eth0 -p tcp --tcp-flags FIN,PSH,ACK PSH,ACK --dport 400 -m connbytes --connbytes 3:3 --connbytes-dir original --connbytes-mode packets -m string --algo bm !--string "subdomain.mydomain.com" -j REJECT --reject-with tcp-reset
iptables -A 输入 -i eth0 -p tcp --dport 400 -j 接受

通过结合使用 connbytes 和 string 模块,我已获得预期结果。如果我设法将其清理干净,我将通过编辑添加修订。

相关内容