iptables --set-mark - Định tuyến các cổng khác nhau thông qua các giao diện khác nhau


13

Truyện ngắn,
3 giao diện, eth0 (LAN), eth1 (ADSL), eth2 (4G).
eth0 -> eth1: Hoạt động
(cổng 80, 443, 4070) eth0 -> eth2: Không xảy ra


Đây là một đại diện đồ họa của ý tưởng:

Cổng 80 & 443 qua eth2
ant phần còn lại qua eth1
nhập mô tả hình ảnh ở đây

Netscheme:

eth0: -ip 10.0.0.1 -net 10.0.0.0/8 -gw 10.0.0.1 (the servers own intf) 
eth1: -ip 192.168.1.74 -net 192.168.1.0/24 -gw 192.168.1.254 
eth2: -ip 192.168.1.91 -net 192.168.0.0/24 -gw 192.168.0.1 






Kịch bản mới này định tuyến lại 22 và 4070 vào bảng thích hợp, tôi nghĩ vậy.
Tuy nhiên, sau khi đến bảng đó, nó không được định tuyến lại thành eth2.




Kịch bản này hoạt động, ngoại trừ 22 và 4070!

(Cổng 80 không được bình luận và nó hoạt động nhưng thông qua eth1 là sai.)

modprobe iptable_nat
modprobe ip_conntrack

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -F PREROUTING
iptables -t nat -F
iptables -t mangle -F
iptables -F
# This next line restores any issues trying to connect to something
# if you get weird ACK packets when trying to connect (at least i did)!
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
ip route flush table main

iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1
###  iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 4070 -j MARK --set-mark 1

## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
## -- Does the same as ip route below? route add default gw 192.168.1.254


echo "201 eth2.out" >> /etc/iproute2/rt_tables

ip rule add fwmark 1 table eth2.out
ip route add default via 192.168.0.1 dev eth2 table eth2.out
ip route add default via 192.168.1.254 dev eth1



## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE









Kịch bản cũ:


  Ignore everything below unless you're interested in retracing my steps!!




Tôi đã tạo một tập lệnh router.sh để thiết lập môi trường của mình trong trường hợp tôi làm điều gì đó xấu. Tôi đã có 3 cổng mà tôi muốn gửi đến kết nối 4G và phần còn lại thông qua kết nối ADSL cố định. Để thực hiện việc này, tôi đã hướng dẫn iptables cho các gói mangle trên tuyến mặc định và gửi chúng qua giao diện 4G của tôi nếu --dport == 443 | 80 | 4070

Tuy nhiên, điều này không hoạt động; Tôi vẫn đang được chuyển qua điện thoại cố định của mình bất kể điều gì.

Đây là những gì kịch bản của tôi trông giống như:

#!/bin/bash

## routing tables
# wireless = 4G via eth2
# adsl = adsl via eth1

modprobe iptable_nat
modprobe ip_conntrack

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
ip route flush table main
ip route flush table wireless
ip route flush table adsl

## Setup routing tables
# ADSL
ip route add table adsl to 192.168.1.0/24 dev eth1
# 4G
ip route add table wireless to 192.168.0.0 dev eth2
ip rule add fwmark 0x1 table wireless

## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
route add default gw 192.168.1.254


## Forward ports into the LAN
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.0.3:80


## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1

## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -j LOG
#iptables --table nat --append POSTROUTING --out-interface eth2 --jump SNAT --to-source "192.168.1.74"
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Tôi cũng đã cố gắng thêm 3 phần này vào phần dưới của tập lệnh:

iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 80 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 443 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 4070 -j SNAT --to "192.168.0.91"

Cũng đã thử mà không thành công:

iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1

Cuối cùng nhưng không kém phần quan trọng, đã thử:

## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1

Việc định tuyến hoạt động, tôi có thể duyệt web, nghe nhạc và không, nhưng tôi đang làm điều đó thông qua giao diện sai. Tôi đã loay hoay một lúc lâu và tìm thấy các mẩu và mảnh để hiểu những gì tôi đang làm và tại sao tôi lại làm điều đó. Tôi có thể định hình lưu lượng truy cập qua tc nhưng nếu có thể thông qua việc đánh dấu các gói trong iptables thì nó sẽ giúp tôi rất lâu.

Tôi đoán là tôi đang thực hiện sai thứ tự trên các quy tắc khác nhau, chủ yếu là phần MASQUERADE ? hoặc nếu điều đó thậm chí nên ở đó?

Ai đó có thể giải thích làm thế nào để cổng DNAT nói, tcp: 80 từ giao diện bên ngoài (một hoặc một giao thức BOTH) sang không gian địa chỉ 10.0.0.0 bên trong không?



Đầu ra:

root@Netbridge:~# route -n Kernel IP routing table Destination    

Gateway         Genmask         Flags Metric Ref    Use Iface<br>
0.0.0.0         192.168.1.254   0.0.0.0         UG    0      0        0 eth1<br>
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 eth0<br>
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth2<br>
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1


