![使用 iptables、-m recent(可能)和 -m string(肯定)仅允许通过 HTTPS 连接到特定的 URL](https://linux22.com/image/535112/%E4%BD%BF%E7%94%A8%20iptables%E3%80%81-m%20recent%EF%BC%88%E5%8F%AF%E8%83%BD%EF%BC%89%E5%92%8C%20-m%20string%EF%BC%88%E8%82%AF%E5%AE%9A%EF%BC%89%E4%BB%85%E5%85%81%E8%AE%B8%E9%80%9A%E8%BF%87%20HTTPS%20%E8%BF%9E%E6%8E%A5%E5%88%B0%E7%89%B9%E5%AE%9A%E7%9A%84%20URL.png)
假设我想允许连接仅有的到 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 模块,我已获得预期结果。如果我设法将其清理干净,我将通过编辑添加修订。