Thiết lập định tuyến và iptables cho kết nối VPN mới để chuyển hướng ** chỉ ** cổng 80 và 443


8

Tôi có kết nối VPN mới (sử dụng openvpn) để cho phép tôi định tuyến xung quanh một số hạn chế của ISP. Trong khi nó đang hoạt động tốt, nó sẽ chiếm toàn bộ lưu lượng truy cập trên vpn. Điều này gây ra sự cố cho tôi khi tải xuống (kết nối internet của tôi nhanh hơn rất nhiều so với vpn cho phép) và để truy cập từ xa. Tôi chạy một máy chủ ssh và có một trình nền chạy cho phép tôi tải sơ đồ qua điện thoại.

Tôi có kết nối ethernet hiện tại trên eth0 và kết nối VPN mới trên tun0.

Tôi tin rằng tôi cần thiết lập tuyến mặc định để sử dụng kết nối eth0 hiện có của mình trên mạng 192.168.0.0/24 và đặt cổng mặc định thành 192.168.0.1 (kiến thức của tôi bị lung lay vì tôi đã không làm điều này trong một số năm ). Nếu đó là chính xác, thì tôi không chắc chắn làm thế nào để làm điều đó!. Bảng định tuyến hiện tại của tôi là:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface    MSS   Window irtt
0.0.0.0         10.51.0.169     0.0.0.0         UG    0      0        0 tun0     0     0      0
10.51.0.1       10.51.0.169     255.255.255.255 UGH   0      0        0 tun0     0     0      0
10.51.0.169     0.0.0.0         255.255.255.255 UH    0      0        0 tun0     0     0      0
85.25.147.49    192.168.0.1     255.255.255.255 UGH   0      0        0 eth0     0     0      0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0     0     0      0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0     0     0      0

Sau khi sửa lỗi định tuyến, tôi tin rằng tôi cần sử dụng iptables để định cấu hình chuẩn bị trước hoặc giả mạo để buộc mọi thứ cho cổng đích 80 hoặc 443 trên tun0. Một lần nữa, tôi không chắc chắn làm thế nào để làm điều này!

Tất cả mọi thứ tôi tìm thấy trên internet đang cố gắng làm một điều gì đó phức tạp hơn nhiều, và cố gắng phân loại gỗ từ cây đang tỏ ra khó khăn.

Bất kì sự trợ giúp nào đều được đánh giá cao.

CẬP NHẬT

Cho đến nay, từ các nguồn khác nhau, tôi đã cùng nhau tìm hiểu những điều sau đây:

#!/bin/sh

DEV1=eth0
IP1=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.`
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
GW2=`route -n | grep 'UG[ \t]' | awk '{print $2}'`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

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

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

Bây giờ điều này dường như đang làm việc. Ngoại trừ nó không phải!

Các kết nối đến các trang web bị chặn đang đi qua, các kết nối không có trên cổng 80 và 443 đang sử dụng kết nối không phải VPN.

Tuy nhiên , các kết nối cổng 80 và 443 không đến các trang web bị chặn cũng đang sử dụng kết nối không phải VPN!

Vì mục tiêu chung đã đạt được, tôi tương đối vui, nhưng thật tuyệt khi biết tại sao nó không hoạt động chính xác.

Có ý kiến ​​gì không?

Để tham khảo, tôi hiện có 3 bảng định tuyến, chính, internet và vpn. Danh sách của họ như sau ...

Chủ yếu:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 

Internet:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 
192.168.0.1 dev eth0  scope link  src 192.168.0.73

VPN:

default via 10.38.0.205 dev tun0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1

Kịch bản trên không hoạt động như mong đợi. Tôi chỉ mong đợi để thấy lưu lượng truy cập bắt nguồn từ địa chỉ 10. trong netstat. Tuy nhiên, tất cả lưu lượng truy cập bắt nguồn từ 192., nhưng cổng 80 và 443 được hướng qua VPN. Tôi sẽ đưa toàn bộ giải pháp vào câu trả lời, nhưng đạo cụ cho @anttir để đề xuất iproute2 và fwmark. Tôi đã không bắt gặp những thứ đó, và không có chúng, tôi vẫn đập đầu vào tường gạch!
Steve

Câu trả lời:


4

Vì vậy, hầu hết điều này là ở trên, nhưng toàn bộ giải pháp như sau:

Chỉnh sửa / etc / iproute2 / rt_tables và thêm 2 dòng ở dưới cùng:

101 internet
102 vpn

Bạn có thể đặt cho các bảng này các tên khác có ý nghĩa hơn, chỉ cần nhất quán.

Sau đó, bạn cần tạo một tập lệnh (tôi gọi nó là rt_setup) trong /etc/init.d

#!/bin/sh

DEV1=eth0
IP1=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.`
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
GW2=`route -n | grep 'UG[ \t]' | awk '{print $2}'`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

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

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

