首页 > 系统相关 >通过iptables将http请求从A服务器转发到B服务器

通过iptables将http请求从A服务器转发到B服务器

时间:2023-08-17 14:57:05浏览次数:48  
标签:iptables 06 http network IP 43 TS 服务器 nop

1、准备服务器、终端

使用docker的容器来模拟所需的服务器、终端。
dockerfile如下:

FROM centos:centos7 as iptables-test

RUN yum install -y iptables-services && yum install -y tcpdump

docker-compose.yml如下:

version: "2.7"
services:
  work0:
    build: .
    hostname: work0
    container_name: work0
    privileged: true
    tty: true
    networks:
      default:
        ipv4_address: 172.24.25.15
  work1:
    build: .
    hostname: work1
    container_name: work1
    privileged: true
    tty: true
    networks:
      default:
        ipv4_address: 172.24.25.16
  work2:
    build: .
    hostname: work2
    container_name: work2
    privileged: true
    tty: true
    networks:
      default:
        ipv4_address: 172.24.25.17


networks:
  default:
    external:
      name: network-public

网络的设置参考如下(也可以按照自己已有的网络设置):

docker network create --driver bridge --subnet 172.24.25.0/24 --gateway 172.24.25.1  network-public

针对docker-compose.yml中三个容器的解释:

  • work0充当终端
  • work1充当服务器A
  • work2充当服务器B

2、准备一个http服务

package main

import (
	"fmt"
	"net/http"
	"os"
	"os/signal"
	"time"
)

func main() {
	mux := http.NewServeMux()
	mux.HandleFunc("/hello", HelloWorld)
	server := &http.Server{
		Addr:         ":22345",
		WriteTimeout: time.Second * 10,
		Handler:      mux,
	}
	err := server.ListenAndServe()
	if err != nil {
		if err == http.ErrServerClosed {
			fmt.Println("Server closed under request")
		} else {
			fmt.Println("Server closed unexpected", err)
		}
	}

	// 平滑退出
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, os.Interrupt)
	go func() {
		<-quit // 接收到退出信号
		if err = server.Close(); err != nil {
			fmt.Println("close service:", err)
		}
	}()
}

func HelloWorld(w http.ResponseWriter, r *http.Request) {
	t := time.Now().Format("2006-01-02 15:04:05")
	s := fmt.Sprintf("当前时间: %s\n", t)
	w.Write([]byte(s))
}

编译后上传到服务器B,即work2容器的/tmp目录。假设编译后的包名为:http-service

3、设置服务器的iptables

3.1、 首先,确保A服务器上启用了IP转发功能。可以通过运行以下命令来检查:

sysctl net.ipv4.ip_forward

如果返回值为1,则表示IP转发已启用。如果返回值为0,则需要将其启用。可以通过编辑 /etc/sysctl.conf 文件并将 net.ipv4.ip_forward 设置为1来永久启用IP转发。

3.2、 在A服务器上设置iptables规则来将HTTP请求转发到B服务器。可以使用以下命令:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <B服务器的IP地址>:80
iptables -t nat -A POSTROUTING -p tcp -d <B服务器的IP地址> --dport 80 -j SNAT --to-source <A服务器的IP地址>

这些规则将在 nat 表中添加两条规则。第一条规则将目标端口为80的TCP流量重定向到B服务器的IP地址和端口80。第二条规则将响应流量的源IP地址更改为A服务器的IP地址。

3.3、 确保A服务器上的防火墙允许通过转发的流量。可以使用以下命令来允许转发的流量:

iptables -A FORWARD -p tcp -d <B服务器的IP地址> --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -s <B服务器的IP地址> --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT

3.4、 根据前三小节描述,以及docker-compose.yml中的ip分配,和http服务中的端口号,需要执行的命令:

iptables -t nat -A PREROUTING -p tcp --dport 22345 -j DNAT --to-destination 172.24.25.17:22345
iptables -t nat -A POSTROUTING -p tcp -d 172.24.25.17 --dport 22345 -j SNAT --to-source 172.24.25.16

iptables -A FORWARD -p tcp -d 172.24.25.17 --dport 22345 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -s 172.24.25.17 --sport 22345 -m state --state ESTABLISHED,RELATED -j ACCEPT

4、验证效果

4.1、 在服务器B(work2容器)运行http服务。

cd /tmp && ./http-service

4.2、在终端(work0)请求服务器A

