ipipou暗号化されおいないトンネル以䞊のもの

IPv6の神に䜕ず蚀いたすか



IPv6 今日ではない


確かに、そしお暗号化の神に、今日も同じこずを蚀いたす。



ここでは、暗号化されおいないIPv4トンネルに぀いお説明したすが、「りォヌムランプ」に぀いおではなく、最新の「LED」トンネルに぀いお説明したす。そしお、raw゜ケットが点滅し、ナヌザヌスペヌスでパッケヌゞを操䜜したす。



すべおの味ず色にNのトンネリングプロトコルがありたす。



  • スタむリッシュでトレンディで若々しいWireGuard
  • スむスのナむフ、OpenVPN、SSHのような倚機胜
  • GRE
  • , , IPIP
  • GENEVE
  • .


しかし、私はプログラマヌなので、Nをほんの少しだけ増やし、実際のプロトコルの開発はb開発者に任せたす。私が珟圚取り組んでいる



別の胎児プロゞェクトでは、倖郚からNATの背埌にあるホストに到達する必芁がありたす。このために倧人の暗号化を備えたプロトコルを䜿甚しお、私はそれが砲匟のようであるずいう感芚を決しお残したせんでした。なぜなら トンネルはほずんどの堎合、NAT-eに穎を掘るためにのみ䜿甚されたす。通垞、内郚トラフィックも暗号化されたすが、HTTPSのために溺れおいたす。



さたざたなトンネリングプロトコルを研究しおいる間、私の内なる完璧䞻矩者の泚意は、その最小限のオヌバヌヘッドのために䜕床も䜕床もIPIPに匕き付けられたした。しかし、それは私のタスクにずっお1.5の重倧な欠点がありたす。



  • 䞡偎にパブリックIPが必芁です。
  • そしおあなたのための認蚌はありたせん。


したがっお、完璧䞻矩者は頭蓋骚の暗い隅、たたは圌がそこに座っおいるずころならどこにでも远いやられたした。



そしお、か぀お、Linuxでネむティブにサポヌトされおいるトンネルに関する蚘事を読んでいるずきに、FOUFoo-over-UDPに出くわしたした。䜕でも、UDPに包たれおいたす。これたでのずころ、IPIPずGUEGeneric UDP Encapsulationのみが他からサポヌトされおいたす。



「これが特効薬です私ず目のためのシンプルなIPIP。」ず思いたした。



実際、匟䞞は完党に銀色ではありたせんでした。 UDPでのカプセル化は、最初の問題を解決したす-事前に確立された接続を䜿甚しお倖郚からNATの背埌にあるクラむアントに接続できたすが、ここではIPIPの次の欠点の半分が新たな光に浮かびたす-プラむベヌトネットワヌクの誰もが目に芋えるパブリックIPずクラむアントポヌト玔粋なIPIPの背埌に隠れるこずができたす問題はない。



この1.5の問題を解決するために、ipipouナヌティリティが誕生したした。カヌネル空間でパケットを迅速か぀効率的に凊理する匷力なFOUの動䜜を䞭断するこずなく、リモヌトホストを認蚌するための自䜜のメカニズムを実装したす。



スクリプトは必芁ありたせん



クラむアントのパブリックポヌトずIPがわかっおいる堎合たずえば、どこに行っおも、NATはポヌトを1察1でマップしようずしたす、スクリプトを䜿甚せずに、次のコマンドを䜿甚しおIPIP-over-FOUトンネルを䜜成できたす。



サヌバヌ䞊

#    FOU
modprobe fou

#  IPIP     FOU.
#  ipip  .
ip link add name ipipou0 type ipip \
    remote 198.51.100.2 local 203.0.113.1 \
    encap fou encap-sport 10000 encap-dport 20001 \
    mode ipip dev eth0

#       FOU   
ip fou add port 10000 ipproto 4 local 203.0.113.1 dev eth0

#  IP  
ip address add 172.28.0.0 peer 172.28.0.1 dev ipipou0

#  
ip link set ipipou0 up


クラむアント䞊

modprobe fou

ip link add name ipipou1 type ipip \
    remote 203.0.113.1 local 192.168.0.2 \
    encap fou encap-sport 10001 encap-dport 10000 encap-csum \
    mode ipip dev eth0

#  local, peer, peer_port, dev     ,   .
# peer  peer_port        FOU-listener-.
ip fou add port 10001 ipproto 4 local 192.168.0.2 peer 203.0.113.1 peer_port 10000 dev eth0

ip address add 172.28.0.1 peer 172.28.0.0 dev ipipou1

ip link set ipipou1 up


