Linux เป็นเราเตอร์ที่มีผู้ให้บริการอินเทอร์เน็ตหลายราย


16

Linux เป็นเราเตอร์: ฉันมีผู้ให้บริการอินเทอร์เน็ต 3 รายแต่ละรายมีโมเด็มของตัวเอง

Provider1ซึ่งเป็นเกตเวย์แอดเดรส 192.168.1.1
เชื่อมต่อกับ linux router eth1 /192.168.1.2

Provider2 ที่อยู่เกตเวย์ 192.168.2.1
เชื่อมต่อกับเราเตอร์ linux eth2 /192.168.2.2

Provider3 ที่อยู่เกตเวย์ 192.168.3.1
เชื่อมต่อกับเราเตอร์ linux eth3 /192.168.3.2

                                                                           ________
                                                   +------------+         /
                                                   |            |        |
                            +----------------------+ Provider 1 +--------|
        __                  |192.168.1.2           |192.168.1.1 |       /
    ___/  \_         +------+-------+              +------------+      |
  _/        \__      |    eth1      |              +------------+      /
 /             \ eth0|              |192.168.2.2   |            |      |
|Client network -----+  ROUTER  eth2|--------------+ Provider 2 +------|     Internet
 \10.0.0.0/24 __/    |              |              |192.168.2.1 |      |
   \__     __/       |    eth3      |              +------------+      \
      \___/          +------+-------+              +------------+       |
                            |192.168.3.2           |            |       \
                            +----------------------+ Provider 3 +-------|
                                                   |192.168.3.1 |       |
                                                   +------------+       \________

ฉันต้องการกำหนดเส้นทางลูกค้าในเครือข่าย 10.0.0.0/24 ตามแหล่ง IP ไปยังเกตเวย์ที่แตกต่างกัน
อินเตอร์เฟสไปยังเครือข่ายลูกค้าคือeth0 / 10.0.0.1 ซึ่งเป็นเกตเวย์เริ่มต้นสำหรับลูกค้าทั้งหมด

ตัวอย่างเช่น:
10.0.0.11 ควรถูกส่งไปที่ Provider1 @ eth1
10.0.0.12 ควรถูกส่งไปที่ Provider2 @ eth2
... และอื่น ๆ ...

ฉันคิดว่าฉันจำเป็นต้องใช้ip routeและiptablesสำหรับ SNAT แต่ฉันยังไม่เข้าใจวิธีการ
นี่คือสคริปต์ที่ฉันมีจนถึงตอนนี้
เปิดใช้งานการส่งต่อ ipv4

#!/bin/bash
# flush tables
ip route flush table connection1
ip route flush table connection2
ip route flush table connection3

# add the default gateways for each table
ip route add table connection1 default via 192.168.1.1
ip route add table connection2 default via 192.168.2.1
ip route add table connection3 default via 192.168.3.1

# add some IP addresses for marking
iptables -t mangle -A PREROUTING -s 10.0.0.11 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 10.0.0.12 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -s 10.0.0.13 -j MARK --set-mark 3

# add the source nat rules for each outgoing interface
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.2
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.2.2
iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 192.168.3.2

# link routing tables to connections (?)
ip rule add fwmark 1 table connection1
ip rule add fwmark 2 table connection2
ip rule add fwmark 3 table connection3

#default route for anything not configured above should be eth2