curl 172.24.25.16:22345/hello

4.3、 在终端(work0)查看相应数据

[root@work0 tmp]# curl 172.24.25.16:22345/hello
当前时间: 2023-08-17 06:43:03

4.4、查看服务器A的tcpdump

[root@work1 tmp]# tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
06:43:03.154012 IP work0.network-public.48936 > work1.22345: Flags [S], seq 2220603025, win 64240, options [mss 1460,sackOK,TS val 3194673893 ecr 0,nop,wscale 7], length 0
06:43:03.154157 IP work1.48936 > work2.network-public.22345: Flags [S], seq 2220603025, win 64240, options [mss 1460,sackOK,TS val 3194673893 ecr 0,nop,wscale 7], length 0
06:43:03.154185 IP work1.48936 > work2.network-public.22345: Flags [S], seq 2220603025, win 64240, options [mss 1460,sackOK,TS val 3194673893 ecr 0,nop,wscale 7], length 0
06:43:03.154305 IP work2.network-public.22345 > work1.48936: Flags [S.], seq 578213404, ack 2220603026, win 65160, options [mss 1460,sackOK,TS val 2378678745 ecr 3194673893,nop,wscale 7], length 0
06:43:03.154326 IP work1.22345 > work0.network-public.48936: Flags [S.], seq 578213404, ack 2220603026, win 65160, options [mss 1460,sackOK,TS val 2378678745 ecr 3194673893,nop,wscale 7], length 0
06:43:03.154339 IP work0.network-public.48936 > work1.22345: Flags [.], ack 1, win 502, options [nop,nop,TS val 3194673894 ecr 2378678745], length 0
06:43:03.154341 IP work1.48936 > work2.network-public.22345: Flags [.], ack 1, win 502, options [nop,nop,TS val 3194673894 ecr 2378678745], length 0
06:43:03.154516 IP work0.network-public.48936 > work1.22345: Flags [P.], seq 1:88, ack 1, win 502, options [nop,nop,TS val 3194673894 ecr 2378678745], length 87
06:43:03.154521 IP work1.48936 > work2.network-public.22345: Flags [P.], seq 1:88, ack 1, win 502, options [nop,nop,TS val 3194673894 ecr 2378678745], length 87
06:43:03.154529 IP work2.network-public.22345 > work1.48936: Flags [.], ack 88, win 509, options [nop,nop,TS val 2378678745 ecr 3194673894], length 0
06:43:03.154531 IP work1.22345 > work0.network-public.48936: Flags [.], ack 88, win 509, options [nop,nop,TS val 2378678745 ecr 3194673894], length 0
06:43:03.154943 IP work2.network-public.22345 > work1.48936: Flags [P.], seq 1:152, ack 88, win 509, options [nop,nop,TS val 2378678745 ecr 3194673894], length 151
06:43:03.154950 IP work1.22345 > work0.network-public.48936: Flags [P.], seq 1:152, ack 88, win 509, options [nop,nop,TS val 2378678745 ecr 3194673894], length 151
06:43:03.154997 IP work0.network-public.48936 > work1.22345: Flags [.], ack 152, win 501, options [nop,nop,TS val 3194673894 ecr 2378678745], length 0
06:43:03.155002 IP work1.48936 > work2.network-public.22345: Flags [.], ack 152, win 501, options [nop,nop,TS val 3194673894 ecr 2378678745], length 0
06:43:03.155159 IP work0.network-public.48936 > work1.22345: Flags [F.], seq 88, ack 152, win 501, options [nop,nop,TS val 3194673894 ecr 2378678745], length 0
06:43:03.155166 IP work1.48936 > work2.network-public.22345: Flags [F.], seq 88, ack 152, win 501, options [nop,nop,TS val 3194673894 ecr 2378678745], length 0
06:43:03.155247 IP work2.network-public.22345 > work1.48936: Flags [F.], seq 152, ack 89, win 509, options [nop,nop,TS val 2378678745 ecr 3194673894], length 0
06:43:03.155255 IP work1.22345 > work0.network-public.48936: Flags [F.], seq 152, ack 89, win 509, options [nop,nop,TS val 2378678745 ecr 3194673894], length 0
06:43:03.155350 IP work0.network-public.48936 > work1.22345: Flags [.], ack 153, win 501, options [nop,nop,TS val 3194673895 ecr 2378678745], length 0
06:43:03.155354 IP work1.48936 > work2.network-public.22345: Flags [.], ack 153, win 501, options [nop,nop,TS val 3194673895 ecr 2378678745], length 0