どこ

  • ipipou* -ロヌカルトンネルネットワヌクむンタヌフェむスの名前
  • 203.0.113.1 -サヌバヌのパブリックIP
  • 198.51.100.2 -クラむアントのパブリックIP
  • 192.168.0.2 -eth0むンタヌフェむスに割り圓おられたクラむアントIP
  • 10001 -FOUのロヌカルクラむアントポヌト
  • 20001 -FOUのパブリッククラむアントポヌト
  • 10000 -FOUのパブリックサヌバヌポヌト
  • encap-csum — UDP UDP ; noencap-csum, , ( )
  • eth0 — ipip
  • 172.28.0.1 — IP ()
  • 172.28.0.0 — IP ()


UDP接続が有効である限り、トンネルは動䜜状態になり、トンネルがどのように切断されるか、幞運なこずに、クラむアントのIPポヌトが同じたたである堎合、トンネルは有効になり、倉曎されたす。



状況を奜転させる最も簡単な方法は、カヌネルモゞュヌルをアンロヌドするこずmodprobe -r fou ipip



です。認蚌が䞍芁な堎合でも、パブリックIPずクラむアントポヌトは垞に既知であるずは限らず、倚くの堎合、予枬䞍可胜たたは倉曎可胜ですNATタむプによっお異なりたす。encap-dportサヌバヌ偎で省略した堎合、トンネルは機胜せず、リモヌト接続ポヌトを䜿甚するほどスマヌトではありたせん。この堎合、ipipouも圹に立ちたす。あるいは、WireGuardや圌のような他の人があなたを助けおくれたす。



䜿い方



クラむアント通垞はNATの背埌にありたすは䞊蚘の䟋のようにトンネルを蚭定し、認蚌されたパケットをサヌバヌに送信しお、トンネルをその偎から構成できるようにしたす。蚭定に応じお、これは空のパケットサヌバヌがパブリックIP接続ポヌトを認識できるようにするため、たたはサヌバヌがクラむアントを識別できるデヌタを含む堎合がありたす。デヌタは、単玔なプレヌンテキストパスフレヌズHTTP Basic Authずの類䌌性が思い浮かびたすたたは秘密鍵で眲名された特別にフォヌマットされたデヌタHTTP Digest Authずの類䌌性により、より匷力client_authです。コヌドの関数を参照しおくださいにするこずができたす。



サヌバヌパブリックIP偎では、ipipouが起動するず、nfqueueキュヌハンドラヌが䜜成され、必芁なパケットがnfqueueキュヌぞの接続を初期化するパケット、および[ほずんど]残りすべおがFOUリスナヌに盎接送信されるようにnetfilterが構成されたす。



察象倖のnfqueueたたはNetfilterQueueは、カヌネルモゞュヌルの開発方法を知らないアマチュアにずっお特別なものです。netfilternftables / iptablesを䜿甚するず、ネットワヌクパケットをナヌザヌスペヌスにリダむレクトし、基本的な即興の手段で凊理できたす。倉曎オプション そしおカヌネルに返すか、砎棄したす。



䞀郚のプログラミング蚀語では、nfqueueを操䜜するためのバむンディングがありたすが、bashの堎合はありたせんでした圓然のこずながら、pythonを䜿甚する必芁がありたしたipipouはNetfilterQueueを䜿甚したす。



パフォヌマンスが重芁でない堎合は、この機胜を䜿甚しお、パッケヌゞをかなり䜎レベルで操䜜するための独自のロゞックを比范的迅速か぀簡単に䜜成できたす。たずえば、実隓的なデヌタ転送プロトコルを䜜成したり、非暙準の動䜜でロヌカルおよびリモヌトサヌビスをトロヌルしたりできたす。



生の゜ケットはnfqueueず連携しお機胜したす。たずえば、トンネルがすでに構成されおいお、FOUが目的のポヌトでリッスンしおいる堎合、同じポヌトからパケットを送信する通垞の方法では機胜したせん。ビゞヌですが、ランダムに生成されたパケットを盎接ネットワヌクに送信しお送信できたす。生の゜ケットを䜿甚するむンタヌフェヌス。ただし、そのようなパケットの生成にはもう少し䜜業が必芁です。これは、認蚌付きのパケットがipipouで䜜成される方法です。



ipipouは接続からの最初のパケット接続が確立される前にキュヌにリヌクしたパケットのみを凊理するため、パフォヌマンスが䜎䞋するこずはほずんどありたせん。



ipipouサヌバヌが認蚌されたパケットを受信するずすぐに、トンネルが䜜成され、接続内の埌続のすべおのパケットは、nfqueueをバむパスするカヌネルによっおすでに凊理されおいたす。接続が䞍良の堎合、蚭定に応じお、次の最初のパケットがnfqueueキュヌに送信されたす。これが認蚌パケットでない堎合は、最埌に蚘憶されたIPずクラむアントポヌトから、受け枡したたは砎棄できたす。認蚌されたパケットが新しいIPずポヌトから送信された堎合、トンネルはそれらを䜿甚するように再構成されたす。



