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