如何通過iptables將http請(qǐng)求從A服務(wù)器轉(zhuǎn)發(fā)到B服務(wù)器
1、準(zhǔn)備服務(wù)器、終端
使用docker的容器來模擬所需的服務(wù)器、終端。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
網(wǎng)絡(luò)的設(shè)置參考如下(也可以按照自己已有的網(wǎng)絡(luò)設(shè)置):
docker network create --driver bridge --subnet 172.24.25.0/24 --gateway 172.24.25.1 network-public
針對(duì)docker-compose.yml中三個(gè)容器的解釋:
- work0充當(dāng)終端
- work1充當(dāng)服務(wù)器A
- work2充當(dāng)服務(wù)器B
2、準(zhǔn)備一個(gè)http服務(wù)
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 // 接收到退出信號(hào) 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("當(dāng)前時(shí)間: %s\n", t) w.Write([]byte(s)) }
編譯后上傳到服務(wù)器B,即work2容器的 /tmp
目錄。假設(shè)編譯后的包名為: http-service
。
3、設(shè)置服務(wù)器的iptables
3.1、 首先,確保A服務(wù)器上啟用了IP轉(zhuǎn)發(fā)功能。可以通過運(yùn)行以下命令來檢查:
sysctl net.ipv4.ip_forward
如果返回值為1,則表示IP轉(zhuǎn)發(fā)已啟用。如果返回值為0,則需要將其啟用。可以通過編輯 /etc/sysctl.conf
文件并將 net.ipv4.ip_forward
設(shè)置為1來永久啟用IP轉(zhuǎn)發(fā)。
3.2、 在A服務(wù)器上設(shè)置iptables規(guī)則來將HTTP請(qǐng)求轉(zhuǎn)發(fā)到B服務(wù)器??梢允褂靡韵旅睿?/h3>
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <B服務(wù)器的IP地址>:80
iptables -t nat -A POSTROUTING -p tcp -d <B服務(wù)器的IP地址> --dport 80 -j SNAT --to-source <A服務(wù)器的IP地址>
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <B服務(wù)器的IP地址>:80 iptables -t nat -A POSTROUTING -p tcp -d <B服務(wù)器的IP地址> --dport 80 -j SNAT --to-source <A服務(wù)器的IP地址>
這些規(guī)則將在 nat
表中添加兩條規(guī)則。第一條規(guī)則將目標(biāo)端口為80的TCP流量重定向到B服務(wù)器的IP地址和端口80。第二條規(guī)則將響應(yīng)流量的源IP地址更改為A服務(wù)器的IP地址。
3.3、 確保A服務(wù)器上的防火墻允許通過轉(zhuǎn)發(fā)的流量??梢允褂靡韵旅顏碓试S轉(zhuǎn)發(fā)的流量:
iptables -A FORWARD -p tcp -d <B服務(wù)器的IP地址> --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p tcp -s <B服務(wù)器的IP地址> --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
3.4、 根據(jù)前三小節(jié)描述,以及docker-compose.yml中的ip分配,和http服務(wù)中的端口號(hào),需要執(zhí)行的命令:
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、驗(yàn)證效果
4.1、 在服務(wù)器B(work2容器)運(yùn)行http服務(wù)。
cd /tmp && ./http-service
4.2、在終端(work0)請(qǐng)求服務(wù)器A
curl 172.24.25.16:22345/hello
4.3、 在終端(work0)查看相應(yīng)數(shù)據(jù)
[root@work0 tmp]# curl 172.24.25.16:22345/hello 當(dāng)前時(shí)間: 2023-08-17 06:43:03
4.4、查看服務(wù)器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)
到此這篇關(guān)于通過iptables將http請(qǐng)求從A服務(wù)器轉(zhuǎn)發(fā)到B服務(wù)器的文章就介紹到這了,更多相關(guān)iptables將http請(qǐng)求從A服務(wù)器轉(zhuǎn)發(fā)到B服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
kubernetes使用kubeadm創(chuàng)建集群實(shí)操教程(全)
安裝kubernetes的方式,分別是kubeadm引導(dǎo)集群、kOps、Kubespray,本文采用kubeadm引導(dǎo)集群的方式,主要運(yùn)用了安裝kubeadm、對(duì)kubeadm進(jìn)行故障排查、使用kubeadm創(chuàng)建集群,目標(biāo)是要安裝單個(gè)控制平面的Kubernetes集群,在集群上安裝Pod網(wǎng)絡(luò),以便Pod可以相互連通2024-06-06iptables如何配置NAT實(shí)現(xiàn)端口轉(zhuǎn)發(fā)
這篇文章主要介紹了iptables如何配置NAT實(shí)現(xiàn)端口轉(zhuǎn)發(fā),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06X-Frame-Options頭未設(shè)置 防止網(wǎng)頁被iframe內(nèi)框架調(diào)用
有時(shí)候?yàn)榱朔乐咕W(wǎng)頁被別人的網(wǎng)站iFrame,我們可以通過在服務(wù)器設(shè)置HTTP頭部中的X-Frame-Options信息,需要的朋友可以參考下2017-03-03GitLab?Pipeline規(guī)范及流程觸發(fā)詳解
這篇文章主要為大家介紹了GitLab?Pipeline規(guī)范及流程觸發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04django項(xiàng)目、vue項(xiàng)目部署云服務(wù)器的詳細(xì)過程
這篇文章主要介紹了django項(xiàng)目、vue項(xiàng)目部署云服務(wù)器的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07SVN使用教程_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了SVN使用教程和注意事項(xiàng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08