क्यों iptables चिह्नित लेकिन मेरे अलावा मार्ग के रूप में नहीं


1

मैं डोमेन नाम का उपयोग करके अपने ब्राउज़र के रूट पैकेट को नियंत्रित करना चाहता हूं, वीपीएन के माध्यम से विशेष डोमेन नाम के भीतर ट्रैफ़िक पैकेट और सामान्य मार्ग के बिना विशेष डोमेन नाम के बिना अन्य ट्रैफ़िक पैकेट। मैं dnsmasq और iptables का उपयोग करके इस लक्ष्य को प्राप्त करता हूं।

वैसे, मैं अपने नोटबुक कंप्यूटर (डीपिनलिनक्स 4.15.0-29deepin-जेनेरिक) का उपयोग dnsmasq और वायरगार्ड के साथ कर रहा हूं, मेरी नोटबुक vpn क्लाइंट है और डीएनएस सर्वर के रूप में भी।

कदम इस प्रकार हैं:

1 dnsmasq कॉन्फ़िगर करें

फ़ाइल कॉन्फ़िगर करें:

root@notebook-PC:~# cat /etc/dnsmasq.conf
# auto-generated config file from /etc/config/dhcp
conf-file=/etc/dnsmasq.conf
domain-needed
log-queries
log-facility=/var/log/dnsmasq.log
no-resolv
localise-queries
read-ethers
bogus-priv
expand-hosts
local-service
cache-size=150
domain=lan
server=/lan/
server=223.6.6.6
# dhcp-leasefile=/tmp/dhcp.leases
# addn-hosts=/tmp/hosts
conf-dir=/etc/dnsmasq.d
stop-dns-rebind
rebind-localhost-ok
dhcp-broadcast=tag:needs-broadcast


dhcp-range=lan,192.168.10.100,192.168.10.249,255.255.255.0,12h
# no-dhcp-interface=eth0.2

और केवल /etc/dnsmasq.d में एक फ़ाइल

root@notebook-PC:~# cd /etc/dnsmasq.d/
root@notebook-PC:/etc/dnsmasq.d# more newgfw.conf 
# dnsmasq rules generated by ss_spec_dst_fw
# Last Updated on 2019-04-29 13:36:58
# 
server=/030buy.com/8.8.8.8#53
ipset=/030buy.com/ss_spec_dst_fw
server=/0rz.tw/8.8.8.8#53
ipset=/0rz.tw/ss_spec_dst_fw
server=/1000giri.net/8.8.8.8#53
ipset=/1000giri.net/ss_spec_dst_fw
...........

विकल्प "सर्वर" और "ipset" ने इन डीएनएस को 8.8.8.8 पर क्वेरी करने दिया, फिर प्रतिक्रिया होस्ट आईपी को ipset ss_spec_dst_fw में जोड़ा गया

बेशक, मैं dnsmasq को dns सर्वर के रूप में जोड़ना नहीं भूलता

root@notebook-PC:~# nslookup
> google.com
Server:     127.0.0.1
Address:    127.0.0.1#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.24.206
Name:   google.com
Address: 2404:6800:4005:806::200e
> 

2 wg-quick को संशोधित करें और वायरगार्ड शुरू करें

मैंने पाया कि wg-quick.sh को vpn इंटरफ़ेस के माध्यम से सभी ट्रैफ़िक मिलते हैं, तो मैं टिप्पणी करता हूं कि 3 लाइन कोड का पालन करें, मैं स्वयं नियम चाहता हूं।

vi /usr/bin/wg-quick

................
add_default() {
    local table proto key value
    if ! get_fwmark table; then
        table=51820
        while [[ -n $(ip -4 route show table $table) || -n $(ip -6 route show table $table) ]]; do
            ((table++))
        done
        cmd wg set "$INTERFACE" fwmark $table
    fi
    proto=-4
    [[ $1 == *:* ]] && proto=-6
#   cmd ip $proto route add "$1" dev "$INTERFACE" table $table
#   cmd ip $proto rule add not fwmark $table table $table
#   cmd ip $proto rule add table main suppress_prefixlength 0
    while read -r key _ value; do
        [[ $value -eq 1 ]] && sysctl -q "$key=2"
    done < <(sysctl -a -r '^net\.ipv4.conf\.[^ .=]+\.rp_filter$')
    return 0
}
................

तब जब वायरगार्ड शुरू होता है

wg-quick up wgnet0