通垞のIPIP-over-FOUには、NATを䜿甚するずきに別の問題がありたす。぀たり、FOUモゞュヌルずIPIPモゞュヌルは互いに完党に分離されおいるため、同じIPでUDPにカプセル化された2぀のIPIPトンネルを䜜成するこずはできたせん。それら。 1぀のパブリックIPの背埌にあるクラむアントのペアは、この方法で同じサヌバヌに同時に接続するこずはできたせん。将来的には、カヌネルレベルで解決される可胜性がありたすが、これは確実ではありたせん。それたでの間、NATの問題はNATで解決できたす。IPアドレスのペアがすでに別のトンネルで占有されおいる堎合、ipipouはパブリックから代替のプラむベヌトIPにNATを実行したす。 -ポヌトがなくなるたでトンネルを䜜成できたす。



なぜなら接続内のすべおのパケットが眲名されおいるわけではない堎合、そのような単玔な保護はMITMに察しお脆匱であるため、トラフィックをリッスンおよび制埡できるクラむアントずサヌバヌ間のパスに悪意のある人物が朜んでいる堎合、別のアドレスを介しお認蚌枈みパケットをリダむレクトし、信頌できないホストからトンネルを䜜成できたす。 ..。



トラフィックの倧郚分をコアに保ちながらこれを修正する方法に぀いお誰かがアむデアを持っおいる堎合は、遠慮なく声を䞊げおください。



ちなみに、UDPカプセル化は非垞によく蚌明されおいたす。IPを介したカプセル化ず比范するず、UDPヘッダヌのオヌバヌヘッドが远加されおいるにもかかわらず、はるかに安定しおおり、倚くの堎合高速です。これは、むンタヌネット䞊のホストの倧郚分が、TCP、UDP、ICMPの3぀の最も䞀般的なプロトコルのみで十分に機胜するずいう事実によるものです。知芚可胜な郚分は、これら3぀に察しおのみ最適化されおいるため、通垞、他のすべおを砎棄するか、凊理が遅くなる可胜性がありたす。



したがっお、たずえば、HTTP / 3の䜜成に基づいたQUICKは、IPではなくUDPを介しお䜜成されたした。



十分な蚀葉ですが、それが「珟実の䞖界」でどのように機胜するかを芋る時が来たした。



戊い



実䞖界を゚ミュレヌトするために䜿甚されたすiperf3。珟実ぞの近さの皋床に関しおは、これはMinecraftでの珟実䞖界の゚ミュレヌションに関するものですが、今のずころはそうなりたす。



競争には以䞋が含たれたす。

  • 参照マスタヌチャネル
  • この蚘事の䞻人公はipipouです
  • 認蚌はあるが暗号化はないOpenVPN
  • OpenVPNオヌルむンクルヌシブ
  • PresharedKeyなしのWireGuard、MTU = 1440IPv4のみ


オタクのための技術デヌタ




:



UDP

CPULOG=NAME.udp.cpu.log; sar 10 6 >"$CPULOG" & iperf3 -c SERVER_IP -4 -t 60 -f m -i 10 -B LOCAL_IP -P 2 -u -b 12M; tail -1 "$CPULOG"
#  "-b 12M"     ,     "-P",         .


TCP

CPULOG=NAME.tcp.cpu.log; sar 10 6 >"$CPULOG" & iperf3 -c SERVER_IP -4 -t 60 -f m -i 10 -B LOCAL_IP -P 2; tail -1 "$CPULOG"


ICMP latency

ping -c 10 SERVER_IP | tail -1


( ):



UDP

CPULOG=NAME.udp.cpu.log; sar 10 6 >"$CPULOG" & iperf3 -s -i 10 -f m -1; tail -1 "$CPULOG"


TCP

CPULOG=NAME.tcp.cpu.log; sar 10 6 >"$CPULOG" & iperf3 -s -i 10 -f m -1; tail -1 "$CPULOG"




ipipou



/etc/ipipou/server.conf:

server
number 0
fou-dev eth0
fou-local-port 10000
tunl-ip 172.28.0.0
auth-remote-pubkey-b64 eQYNhD/Xwl6Zaq+z3QXDzNI77x8CEKqY1n5kt9bKeEI=
auth-secret topsecret
auth-lifetime 3600
reply-on-auth-ok
verb 3


systemctl start ipipou@server





/etc/ipipou/client.conf:

client
number 0
fou-local @eth0
fou-remote SERVER_IP:10000
tunl-ip 172.28.0.1
# pubkey of auth-key-b64: eQYNhD/Xwl6Zaq+z3QXDzNI77x8CEKqY1n5kt9bKeEI=
auth-key-b64 RuBZkT23na2Q4QH1xfmZCfRgSgPt5s362UPAFbecTso=
auth-secret topsecret
keepalive 27
verb 3


systemctl start ipipou@client



openvpn ( , )



openvpn --genkey --secret ovpn.key  #    ovpn.key 
openvpn --dev tun1 --local SERVER_IP --port 2000 --ifconfig 172.16.17.1 172.16.17.2 --cipher none --auth SHA1 --ncp-disable --secret ovpn.key




openvpn --dev tun1 --local LOCAL_IP --remote SERVER_IP --port 2000 --ifconfig 172.16.17.2 172.16.17.1 --cipher none --auth SHA1 --ncp-disable --secret ovpn.key


openvpn (c , , UDP, )

openvpn-manage



wireguard



/etc/wireguard/server.conf:

[Interface]
Address=172.31.192.1/18
ListenPort=51820
PrivateKey=aMAG31yjt85zsVC5hn5jMskuFdF8C/LFSRYnhRGSKUQ=
MTU=1440

[Peer]
PublicKey=LyhhEIjVQPVmr/sJNdSRqTjxibsfDZ15sDuhvAQ3hVM=
AllowedIPs=172.31.192.2/32


systemctl start wg-quick@server





/etc/wireguard/client.conf:

[Interface]
Address=172.31.192.2/18
PrivateKey=uCluH7q2Hip5lLRSsVHc38nGKUGpZIUwGO/7k+6Ye3I=
MTU=1440

[Peer]
PublicKey=DjJRmGvhl6DWuSf1fldxNRBvqa701c0Sc7OpRr4gPXk=
AllowedIPs=172.31.192.1/32
Endpoint=SERVER_IP:51820


systemctl start wg-quick@client



結果



生の醜いタブレット
CPU , .. :



proto bandwidth[Mbps] CPU_idle_client[%] CPU_idle_server[%]
# 20 Mbps    (4 core)  VPS (1 core)  
# pure
UDP 20.4      99.80 93.34
TCP 19.2      99.67 96.68
ICMP latency min/avg/max/mdev = 198.838/198.997/199.360/0.372 ms
# ipipou
UDP 19.8      98.45 99.47
TCP 18.8      99.56 96.75
ICMP latency min/avg/max/mdev = 199.562/208.919/220.222/7.905 ms
# openvpn0 (auth only, no encryption)
UDP 19.3      99.89 72.90
TCP 16.1      95.95 88.46
ICMP latency min/avg/max/mdev = 191.631/193.538/198.724/2.520 ms
# openvpn (full encryption, auth, etc)
UDP 19.6      99.75 72.35
TCP 17.0      94.47 87.99
ICMP latency min/avg/max/mdev = 202.168/202.377/202.900/0.451 ms
# wireguard
UDP 19.3      91.60 94.78
TCP 17.2      96.76 92.87
ICMP latency min/avg/max/mdev = 217.925/223.601/230.696/3.266 ms

## -1Gbps   VPS    (1 core)
# pure
UDP 729      73.40 39.93
TCP 363      96.95 90.40
ICMP latency min/avg/max/mdev = 106.867/106.994/107.126/0.066 ms
# ipipou
UDP 714      63.10 23.53
TCP 431      95.65 64.56
ICMP latency min/avg/max/mdev = 107.444/107.523/107.648/0.058 ms
# openvpn0 (auth only, no encryption)
UDP 193      17.51  1.62
TCP  12      95.45 92.80
ICMP latency min/avg/max/mdev = 107.191/107.334/107.559/0.116 ms
# wireguard
UDP 629      22.26  2.62
TCP 198      77.40 55.98
ICMP latency min/avg/max/mdev = 107.616/107.788/108.038/0.128 ms




20Mbpsの



20Mbpsでの垯域幅の比范



20Mbpsでの埅ち時間の比范



チャネル1぀の楜芳的なGbpsのチャネル



1Gbps垯域幅の比范



CPU効率の比范Mbps / CPU_usage



すべおの堎合においお、ipipouはパフォヌマンスの点でベヌスチャネルにかなり近いです、そしおそれは玠晎らしいです



暗号化されおいないopenvpnトンネルは、どちらの堎合もかなり奇劙な動䜜をしたした。



誰かがそれをテストしようずしおいるなら、フィヌドバックを聞くこずは興味深いでしょう。



IPv6ずNetPrickleが䞀緒にいおくれたすように



All Articles