Sau đó, rõ ràng, liên kết nó từ /etc/rc2.d (Tôi sử dụng ubfox, runlevel có thể khác với bạn). Hãy chắc chắn rằng bạn cung cấp cho nó một số S cao hơn liên kết openvpn!

Kịch bản làm một số điều. Phần trên cùng thiết lập các biến, với một số câu lệnh perl và awk được sử dụng để lấy IP động và địa chỉ cổng. Phần thứ hai dọn sạch các bảng mà bạn thiết lập trong ipruote2 và sao chép bảng định tuyến hiện tại vào chúng. Sau đó, nó tạo ra hai tuyến mới và hai cổng mặc định cho chúng, với VPN đi qua VPN và internet sẽ đi qua mạng cục bộ của tôi.

Tôi không tin rằng 2 dòng tiếp theo là cần thiết, nhưng chúng cho phép chuyển tiếp ip để sử dụng trong iptables.

Tiếp theo, tập lệnh tạo một số quy tắc về nơi tìm kiếm lưu lượng truy cập bắt nguồn từ địa chỉ IP có liên quan và nơi để tìm nếu lưu lượng được đánh dấu cụ thể.

ĐIỂM VÀ BẢO QUẢN đảm bảo rằng lưu lượng truy cập bắt nguồn từ một địa chỉ nhận được phản hồi!

Iptables cuối cùng PREROUTING là phần gắn thẻ lưu lượng và đảm bảo rằng mọi thứ đến cổng 80 hoặc 443 đều được đánh dấu để sử dụng Bảng 2 (VPN)

Hai dòng cuối cùng loại bỏ cổng VPN khỏi bảng định tuyến mặc định và thêm lại cổng mạng cục bộ của tôi.

Khi nó đứng, quá trình hoạt động rực rỡ. VPN được khởi động khi máy xuất hiện và tập lệnh này được chạy vài giây sau (tôi có thể thêm một câu lệnh ngủ chỉ để đảm bảo VPN được khởi tạo hoàn toàn trước khi chạy tập lệnh này). Kết nối truy cập từ xa của tôi (ssh, v.v.) hoạt động rất tốt. Các kết nối của tôi không đi đến cổng 80 hoặc 443 đang sử dụng kết nối cục bộ của tôi, nhưng tất cả lưu lượng truy cập web đều đi qua VPN và bỏ qua các điều khiển được đặt bởi ISP của tôi!

Như tôi đã nói trong nhận xét của mình dưới câu hỏi của mình, tôi thậm chí sẽ không bắt đầu nhìn vào tuyến đường này mà không có gợi ý của @anttir. Tắt mặt sau của đề xuất đó, các trang web http://blog.khax.net/2009/11/11/multi-gateway-routing-with-iptables-and-iproute2/http://linux-ip.net/ html / adv-multi-internet.html đã rất hữu ích (ngay cả khi mã chưa hoàn thành 100%!)