wgnet0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1420
        inet 192.168.32.2  netmask 255.255.255.0  destination 192.168.32.2
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)
        RX packets 15  bytes 1380 (1.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 615  bytes 21652 (21.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlp5s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.3  netmask 255.255.255.0  broadcast 192.168.1.255

wgnet0 vpn इंटरफ़ेस है जिसका उपयोग विशेष डोमेन नाम ट्रैफ़िक के माध्यम से किया जाता है, और wlp5s0 सामान्य ट्रैफ़िक का उपयोग करके सामान्य इंटरफ़ेस है।

ip rule show follow

root@notebook-PC:~# ip rule
0:  from all lookup local 
220:    from all lookup 220 
32766:  from all lookup main 
32767:  from all lookup default 

[३] नियम और मार्ग को कॉन्फ़िगर करें

फ़ाइल / wg / iproute2 / rt_tables में wg तालिका जोड़ें

root@notebook-PC:~# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
201     wg
0   unspec
#
# local
#
#1  inr.ruhep

उसके बाद नियम जोड़ें

ip -4 route add table wg default via 192.168.32.1 dev wgnet0 metric 100
ip rule add prio 100 from all fwmark 51820 lookup wg

root@notebook-PC:~# ip rule show all
0:  from all lookup local 
100:    from all fwmark 0xca6c lookup wg 
220:    from all lookup 220 
32766:  from all lookup main 
32767:  from all lookup default 
root@notebook-PC:~# ip route show table wg
default via 192.168.32.1 dev wgnet0 metric 100 

[४] निशान सक्षम करें

root@notebook-PC:~# cat /proc/sys/net/ipv4/tcp_fwmark_accept 
0
root@notebook-PC:~# sysctl -w net.ipv4.tcp_fwmark_accept=1
net.ipv4.tcp_fwmark_accept = 1
root@notebook-PC:~# cat /proc/sys/net/ipv4/tcp_fwmark_accept 
1

[५] iptables को चेन और नियम को कॉन्फ़िगर करें

पिछले चरणों के कारण, मैंने आईपी को जोड़ा है जिसमें वीपीएस इंटरफ़ेस को ipset ss_spec_dst_fw में रूट करने की आवश्यकता है, फिर मुझे इन पैकेटों को चिह्नित करने की आवश्यकता है।

इस लेख ( http://www.faqs.org/docs/iptables/traversingoftables.html ) के साथ, iptables दो चरणों में रूटिंग निर्णय लेता है, और स्थानीय प्रक्रिया (इस मामले में मेरी नोटबुक पर ब्राउज़र प्रक्रिया) OUTPUT दर्ज करने से पहले रूटिंग निर्णय लेता है चियान, तो मुझे स्थानीय प्रक्रिया राउटर की आवश्यकता है।

जैसा कि मैंने किया था, मैं OUTPUT_direct chian में नियम जोड़ता हूं, जो सभी पैकेट ipset ss_spec_dst_fw से PREROUTING_direct श्रृंखला में कूदते हैं, और PREROUTING -direct श्रृंखला में नियम जोड़ते हैं, जो सभी पैकेट ipset ss_spec_dst_fw से मेल खाते हैं। चित्र के अनुसार।

छवि

जब PREROUTING_direct श्रृंखला () ACCEPT पैकेट के रूप में फिर से रूटिंग निर्णय लें, तो ऑपरेशन निम्नानुसार करें:

root@notebook-PC:~# iptables -t mangle -A OUTPUT_direct -m set --match-set ss_spec_dst_fw dsts -j PREROUTING_direct

root@notebook-PC:~# iptables -t mangle -A PREROUTING_direct -j CONNMARK --restore-mark
root@notebook-PC:~# iptables -t mangle -A PREROUTING_direct -m set --match-set ss_spec_dst_fw dsts -j MARK --set-mark 51820
root@notebook-PC:~# iptables -t mangle -A PREROUTING_direct -j CONNMARK --save-mark
root@notebook-PC:~# iptables -t mangle -A PREROUTING_direct -j ACCEPT
root@notebook-PC:~# 
root@notebook-PC:~# iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
PREROUTING_direct  all  --  anywhere             anywhere            
PREROUTING_ZONES_SOURCE  all  --  anywhere             anywhere            
PREROUTING_ZONES  all  --  anywhere             anywhere            

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
INPUT_direct  all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
FORWARD_direct  all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
OUTPUT_direct  all  --  anywhere             anywhere            

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
POSTROUTING_direct  all  --  anywhere             anywhere            

Chain FORWARD_direct (1 references)
target     prot opt source               destination         

Chain INPUT_direct (1 references)
target     prot opt source               destination         

Chain OUTPUT_direct (1 references)
target     prot opt source               destination         
PREROUTING_direct  all  --  anywhere             anywhere             match-set ss_spec_dst_fw dst

Chain POSTROUTING_direct (1 references)
target     prot opt source               destination         

Chain PREROUTING_ZONES (1 references)
target     prot opt source               destination         
PRE_public  all  --  anywhere             anywhere            [goto] 
PRE_public  all  --  anywhere             anywhere            [goto] 

Chain PREROUTING_ZONES_SOURCE (1 references)
target     prot opt source               destination         

Chain PREROUTING_direct (2 references)
target     prot opt source               destination         
CONNMARK   all  --  anywhere             anywhere             CONNMARK restore
MARK       all  --  anywhere             anywhere             match-set ss_spec_dst_fw dst MARK set 0xca6c
CONNMARK   all  --  anywhere             anywhere             CONNMARK save
ACCEPT     all  --  anywhere             anywhere            

Chain PRE_public (2 references)
target     prot opt source               destination         
PRE_public_log  all  --  anywhere             anywhere            
PRE_public_deny  all  --  anywhere             anywhere            
PRE_public_allow  all  --  anywhere             anywhere            

Chain PRE_public_allow (1 references)
target     prot opt source               destination         

Chain PRE_public_deny (1 references)
target     prot opt source               destination         

Chain PRE_public_log (1 references)
target     prot opt source               destination         
root@notebook-PC:~# 

अब, सभी काम किया जाता है, लेकिन फिर से मैं नहीं है सिवाय, यह काम नहीं कर रहा है !!!

ipset ss_spec_dst_fw ने dns क्वेरी से ip प्रतिक्रिया जोड़ी

root@notebook-PC:~# ipset list ss_spec_dst_fw
Name: ss_spec_dst_fw
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 5368
References: 2
Number of entries: 113
Members:
216.58.221.229
172.217.161.170
172.217.161.173
203.208.43.95
216.58.199.5
216.58.221.234
216.58.199.110
172.217.161.141
172.217.161.133
216.58.200.74
172.217.161.138
203.208.39.215
...........

dnsmasq अच्छी तरह से है, तो मैं इन आईपी मार्ग का परीक्षण कर रहा हूं:

root@notebook-PC:~# ip route get 216.58.221.229
216.58.221.229 via 192.168.1.1 dev wlp5s0 src 192.168.1.3 uid 0 
    cache 

यह परिणाम वह नहीं है जिसकी मुझे उम्मीद थी, 192.168.1.1 सामान्य गेटवे है जो वीपीएन गेटवे नहीं है, फिर मैं 51820 (उपरोक्त कोड का चिह्न मूल्य) का परीक्षण करता हूं,

root@notebook-PC:~# ip route flush cache

root@notebook-PC:~# ip route get 216.58.221.229 mark 51820
216.58.221.229 via 192.168.32.1 dev wgnet0 table wg src 192.168.32.2 mark 0xca6c uid 0 
    cache 
root@notebook-PC:~# ip route flush cache
root@notebook-PC:~# ip route get 216.58.221.229
216.58.221.229 via 192.168.1.1 dev wlp5s0 src 192.168.1.3 uid 0 
    cache 

ये परिणाम सत्यापित करते हैं कि आईपी नियम और मार्ग अच्छी तरह से है, लेकिन अन्य नहीं है, तो मैं जांचता हूं कि क्या iptables इन पैकेटों को चिह्नित करता है, मैं 216.58.221.229 ट्रैसरआउट करता हूं और लॉग करता हूं

root@notebook-PC:~# traceroute 216.58.221.229
traceroute to 216.58.221.229 (216.58.221.229), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  *

और कॉनट्रैक लॉग

root@notebook-PC:~# conntrack -E -d 216.58.221.229
    [NEW] udp      17 30 src=192.168.1.3 dst=216.58.221.229 sport=44951 dport=33434 [UNREPLIED] src=216.58.221.229 dst=192.168.1.3 sport=33434 dport=44951 mark=51820
    [NEW] udp      17 30 src=192.168.1.3 dst=216.58.221.229 sport=34181 dport=33435 [UNREPLIED] src=216.58.221.229 dst=192.168.1.3 sport=33435 dport=34181 mark=51820
    [NEW] udp      17 30 src=192.168.1.3 dst=216.58.221.229 sport=58059 dport=33436 [UNREPLIED] src=216.58.221.229 dst=192.168.1.3 sport=33436 dport=58059 mark=51820
    [NEW] udp      17 30 src=192.168.1.3 dst=216.58.221.229 sport=40739 dport=33437 [UNREPLIED] src=216.58.221.229 dst=192.168.1.3 sport=33437 dport=40739 mark=51820
........................

अंक 51820 हो गया है!

अब मैं उलझन में हूँ, मुझे क्या याद आ रहा है?

जवाबों:


0

स्थानीय मूल पैकेट mangle/PREROUTINGश्रृंखला से नहीं गुजरते हैं । आपको अपने अंकन नियमों को mangle/OUTPUTश्रृंखला में स्थानांतरित करना चाहिए । आप नियम सेट को सूचीबद्ध करने के लिए ' iptables-save -c' या ' iptables -L -n -v' का उपयोग कर सकते हैं (पहला कमांड बेहतर है, क्योंकि यह पूरा नियम सेट दिखाता है) और नियम काउंटर की जांच करें। संभवतः आपके मामले में काउंटर शून्य हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.