root@Netbridge:~# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:4e  
          inet addr:10.0.0.1  Bcast:10.255.255.255  Mask:255.0.0.0

eth1      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:58  
          inet addr:192.168.1.74  Bcast:192.168.1.255  Mask:255.255.255.0

eth2      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:62  
          inet addr:192.168.0.91  Bcast:192.168.0.255  Mask:255.255.255.0

Thực hiện theo các hướng dẫn sau:
đầu ra-lưu lượng truy cập trên các giao diện khác nhau dựa trên đích đến
iptables-chuyển tiếp-cụ thể-cổng-đến-cụ thể-nic
Trong số một số chủ đề liên quan khác.


Tôi xin lỗi, nhưng có lý do để không liên kết apache chỉ với localhostvà địa chỉ của eth2giao diện không?
Jan Marek

@JanMarek: Không có đề cập đến apache ở đây. Và đối với thông tin của bạn, việc liên kết một ổ cắm trên ethXđịa chỉ IP của một địa chỉ sẽ ngăn các máy chủ trên mạng ethXtruy cập vào máy chủ cục bộ bằng ethYđịa chỉ IP của họ và sẽ không ngăn các máy chủ ethYtruy cập vào máy chủ bằng ethXđịa chỉ IP của máy chủ . Hãy nhớ rằng Linux sử dụng mô hình máy chủ yếu.
BatchyX

OK, có thể có nhiều máy chủ web hơn, không chỉ máy chủ apache ... Mặc dù vậy, máy chủ web liên kết trên giao diện eth2 có thể là một giải pháp đơn giản. Nhưng tôi có thể sai, tôi biết.
Jan Marek

Câu trả lời:


4

BatchyX đã đưa ra một số lời giải thích rất tốt về iptables và định tuyến, vì vậy tôi sẽ thực hiện sự lười biếng của mình và trực tiếp đến kịch bản.

Nó nên NAT tất cả lưu lượng truy cập đến cổng 80,443,22,4070 đến 192.168.0.91. Tất cả phần còn lại sẽ NAT thông qua 192.168.1.254.

Tôi làm lại thử nghiệm của mình và kết thúc theo hướng dẫn này . Điều còn thiếu trong hướng dẫn đó là 3 dòng cuối cùng trong kịch bản của tôi. Mà tôi phát hiện ra từ một cổng khác, nhưng tôi đã mất dấu vết của liên kết đó.

Nó là một kịch bản làm việc được thử nghiệm.

Cần tuyến mặc định

Một điều tôi không đưa vào kịch bản là thiết lập tuyến đường mặc định. Nó nên

route add default gw 192.168.1.254

Khi bạn làm như vậy route -n, nó sẽ là tuyến mặc định duy nhất (Dest: 0.0.0.0)

0.0.0.0    192.168.1.254    0.0.0.0    UG    0    0    0    eth1

fw-router.sh

# Đặt lại / Xóa iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P VÀO CHẤP NHẬN
iptables -P CHẤP NHẬN
iptables -P ĐẦU RA CHẤP NHẬN

# Đặt lại / Xóa / Cài đặt tuyến IP (bảng 4)
lộ trình ip bảng 4
lộ trình ip bảng chính | grep -Ev ^ mặc định | trong khi đọc ROUTE; làm lộ trình ip thêm bảng 4 $ ROUTE; làm xong
tuyến ip thêm bảng 4 mặc định qua 192.168.0.1

Gói #Mark phù hợp với D.Port
iptables -t mangle -A PREROUTING -p tcp --dport 22 -s 10.0.0.0/24 -j Mark --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 80 -s 10.0.0.0/24 -j Mark --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -s 10.0.0.0/24 -j Mark --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 4070 -s 10.0.0.0/24 -j Mark --set-mark 4

Quy tắc #SNAT
iptables -t nat -A POSTROUTING -o eth1 -j SNAT - to-source 192.168.1.74
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.0.91

#IP Tuyến
quy tắc ip thêm fwmark 4 bảng 4
ip tuyến bộ đệm cache

Ngăn xếp #IP
# Đây là phần còn thiếu trong hướng dẫn
tiếng vang 1> / Proc / sys / net / ipv4 / ip_forward
cho f trong / Proc / sys / net / ipv4 / conf / * / rp_filter; làm tiếng vang 0> $ f; làm xong
echo 0> / Proc / sys / net / ipv4 / route / flush

PS1: Tóm lại, MASQUERADEkhông hoạt động (trong hầu hết các trường hợp và chắc chắn trong trường hợp của bạn) đối với NAT có nhiều IP bên ngoài cần một số loại cân bằng tải hoặc cần DNAT để xử lý lưu lượng đến. Bạn cần SNATkiểm soát hướng.

PS2: iptables thuần túy là không đủ.


Trước hết, chúc mừng bạn đã trực tiếp đến kịch bản :) Tôi sẽ thử tối nay khi tôi quay trở lại môi trường mà điều này sẽ chạy!
Torxed

