راه حل مناسب اتصال وب سرویس خارجی به پروکسی معکوس در داکر


#21

این موضوع خیلی به الیکسر مربوط نمیشه،‌بهتر بود توی فروم مربوط به docker پست میزاشتی، ممکنه جواب بگیری اما کلا منظورم اینه که هرچیزی سرجاش باشه زودتر نتیجه میگیری.


#22

انجمن الکسیر خیلی خیلی فعاله. امید وارم پاسخ بدند . انجمن مناسب با داکر که فعال باشه پیدا نکردم متاسفانه. و همینطور تو فکرم بود چطور اچ تی تی پویزن رو به پروکسی وصل کنم تا بتونه انتقال داده داشته باشه


#23

سلام
فعلا مشکل رو با دسترسی دادن نت به کانتینر html اونم به صورت محدود رفع کردیم . اضافه کردن چند رول به iptables تا فقط به دامنه گوگل اجازه استفاده از شبکه خارج از کانتینر رو بده بر اساس شبکه داکر

به این صورت:

اگر شبکه رو در فایل docker-compose تعریف کرده باشیم وقتی ما کانتینرها رو up میکنیم خودش شبکه ها رو درست میکنه و زمانیکه کانتینرها رو down کنیم شبکه ها از بین میرن و هر زمان که ایجاد میشن subnet اونا تغییر میکنه چون ما subnet ثابت ندادیم و باعث میشه که هر بار نیاز به وارد کردن رول با ip جدید بشیم. برای جلوگیری از این مشکل من به صورت دستی یک شبکه درست کردم

sudo docker network create --internal mynetwork_html

و برای اینکه به صورت پیشفرض اون شبکه داخلی باشه و نت نداشته باشه از آپشن internal استفاده کردم.

بعدش برای اضافه کردن رول به iptables ، به subnet و interface شبکه ای که درست کردیم نیاز هست

گرفتن ip شبکه مورد نظر

sudo docker network inspect mynetwork_html | grep Subnet
خروجی
 "Subnet": "192.168.100.0/20"

بدست آوردن اسم interface با استفاده از ip بالا

sudo iptables -S | grep 192.168.100.0 | cut -d" " -f7 | tail -n1
خروجی
br-11d6257150db

اضافه کردن به فایل network.yml

container_html:
    networks:
      - html

networks:   
  html:
    external: true
    name: mynetwork_html

بعد برای اینکه تست کنیم که شبکه ای که ساختیم فعلا دسترسی به نت نداره اول کانتینر خودمون رو با داکر کمپوز up میکنیم بعد واردش میشیم

sudo docker exec -it container_html ash
ping 8.8.8.8
یا
ping google.com
یا
ping yahoo.com
جواب نمیده

خب حالا نیاز به رنج ipهای گوگل داریم . با دستور زیر

dig -t TXT _netblocks.google.com 

خروجی


; <<>> DiG 9.10.3-P4-Debian <<>> -t TXT _netblocks.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42472
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;_netblocks.google.com.		IN	TXT

;; ANSWER SECTION:
_netblocks.google.com.	872	IN	TXT	"v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"

;; Query time: 34 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Oct 31 18:50:19 +0330 2018
;; MSG SIZE  rcvd: 286

نکته: این ipها در آینده تغییر میکنن پس هر بار اون دستور رو بزنید و ipها رو بروز کنید
به غیر از ipهای بالا من dns گوگل 8.8.8.8 رو هم قرار دادم تا زمانیکه با نام دامنه پینگ میکنید یا در کدهاتون از دامنه استفاده میکنید مشکل تبدیل به ip نداشته باشین

بعد برای اینکه راحتتر رول ها رو اضافه کنید به این صورت عمل کنید:

vi mynetwork
قرار دادن خطوط زیر 

sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 35.190.247.0/24 ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 64.233.160.0/19  ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 66.102.0.0/20 ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 66.249.80.0/20 ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 72.14.192.0/18 ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 74.125.0.0/16 ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 108.177.8.0/21  ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 173.194.0.0/16 ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 209.85.128.0/17  ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 216.58.192.0/19  ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 216.239.32.0/19 ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/20 -d 8.8.8.8 ! -o br-11d6257150db -j MASQUERADE
sudo iptables -t nat -A DOCKER -i br-11d6257150db -j RETURN

sudo iptables -A FORWARD -o br-11d6257150db -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -o br-11d6257150db -j DOCKER
sudo iptables -A FORWARD -i br-11d6257150db ! -o br-11d6257150db -j ACCEPT

sudo iptables -D DOCKER-ISOLATION-STAGE-1 ! -s 192.168.100.0/20 -o br-11d6257150db -j DROP
sudo iptables -D DOCKER-ISOLATION-STAGE-1 ! -d 192.168.100.0/20 -i br-11d6257150db -j DROP

sudo iptables -A DOCKER-ISOLATION-STAGE-1 -i br-11d6257150db ! -o br-11d6257150db -j DOCKER-ISOLATION-STAGE-2
sudo iptables -A DOCKER-ISOLATION-STAGE-2 -o br-11d6257150db -j DROP

بعد ذخیره

chmod  u+x  mynetwork
./mynetwork

بعد از اینکه فایل بالا رو اجرا کردید رول ها اضافه میشن . بعد دوباره وارد کانتینر بشین و ping رو تست کنید . حالا فقط دامنه گوگل و سرور خودتون با پینگ جواب میده .

باز اگر راه حل بهتری پیدا شد قرار میدم