ฉันจะอนุญาตการเชื่อมต่อขาออกผ่าน iptables ได้อย่างไร


17

ฉันมีเซิร์ฟเวอร์สองเครื่อง โปรแกรมในตอนแรกจำเป็นต้องสื่อสารกับโปรแกรมที่สองบนพอร์ต 2194

ฉันรู้ว่ามันไม่ทำงานเพราะเมื่อฉัน:

root@server1 [~]# telnet myserver2.com 2194
Trying 123.123.123.98...
telnet: connect to address 123.123.123.98: Connection timed out
telnet: Unable to connect to remote host: Connection timed out

server1# iptables -L -n

Chain INPUT (policy DROP)
...
...

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy DROP)
...

Chain LOCALINPUT (1 references)
target     prot opt source               destination
...

Chain LOCALOUTPUT (1 references)
target     prot opt source               destination
...

Chain LOGDROPIN (1 references)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain LOGDROPOUT (1 references)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0

แต่มันทำงานเมื่อคุณ telnet localhost 2194 บน server1? แล้ว telnet server1spublicip 2194 จาก server1 ล่ะ?
Geraint Jones

telnet localhost 2194 บนเซิร์ฟเวอร์ 2 ทำงาน telnet server2ipaddress 2194 บน server2 ทำงานเช่นกัน
siliconpi

1
แย้งคุณทำ: iptables -L -n บนเซิร์ฟเวอร์ทั้งสองและบอกฉันว่าคุณได้รับมากกว่าต่อไปนี้ (ฉันไม่ต้องการที่จะเห็นกฎของคุณ ฯลฯ ;-)) Chain INPUT (ยอมรับนโยบาย) เป้าหมายคัดค้านแหล่งที่มาปลายทางห่วงโซ่ FORWARD ( policy ACCEPT) target prot opt ​​ปลายทางปลายทางต้นทาง Chain OUTPUT (policy ACCEPT) target prot opt ​​ปลายทางปลายทางต้นทาง
Geraint Jones

สวัสดี! ดูการแก้ไขโปรด ...
siliconpi

คำตอบ:


21

หากต้องการอนุญาตการเชื่อมต่อขาออกจากเซิร์ฟเวอร์ 1 ถึงเซิร์ฟเวอร์ 2 บนพอร์ต TCP 2194 ให้ใช้สิ่งนี้บนเซิร์ฟเวอร์ 1:

iptables -A OUTPUT -p tcp -d <server2ip> --dport 2194 -j ACCEPT

หากต้องการอนุญาตการเชื่อมต่อขาเข้าจากเซิร์ฟเวอร์ 1 ถึงเซิร์ฟเวอร์ 2 บนพอร์ต TCP 2194 ให้ใช้สิ่งนี้บนเซิร์ฟเวอร์ 2:

iptables -A INPUT -p tcp -s <server1ip> --dport 2194 -j ACCEPT

อึ - ฉันทำก่อนไม่ได้ทำงาน ฉันทำอย่างที่สองซึ่งก็ไม่ได้ผลเช่นกัน ... ฉันอาจมีการตั้งค่าที่ จำกัด มาก ... ดูการแก้ไขก่อนหน้านี้
siliconpi

1
ลองใช้ "-I" แทน "-A"; นี่ทำให้กฎใหม่เหนือกฎอื่นทั้งหมดที่อาจมีอยู่แล้ว
Massimo

ฉันควรจะทำอะไรที่แตกต่างกันหากแอปพลิเคชันใช้ชื่อโดเมนจริงแทนที่จะเป็นที่อยู่ IP โดยตรงหรือไม่
siliconpi

ว้าว ... ฉันสามารถที่จะ Telnet จากพรอมต์เพียงโดยการทำคำสั่งแรก ...
siliconpi

3
มันลบ - ฉันเช่นเดียวกับใน "i" สำหรับคนที่อาจอ่านว่าเป็น L
siliconpi

6

เพียงไม่กี่ตัวชี้

บริการที่คุณใช้กำลังฟังอยู่บน localhost หรือไม่ วิ่ง

netstat -ltn

หากคุณเห็นบรรทัดเหมือน0.0.0.0:2194คุณก็โอเค ถ้าคุณเห็น127.0.0.1:2194แล้วคุณกำลังฟังเพลงเพียงในการเชื่อมต่อท้องถิ่น (หรือ:::2194และ::1:2194ตามลำดับสำหรับที่อยู่ IPv6 แสดงเป็นtcp6เส้น)

กฎ iptables ปัจจุบันคืออะไร

iptables -L

นโยบาย DROP / REJECT (หากไม่เป็นเช่นนั้นสำหรับทุกเครือข่าย) หรือไม่ มีกฎเฉพาะสำหรับพอร์ตที่คุณต้องการหรือไม่?

หากเป็นปัญหาไฟร์วอลล์ให้ปรับเปลี่ยนกฎที่ละเมิดหรือเพิ่มกฎเช่น

iptables -A INPUT -p tcp --dport 2194 -j ACCEPT 

ควรทำเคล็ดลับ (ยังไม่ทดลอง)

=== แก้ไข ===

tcpdumpกับเครือข่ายการทดสอบออกเป็นเครื่องมือที่ดีคือ รันบนเซิร์ฟเวอร์ทั้งสองในขณะที่พยายามเชื่อมต่อและดูว่าแพ็กเก็ตกำลังจะไปที่ใด เช่นบนเซิร์ฟเวอร์ 1 ทำงาน:

tcpdump -i eth0 -n host server2.com

และบนเซิร์ฟเวอร์ 2 ทำงาน:

tcpdump -i eth0 -n host server1.com

จากนั้นลองเชื่อมต่อ คุณควรเห็นแพ็คเก็ต TCP ทั้งหมดที่ทิ้งบนหน้าจอจากต้นทางและปลายทาง ด้วยข้อมูลนี้คุณจะสามารถระบุตำแหน่งของปัญหาได้


สวัสดี Dan - ฉันไม่คิดว่า server2 มีปัญหาในการยอมรับการเชื่อมต่อ (ฉันสามารถเชื่อมต่อกับมันโดยใช้พีซีที่บ้านของฉัน) แต่ฉันคิดว่า server1 ไม่อนุญาตการเชื่อมต่อขาออก ...
siliconpi

iptables -A เอาท์พุท -p tcp - พอร์ต 2194 -j ยอมรับ
Geraint Jones

สวัสดี c10k ที่ใช้งานไม่ได้ ... และ tryign to telnet ก็ใช้งานไม่ได้เช่นกัน
siliconpi

เพิ่มแนวคิดอื่น ๆ เล็กน้อย
Dan Andreatta

สวัสดีที่นี่ 2194 หมายเลขพอร์ตของฉันหรือหมายเลขพอร์ต IP เป้าหมายของฉันหรือไม่
ทอมมี่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.