hmm, có thể cần sửa đổi nặng Hãy cho tôi biết kết quả.
John Siu

Sửa lại, nên làm việc ngay.
John Siu

Ngọt ngào, sẽ trở lại với bạn trong một thời gian ngắn: D
Torxed

Tôi yêu bạn, rất nhiều đau đầu và bạn đã giải quyết nó! Cảm ơn bạn!
Torxed

5

Lưu ý: Tôi chỉ xem xét kịch bản đầu tiên, bỏ qua kịch bản cũ.

  • Bạn không cần phải sửa đổi các mô đun bộ lọc mạng bằng tay với các iptables hiện tại. Điều này chỉ cần thiết cho trình theo dõi kết nối tùy chỉnh.
  • Đừng trộn lẫn routeip route. Đây là tà ác thuần túy. Chỉ cần sử dụng ipở mọi nơi và quên đi ifconfigroute
  • /etc/iproute2/rt_tableskhông được thiết lập lại trên các lần khởi động lại. Áp dụng cùng một mục nhiều lần không phải là một ý tưởng tốt, bạn chỉ cần thực hiện một lần. Hãy nhớ rằng rt_tableschỉ cần xác định bí danh tên cho các giá trị số, nó không thay đổi bất kỳ cấu hình nào.

  • Bây giờ cho iptables: Trong FORWARDchuỗi của bạn , bạn thả các gói từ LAN sang 4G. Điều này thật tệ. các FORWARDmóc được sử dụng sau khi định tuyến được thực hiện. Tại thời điểm này, tất cả các định tuyến chính sách đã được thực hiện và đã biết liệu gói tin sẽ được gửi đến 4G hay ADSL. Không có định tuyến lại được thực hiện trong FORWARDhoặc sau FORWARD(tốt, về mặt kỹ thuật, việc định tuyến lại có thể được thực hiện sau POSTROUTINGtrong trường hợp nghiêm trọng, nhưng quay lại điểm chính).

Bây giờ cho định tuyến của bạn: Hãy nhớ rằng Ubuntu cho phép lọc đường dẫn ngược theo mặc định. Lọc đường dẫn ngược hoạt động như sau: Khi kernel nhận được gói (có thể được chuyển tiếp hay không) từ giao diện A, nó sẽ đảo ngược địa chỉ nguồn và địa chỉ đích và kiểm tra xem gói kết quả có được định tuyến qua giao diện A. Nếu không, gói tin sẽ bị hủy như là một nỗ lực giả mạo địa chỉ.

Đối với các gói nhận được từ eth0, đây không phải là một vấn đề. Đối với các gói nhận được từ eth1đây, đây cũng không phải là vấn đề, vì khi đảo ngược địa chỉ IP nguồn và địa chỉ IP đích, hạt nhân sẽ là tuyến mặc định trong bảng main. Đối với các gói được nhận từ eth2mà bạn không đánh dấu, đây là một vấn đề, bởi vì kernel sẽ truy cập tuyến mặc định trong bảng mainvà xem xét rằng các gói này nên được nhận từ đó eth1. Giải pháp đơn giản nhất là tắt chức năng lọc đường dẫn ngược trên eth1:

sysctl -w net.ipv4.conf.eth1.rp_filter=0

Tất cả các ý kiến ​​tuyệt vời và vâng, có một số logic bị lỗi về phía tôi, ví dụ như thêm vào rt_tables mỗi lần và đặc biệt là không xóa một số bảng nhất định cũng như tôi nên nhưng tôi sẽ đến đó :) Tôi sẽ đưa mọi thứ đi xem nếu nó hoạt động, nếu vậy, +50 cho bạn và quan trọng nhất là bạn đã cứu một người đàn ông phía sau khỏi bị chặt thành bit và peaces! :)
Torxed

Kịch bản bên dưới hoạt động nhưng bạn cũng xứng đáng với tất cả lòng biết ơn, bạn đã cho tôi một hoặc hai điều để suy nghĩ và rp_filter = 0 đã giúp một chặng đường dài! : D
Torxed

@BatchyX rất nhiều thông tin, hãy bình chọn cho bạn.
John Siu

@Torxed Bài đăng tôi thấy đề cập đến rp_filter cho TẤT CẢ giao diện cần phải bị vô hiệu hóa. Tôi không chắc chắn nếu nó hoạt động theo cách khác.
John Siu

@JohnSiu: Bạn chỉ cần tắt bộ lọc rp trên các giao diện có vấn đề. Trong trường hợp đó, đó là eth1, vì không có tuyến đường nào đến giao diện đó khi các dấu không được đặt. eth2 không có vấn đề như vậy, vì tuyến đường mặc định đi vào giao diện đó. Đối với eth0, thực sự hữu ích khi bật bộ lọc rp, nếu không, ai đó trong mạng LAN có thể giả mạo gói IP có địa chỉ nguồn trên internet và địa chỉ đích trên mạng LAN và bộ định tuyến sẽ vui vẻ chấp nhận và chuyển tiếp nó trở lại ... eth0.
BatchyX
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.