我现在可能会问错误的问题,但请耐心等待。
我有一个带有守护进程和Web前端的Linux系统。守护程序接受某个端口上的套接字请求并接收命令。通常,此类命令由Web前端发出,具有安全登录过程。但是,由于HTTP允许任何人远程登录到该端口并发出原始命令,因此我需要一种保护系统免受滥用的方法。
我实际上并不认为有一种方法可以将apache配置为不允许telnet,因为整个事情可能不再适用了。
那么有没有办法只允许从本地主机创建套接字?
PS。我知道有本地版本的socket但是我想避免它 - 原因是我根据远程连接编写了一个自动化测试框架。
谢谢,
答案 0 :(得分:5)
使用iptables将端口80的访问权限仅限于来自localhost的连接
iptables -I INPUT -j ACCEPT -p tcp --destination-port 80 -i lo
iptables -A INPUT -j DROP -p tcp --destination-port 80 -i eth0
答案 1 :(得分:3)
仅将您的守护程序bind()发送到本地主机(127.0.0.1),并且您的Web服务器调用127.0.0.1。这样,盒子外面没有人可以直接连接它。
struct inaddr_in listen_addr = {0};
listen_addr.sin_family = AF_INET;
listen_addr.sin_port = htons(my_port);
listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
另外,添加一个防火墙/ iptables规则,阻止你的守护进程端口除了localhost之外的任何东西。
答案 2 :(得分:2)
您的守护程序可以保留允许的IP列表,最好是在配置文件中,并立即断开任何不在允许列表中的连接。使用getpeername()
功能获取连接IP。
struct sockaddr_in sin;
socklen_t slen = sizeof(sin);
bzero(&sin, sizeof(sin));
if (getpeername(sock, (struct sockaddr *) &sin, &slen) != 0) {
/* getpeername failed */
close(sock);
return;
}
char * c = inet_ntoa(sin.sin_addr);
/* Now loop through your list of permitted addresses and compare to c */
免责声明:代码未经编译或测试,但应告知您如何实施代码。
答案 3 :(得分:1)
如果您不想更改应用程序,可以将防火墙配置为限制对相应端口号的访问,以便只有该计算机和您的测试计算机才能连接到该端口。