是限制程序,而不是来源 IP 。
比如只允许 /usr/bin/curl 发起 HTTP 访问 127.0.0.1:8000
python 用 requests 就不行
1
guxingke 2023-10-27 17:23:35 +08:00
http 协议决定了 限制不了
|
2
zsj1029 2023-10-27 17:30:25 +08:00 1
userAgent 咯 curl 有自己的 agent
不过这玩意可以伪造,py request 改掉 header 可以绕过 |
3
ShineyWang 2023-10-27 17:39:33 +08:00 via Android
怎么发起请求是客户端行为,你服务器限制不了的
除非你自己给他一个客户端,然后用你自己的客户端发起请求 |
4
psyche08 2023-10-27 17:40:10 +08:00
如果都是本机的程序的话,在建立连接后,根据来源的端口号查询对应的进程,这样就可以校验了。
|
5
shermie 2023-10-27 17:40:49 +08:00
header 里面带个签名 如果是限制诸如 python 这样的爬虫 就上 ja3 ja4 指纹限制
|
6
sentinelK 2023-10-27 17:54:02 +08:00
如果是“某个定制程序”的话,可以通过接口加密实现。
如果是一个不能干预的,或者是“某种程序”的话,就要服务器端根据其特征识别了。但是这个识别方式很不安全,非常容易被模仿。 |
7
baihekong 2023-10-27 17:56:52 +08:00
定一个特殊的 UA ,执行某个程序的时候才带上
|
8
ttvast 2023-10-27 18:03:15 +08:00 2
用 selinux 配合 iptables
|
9
billlee 2023-10-27 18:05:09 +08:00
这个只能 selinux/apparmor 配合 netfilter 了吧
|
10
ho121 2023-10-27 18:11:10 +08:00 via Android
感觉是 xy 问题。
如果是要防止未授权的访问,加个鉴权就行,比如 http 的用户名和密码、token 之类的。 |
11
DefoliationM 2023-10-27 18:17:57 +08:00 via Android
根据来源地址和目标地址迭代/proc 目录拿到程序路径,然后根据程序路径限制就行了。
|
12
DefoliationM 2023-10-27 18:19:08 +08:00 via Android
|
13
Elliota 2023-10-27 18:21:04 +08:00
只能端口数据流校验
|
14
lance6716 2023-10-27 18:23:33 +08:00 via Android 3
本“xy 问题“警察已经抵达现场!请问 op 为什么会有这么奇怪的需求呢
|
15
liberize 2023-10-27 18:27:23 +08:00 via Android
1. 收到 tcp 连接时获取源端口
2. 然后查源端口对应的程序的 pid 3. 进一步根据 pid 获取程序文件名 4. 判断文件名是否在白名单 其中 2 和 3 在 windows 下有接口可以获取,linux 下可以读/proc 。 |
16
julyclyde 2023-10-27 18:46:50 +08:00
systemd“判断某条日志属于哪个 service”是用 unix domain socket 啊还是 pipe 的“对方”反查进程号的
不过 tcp/ip 似乎比较困难吧 |
17
Nazz 2023-10-27 19:16:53 +08:00
token 鉴权
|
18
piaoxueblog 2023-10-27 19:22:21 +08:00
可以的。一种实现方式是使用指定用户运行这个程序,然后在 iptables 里加对应规则
|
19
yichya 2023-10-27 22:47:25 +08:00 1
curl 可以访问
python requests 不能访问 那如果用 python 的 os.system() 执行 curl 并且取得返回值这种形式可不可以访问? |
20
victorc 2023-10-27 23:28:27 +08:00
限制不了,得引入第三方角色进行仲裁
|
21
dode 2023-10-27 23:55:37 +08:00
|
22
jackOff 2023-10-28 00:33:34 +08:00
这个听起来可以从另一个角度实现,因为所有的 http 请求都需要先进行 dns 查询,那么最简单方法就是劫持本地 dns 请求,解析请求的域名,放行某个程序的所有域名。具体做法是搭建一个 socket 服务器监听本地 53 端口,使用 dnslib 对 dns 查询进行解析获取请求的域名,根据白名单放行,放行就是指创建一个简单的 socket 对象(不需要绑定绑定端口),只要指定连接公共 dns 服务器就可以(223.5.5.5:53)。我说的这些实际上就是 dns 分流器或者是 adguard 这些广告拦截器的前置和最终处理,中间的逻辑不同所以其职能不同,希望能有助于你解决问题
|
23
gamexg 2023-10-28 02:12:24 +08:00
既然是同一计算机,那么执行 netstats 检查来源端口是否是预期的程序完事.
|
24
t133 2023-10-28 05:58:27 +08:00 via iPhone
同计算机为什么不用管道
|
25
yankebupt 2023-10-28 07:07:25 +08:00
首先限定监听的是 127.0.0.1 的 8000 而不是 0.0.0.0 的,然后对本机的 127.0.0.1 访问进行 app 限制……
但因为是限制程序所以肯定不是防火墙了…… 但其实 python 也可以 shell /usr/bin/curl 的,光限制 requests 没用,还要加额外限制…… 很麻烦,不如加 Authencation (自制签名加密)或用管道(如楼上) |
26
kuaner 2023-10-28 09:09:26 +08:00
两个程序丢在一个容器里面
|
27
lisxour 2023-10-28 09:11:03 +08:00 2
请把你原本遇到的问题发出来,而不是经自己想法加工过后的问题,你问的这个问题在现实中我就没想到能有啥场景对应,你是不是只想自己的程序能访问服务,其他程序不行?
|
28
xuelang 2023-10-28 09:20:06 +08:00
-H "Authorization: Bearer $OPENAI_API_KEY" ?
这种就是权限管理呀,只有带 key 的应该才给访问 |
29
Jamy 2023-10-28 10:20:28 +08:00
如果你是 root 权限运行的,可以使用 netstat,
``` netstat -antp | grep ${port} | grep ${remoteport} ``` 返回结果带有 pid 和进程名的, 可以根据 pid 去/proc/$pid/目录查询更详细的信息. |
30
fox0001 2023-10-28 10:23:26 +08:00 via Android
只能加认证,限制客户端
|
31
listenerri 2023-10-28 11:30:11 +08:00 via Android
用 docker 把应用和服务放到一个容器里
|
32
flyqie 2023-10-28 12:36:43 +08:00 via Android
感觉其实应该从 server 鉴权这边入手,而不是限制客户端。
|
33
miyuki 2023-10-28 12:49:55 +08:00 via iPhone
本机的话 selinux 可以
|
34
lesismal 2023-10-28 15:40:44 +08:00
服务器里查出允许的进程的 pid ,然后请求进来后用 netstat -tunp 查 remote addr 的端口是不是那个进程的 pid ,不是就不允许
但如果是自己的服务器,自己人不能限制好自家的服务吗?是怕被外人入侵? |
35
adoal 2023-10-28 17:43:00 +08:00
所以呢不要看各种所谓新手教程后连说的是啥都不知道就手把手照做“安装完 RHEL 及其克隆发行版后第一件事是关 SELinux”……
|
36
realpg 2023-10-29 01:41:18 +08:00
既然是 127.0.0.1 ,无脑 selinux 就行了
|
37
realpg 2023-10-29 01:42:24 +08:00
@adoal #35
centos 以及 centos 衍生类的发行版服务器被入侵率超越所有其他发行版加起来的 300 倍以上,不是没有原因的 |
39
realpg 2023-10-29 11:23:40 +08:00
@dzdh #38
你不用求帖子 你可以就在 V2 上找小白搞了个云服务器被入侵的帖子 100%是 centos 系的 因为 redis mysql mongodb 的默认版本库内的版本都是无密码且监听 0.0.0.0 的 安装 redis 在知名 vps ip 段,如果顶层没有这类病毒拦截,几乎是 90 秒内就会被植入恶意程序 |
40
yestodayHadRain 2023-10-29 16:34:11 +08:00
@realpg redis 那种之所以被入侵是因为没设置密码并且开了外网端口,但是正常讲这种基本都是内网访问吧,只要不把端口暴露在公网就 ok 了
|
41
jaylee4869 2023-10-29 21:51:24 +08:00
了解一下 JA3 ,应该就是你需要的。前提是基于 HTTPS ,因为要获取 ClientHello 。我在一篇文章中提到过,https://lawrenceli.me/blog/cloudflare#client-hello---ja3
|