5 版本信息

[root@work1 tmp]# iptables --version
iptables v1.4.21
[root@work1 tmp]# cat /etc/*release
CentOS Linux release 7.9.2009 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.9.2009 (Core)
CentOS Linux release 7.9.2009 (Core)

标签:iptables,06,http,network,IP,43,TS,服务器,nop
From: https://www.cnblogs.com/zhimajiang/p/17637488.html

相关文章

  • Apache HTTPd换行解析漏洞复现CVE-2017-15715
    ApacheHTTPd换行解析漏洞复现CVE-2017-15715漏洞利用漏洞利用条件Apache:2.4.0~2.4.29实际存到后端时的文件名可控漏洞利用方式bp中更改存放到后端的文件名假设原文件名为"evil.php"文件存放在网站根目录下evil.php的内容为:<?php@eval($_REQUEST[1]);?>操作:......
  • 同一端口同一方法提供grpc和http流量支持
    项目地址https://github.com/lesterhnu/grpcdemo安装工具链goinstallgoogle.golang.org/protobuf/cmd/protoc-gen-gogoinstallgoogle.golang.org/grpc/cmd/protoc-gen-go-grpcgoinstallgithub.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway编写proto//hell......
  • 高效的HTTP代理,python如何助力
    在使用Python编写高效的HTTP代理时,可以采用以下一些小技巧来提升性能和效率:1、使用异步请求库:使用异步的HTTP请求库,如aiohttp或httpx,可以实现并发处理多个请求,提高代理的吞吐量和响应速度。2、复用连接:在处理多个请求时,尽量复用已建立的连接,而不是每次请求都创建新的连接。这可以通......
  • RTSP/Onvif视频服务器EasyNVR安防视频平台关于行业一体化监控平台的设计方案
    随着数字经济时代的到来,实体经济与数字技术的深度融合已经成为经济发展的主流思路。在这一背景下,传统能源行业的运营管理也面临着新的考验和机遇。很多大型能源企业开始积极应对这一趋势,逐步将视频监控、云计算、大数据和人工智能技术广泛应用于生产、维护、运输和配送等环节,以实......
  • 在html5中播放RTSP/RTMP/HLS/HTTP视频流媒体的几种方案,并支持H.265
    经过多年的项目实战和研发经验的积累,总结了一下对于H5视频可视化在视频播放上如何做到无插件H5展示的方法,尤其是契合安防行业的方案;除了HTTP、WebSocket类的传输协议,其他是无法通用地传输到浏览器的,所以,如果要做一款通用的H5视频播放器,基本上就是一款HTTP/WebSocket协议的视频播放......
  • unity文件下载HttpWebRequest
    ///<summary>///下载进度///</summary>publicfloatProgress{get;privateset;}///<summary>///下载状态///</summary>publicintStatus{get;privateset;}///&......
  • mormot2 笔记(二) Http服务的简单搭建
    mormot2框架中有个THttpServer类,它有一个Router属性,定义如下:propertyRouter:TUriRouterreadfRoute;Router是添加路由的入口点,它有和http协议对应的get,post,put,delete等方法,这些方法可以添加路由,下面常用的get方法定义。procedureGet(constaUri:RawUtf8;......
  • SQL SERVER 将数据复制到另外一台服务器的表中
    insertopenrowset('SQLOLEDB','192.117.19.71';'sa';'123456',KSbb.dbo.tv_User)select*fromtv_Userwhereuserid='k92738' /*1、创建链接服务器查询*/--创建链接服务器execsp_addlinkedserver'remote_server',......
  • DNS服务器搭建
    DNS服务器搭建bind软件搭建dns服务器1.准备好机器172.16.1.61机器服务端客户端172.16.1.7这个机器作为客户端2.服务端部署bind软件bind软件是dns服务器的主软件,bind-utils是提供dns解析的命令,如dig这个命令yuminstallbindbind-utils-y3.安装完毕后,检查防火......
  • Prometheus+Grafana 监控服务器资源
    一、Prometheus1.安装Prometheusdockerpullprom/prometheusdockerrun-itd--name=prometheus--restart=always-p9090:9090prom/prometheus容器创建成功后,即可通过浏览器访问http://本地ip:9090来进行验证2.安装Grafanamkdir/data/grafana-storage#创建目录用于......