คุณต้องเพิ่มใน CONNMARK ผมคิดว่าเพื่อประหยัด / restore เครื่องหมายเพื่อที่จะสามารถนำไปใช้กับแพ็คเก็ต 2..n (ซึ่งจะเป็น NAT'd โดยการติดตามการเชื่อมต่อ)
derobert

ฉันได้เพิ่มคำตอบด้วยข้อความที่ตัดตอนมาจากการตั้งค่าที่เราใช้ที่นี่ ฉันจะลองเช็คอินในช่วงสุดสัปดาห์เพื่อชี้แจงอะไร ...
Derobert

คำตอบ:


13

นี่คือการตั้งค่าที่คล้ายกันจากหนึ่งในเราเตอร์ของเรา (มีสิ่งที่ไม่เกี่ยวข้องบางส่วนถูกสแนปอิน) โปรดทราบว่าสิ่งนี้จะจัดการการเชื่อมต่อที่เข้ามาเช่นกัน

สังเกตการใช้ตัวแปรแทนหมายเลขมาร์คโค้ดแบบตายตัว ง่ายต่อการบำรุงรักษา! พวกเขากำลังเก็บไว้ในสคริปต์ที่แยกต่างหากและที่มาใน. /etc/iproute2/rt_tablesชื่อตารางที่มีการกำหนดค่าใน /etc/udev/rules.d/70-persistent-net.rulesชื่ออินเตอร์เฟซที่ตั้งอยู่ใน

##### fwmark ######
iptables -t mangle -F
iptables -t mangle -X

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN # if already set, we're done
iptables -t mangle -A PREROUTING -i wan      -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A PREROUTING -i comcast  -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A PREROUTING -i vz-dsl   -j MARK --set-mark $MARK_VZDSL

iptables -t mangle -A POSTROUTING -o wan     -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A POSTROUTING -o comcast -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A POSTROUTING -o vz-dsl  -j MARK --set-mark $MARK_VZDSL
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

##### NAT ######
iptables -t nat -F
iptables -t nat -X
for local in «list of internal IP/netmask combos»; do
    iptables -t nat -A POSTROUTING -s $local -o wan     -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o comcast -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o vz-dsl  -j SNAT --to-source «IP»
done

# this is an example of what the incoming traffic rules look like
for extip in «list of external IPs»; do
    iptables -t nat -A PREROUTING   -p tcp -d $extip --dport «port» -j DNAT --to-destination «internal-IP»:443
done

และกฎ:

ip rule flush
ip rule add from all               pref 1000  lookup main 
ip rule add from A.B.C.D/29        pref 1500  lookup comcast # these IPs are the external ranges (we have multiple IPs on each connection)
ip rule add from E.F.G.H/29        pref 1501  lookup cavtel
ip rule add from I.J.K.L/31        pref 1502  lookup vzdsl
ip rule add from M.N.O.P/31        pref 1502  lookup vzdsl # yes, you can have multiple ranges
ip rule add fwmark $MARK_COMCAST   pref 2000  lookup comcast
ip rule add fwmark $MARK_CAVTEL    pref 2001  lookup cavtel
ip rule add fwmark $MARK_VZDSL     pref 2002  lookup vzdsl
ip rule add                        pref 2500  lookup comcast # the pref order here determines the default—we default to Comcast.
ip rule add                        pref 2501  lookup cavtel
ip rule add                        pref 2502  lookup vzdsl
ip rule add                        pref 32767 lookup default

ตารางเส้นทางได้รับการตั้งค่า/etc/network/interfacesเพื่อให้การลงอินเทอร์เฟซทำให้มันเปลี่ยนไปใช้ที่แตกต่างกัน:

iface comcast inet static
        address A.B.C.Q
        netmask 255.255.255.248
        up ip route add table comcast default via A.B.C.R dev comcast
        down ip route flush table comcast

หมายเหตุ:หากคุณกำลังทำการกรองเช่นกัน (ซึ่งคุณอาจเป็น) คุณจะต้องเพิ่มกฎที่เหมาะสมในFORWARDการACCEPTรับส่งข้อมูลด้วย โดยเฉพาะอย่างยิ่งสำหรับการรับส่งข้อมูลใด ๆ


ขอบคุณมาก! ตอนนี้ฉันจะแก้ไขสิ่งนี้ตามความต้องการของฉันโหลดลงในกล่องและอัปเดตโพสต์นี้
Flav

ทำงานเหมือนมีเสน่ห์ขอบคุณอีกครั้ง ยกเว้นเส้นทางการสั่งซื้อล่วงหน้า / เส้นทางเริ่มต้นเป็น 'comcast' (สำหรับฉันที่ควรเป็น eth2) แต่ฉันคิดว่าฉันทำงานโดยการเพิ่มกฎทั่วไปip rule add from 10.0.0.0/24 pref 1400 lookup eth2และสร้างข้อยกเว้นหลังจากนั้น
Flav

1
@Flav คุณสามารถตั้งค่าการยกเว้นด้วยเครื่องหมายไฟร์วอลล์ (ใน PREROUTING) BTW: หนึ่งในคำถามที่เชื่อมโยง ( unix.stackexchange.com/questions/70440/ ...... ) มีคำอธิบายเพิ่มเติมเกี่ยวกับส่วนหนึ่งของการกำหนดค่านี้ กฎ ip / mask เหล่านั้นมีไว้สำหรับการรับส่งข้อมูลที่ไม่ใช่ NAT ในการตั้งค่าของฉัน (SNAT เกิดขึ้นใน POSTROUTING ดังนั้นหลังจากกฎ ip)
Derobert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.