1
Một bổ sung cuối cùng, tôi đã thêm một sleep 20phần đầu vào kịch bản vì kết nối openvpn không hoàn thành đúng lúc. Tôi cũng đã thêm vào echo 2 > /proc/sys/net/ipv4/conf/tun0/rp_filtertập lệnh vì nó cần thiết để vô hiệu hóa bộ lọc gói ngược cho tun0. Khi trả lời trở lại từ tun0 với địa chỉ nguồn S, bộ lọc gói ngược sẽ kiểm tra "nếu tôi định tuyến gói đến địa chỉ S và nó sẽ không đi qua tun0, tôi sẽ bỏ gói" - và vì khi thực hiện việc này Tra cứu không có fwmark hợp lệ, nó xác định tuyến sẽ là tuyến mặc định thông thường, vì vậy nó sẽ bỏ gói.
Steve

Tôi đã phải chỉnh sửa kịch bản của bạn để làm cho nó hoạt động. Dòng cuối cùng route add default gw 192.168.0.1 eth0dường như định tuyến lưu lượng truy cập cổng 80/443 qua cổng cục bộ thay vì tun0 như dự định. Thay đổi dòng cuối cùng route add default tun0để làm cho tôi lừa.

1

định tuyến trên mỗi giao thức là một chút phức tạp. Thông thường bảng định tuyến được sử dụng để kiểm tra cổng theo IP đích và sử dụng cổng mặc định openvpn hoặc 192.168.0.1.

Sẽ dễ dàng hơn để thiết lập, ví dụ như Squid http proxy ở đầu kia của VPN và đặt trình duyệt sử dụng proxy.

Bạn sẽ không sử dụng iptables vì ​​nó sẽ thay đổi IP đích của kết nối HTTP và nó sẽ không hoạt động.

Bạn có thể tạo bảng định tuyến mới (/ etc / iproute2 / rt_tables) với tuyến mặc định được đặt thành điểm cuối VPN, sử dụng iptables fwmark (-j Mark) để đánh dấu tất cả các gói HTTP và sau đó sử dụng quy tắc ip để tạo quy tắc tùy chỉnh cho các gói được đánh dấu để sử dụng bảng định tuyến mới.


Cảm ơn bạn đã giúp đỡ. Tôi chắc chắn sẽ xem xét những người. Mọi thứ hơi rắc rối ở chỗ tôi không có quyền kiểm soát đầu máy chủ, chỉ là phía tôi. Ngoài ra, tôi không thể sử dụng mực vì tôi cần định tuyến lưu lượng https qua kết nối và mực không hoạt động tốt với điều đó.
Steve

Làm thế nào về việc định tuyến chỉ một vài IP qua VPN và phần còn lại của thế giới bên ngoài VPN?
Antti Rytsölä

Tôi đã nghĩ đến việc định tuyến chỉ một vài IP, nhưng danh sách thay đổi khi các trang web di chuyển xung quanh và tôi cần làm cho nó dễ sử dụng cho những người dùng khác trên PC. Tôi đã bắt đầu xem xét việc thiết lập một bảng định tuyến mới và đánh dấu các gói. Các gói đánh dấu là bit dễ dàng, đó là bảng định tuyến tôi không chắc lắm. Tôi có thể thiết lập một cái cho VPN có vẻ đúng và một cái cho mọi thứ khác có vẻ đúng, nhưng tôi không chắc phải làm gì với main vì nó vẫn được đặt thành mặc định (VPN là gì). Vẫn đang chơi ...
Steve

linux-ip.net/html/adv-multi-iNET.html hiển thị quy tắc ip và quy tắc ip thêm fwmark 4 bảng 4 ưu tiên 10000
Antti Rytsölä

Đã thêm một bản cập nhật cho bản gốc mà chi tiết cho đến nay tôi đã đến! AH! Chỉ cần nhận ra rằng tôi đã chỉnh sửa câu trả lời của bạn, không phải câu hỏi của tôi. Lấy làm tiếc! Không sử dụng nhiều như vậy và không nhận ra tôi có thể chỉnh sửa câu trả lời của người khác!
Steve
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.