मैं डोमेन नाम का उपयोग करके अपने ब्राउज़र के रूट पैकेट को नियंत्रित करना चाहता हूं, वीपीएन के माध्यम से विशेष डोमेन नाम के भीतर ट्रैफ़िक पैकेट और सामान्य मार्ग के बिना विशेष डोमेन नाम के बिना अन्य ट्रैफ़िक पैकेट। मैं 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 हो गया है!
अब मैं उलझन में हूँ, मुझे क्या याद आ रहा है?