{"id":78151,"date":"2025-07-25T11:19:32","date_gmt":"2025-07-25T10:19:32","guid":{"rendered":"https:\/\/proxidize.com\/?post_type=blog&#038;p=78151"},"modified":"2025-10-23T11:43:29","modified_gmt":"2025-10-23T10:43:29","slug":"test-udp-over-socks","status":"publish","type":"blog","link":"https:\/\/proxidize.com\/blog\/test-udp-over-socks\/","title":{"rendered":"How to Test UDP over SOCKS"},"content":{"rendered":"\n<p>Testing UDP can be tricky and confusing: few apps support it, SOCKS5 requires a separate UDP ASSOCIATE handshake to relay datagrams, and browsers neither expose raw UDP sockets nor forward UDP\u2010based transports like QUIC (HTTP\/3) through proxies.<\/p>\n\n\n\n<p>For this reason, we\u2019ve put together a few different ways to test whether your SOCKS5 server is proxying UDP.<\/p>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized centered\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"536\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/when-udp-is-used-in-practice-1024x536.jpg\" alt=\"A drawing of various computer screens under the title &quot;When UDP Is Used in Practice&quot;.\" class=\"wp-image-78174\" style=\"object-fit:cover\" srcset=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/when-udp-is-used-in-practice-1024x536.jpg 1024w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/when-udp-is-used-in-practice-300x157.jpg 300w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/when-udp-is-used-in-practice-768x402.jpg 768w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/when-udp-is-used-in-practice-600x314.jpg 600w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/when-udp-is-used-in-practice.jpg 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">When UDP Is Used in Practice<\/h2>\n\n\n\n<p>These are some of the real-world environments in which UDP is used:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>DNS Queries:<\/strong> These work over UDP and uses port 53, can be tested using <code>dig @8.8.8.8 google.com<\/code><\/li>\n\n\n\n<li><strong>Network Time Protocol:<\/strong> NTP uses UDP and works on port 123, can be tested using <code>ntpd -q time.google.com<\/code><\/li>\n\n\n\n<li><strong>Voice-over-IP Apps:<\/strong> Slack, Teams, Skype, Zoom, Discord, and more all use UDP to facilitate VoIP<\/li>\n\n\n\n<li>Online games and live streaming apps<\/li>\n<\/ul>\n\n\n\n<p>This isn\u2019t an exhaustive list, but these are some key examples we\u2019ll leverage to run our tests, alongside a custom script.<\/p>\n\n\n\t\t<div data-elementor-type=\"container\" data-elementor-id=\"85916\" class=\"elementor elementor-85916\" data-elementor-post-type=\"elementor_library\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6227acb e-con-full no-scale elementor-hidden-mobile_extra elementor-hidden-mobile e-flex e-con e-child\" data-id=\"6227acb\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-08fce92 e-grid e-con-full e-con e-child\" data-id=\"08fce92\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-426c265 e-con-full e-flex e-con e-child\" data-id=\"426c265\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b474c5f elementor-widget elementor-widget-heading\" data-id=\"b474c5f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">IP rotation, city and carrier targeting,<br>\nsticky sessions \u2014 control it all via API<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e86f5a3 e-con-full e-flex e-con e-child\" data-id=\"e86f5a3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-6e3bca6 e-con-full e-flex e-con e-child\" data-id=\"6e3bca6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2c6c495 elementor-widget__width-initial elementor-widget elementor-widget-image\" data-id=\"2c6c495\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"125\" height=\"80\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/10\/20-2.svg\" class=\"attachment-full size-full wp-image-86191\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-17d8cea inline-CTA elementor-widget elementor-widget-button\" data-id=\"17d8cea\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/proxidize.com\/mobile-proxy-pricing\/?coupon_code=20OFFMPB\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Buy Proxies Now<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized centered\"><img decoding=\"async\" width=\"1024\" height=\"536\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/setting-up-the-tunnel-1024x536.jpg\" alt=\"A drawing of a server connecting to a tunnel under the title &quot;Setting up the Tunnel&quot;.\" class=\"wp-image-78172\" style=\"object-fit:cover\" srcset=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/setting-up-the-tunnel-1024x536.jpg 1024w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/setting-up-the-tunnel-300x157.jpg 300w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/setting-up-the-tunnel-768x402.jpg 768w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/setting-up-the-tunnel-600x314.jpg 600w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/setting-up-the-tunnel.jpg 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Setting up the Tunnel<\/h2>\n\n\n\n<p>In order to test whether our SOCKS proxy successfully proxies our UDP traffic, we first need to install tun2socks to create a virtual interface that will forward all our traffic (UDP and TCP) over a SOCKS5 proxy.<\/p>\n\n\n\n<p>You can download the binary from <a href=\"https:\/\/github.com\/xjasonlyu\/tun2socks\" target=\"_blank\" rel=\"noopener\">Github<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Setting up the Tunnel on Linux<\/h3>\n\n\n\n<p>First, let\u2019s create TUN interface <code>tun0<\/code> and assign an IP address for it:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e0def4;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>ip tuntap add mode tun dev tun0\nip addr add 198.18.0.1\/15 dev tun0\nip link set dev tun0 up<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EA9A97\">ip<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">tuntap<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">mode<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">tun<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">dev<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">tun0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">ip<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">addr<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1\/15<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">dev<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">tun0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">ip<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">link<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">set<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">dev<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">tun0<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">up<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Next, configure the default route table with different metrics. Let&#8217;s say the primary interface is <code>eth0<\/code> and gateway is <code>192.168.0.1<\/code>.<\/p>\n\n\n\n<p><strong>Important Note:<\/strong> Make sure you&#8217;re connected to the server via LAN and make sure the values are correct, otherwise you will lose access to the server.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e0def4;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>ip route del default\nip route add default via 198.18.0.1 dev tun0 metric 1\nip r add default via 192.168.0.1 dev eth0  metric 10<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EA9A97\">ip<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">del<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">default<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">ip<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">default<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">via<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">dev<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">tun0<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">metric<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">ip<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">r<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">default<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">via<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">192.168<\/span><span style=\"color: #F6C177\">.0.1<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">dev<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">eth0<\/span><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #F6C177\">metric<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">10<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Now all traffic will go through the new TUN interface then to the proxy.<\/p>\n\n\n\n<p>Once you\u2019re done testing:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Remove the new <code>tun0<\/code> routes<\/li>\n\n\n\n<li>Add the default <code>eth0<\/code> route again (tun2socks might have deleted it)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Setting up the Tunnel on MacOS<\/h3>\n\n\n\n<p>For macOS, we need to start tun2socks first so that it will create a TUN interface for us.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e0def4;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>tun2socks -device utun123 -proxy socks5:\/\/username:password@IP:PORT -interface en0<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EA9A97\">tun2socks<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-device<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">utun123<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-proxy<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">socks5:\/\/username:password@IP:PORT<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-interface<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">en0<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Your Internet interface name might be different than <code>en0<\/code>. Use ifconfig to find the correct name.<\/p>\n\n\n\n<p>Next, let\u2019s use ifconfig to bring the TUN interface up and assign addresses for it.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e0def4;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>sudo ifconfig utun123 198.18.0.1 198.18.0.1 up<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EA9A97\">sudo<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">ifconfig<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">utun123<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">up<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Add these specific routes so that tun2socks can handle primary connections.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e0def4;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>sudo route add -net 1.0.0.0\/8 198.18.0.1\nsudo route add -net 2.0.0.0\/7 198.18.0.1\nsudo route add -net 4.0.0.0\/6 198.18.0.1\nsudo route add -net 8.0.0.0\/5 198.18.0.1\nsudo route add -net 16.0.0.0\/4 198.18.0.1\nsudo route add -net 32.0.0.0\/3 198.18.0.1\nsudo route add -net 64.0.0.0\/2 198.18.0.1\nsudo route add -net 128.0.0.0\/1 198.18.0.1\nsudo route add -net 198.18.0.0\/15 198.18.0.1<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EA9A97\">sudo<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-net<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">1.0<\/span><span style=\"color: #F6C177\">.0.0\/8<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">sudo<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-net<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">2.0<\/span><span style=\"color: #F6C177\">.0.0\/7<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">sudo<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-net<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">4.0<\/span><span style=\"color: #F6C177\">.0.0\/6<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">sudo<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-net<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">8.0<\/span><span style=\"color: #F6C177\">.0.0\/5<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">sudo<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-net<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">16.0<\/span><span style=\"color: #F6C177\">.0.0\/4<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">sudo<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-net<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">32.0<\/span><span style=\"color: #F6C177\">.0.0\/3<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">sudo<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-net<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">64.0<\/span><span style=\"color: #F6C177\">.0.0\/2<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">sudo<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-net<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">128.0<\/span><span style=\"color: #F6C177\">.0.0\/1<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EA9A97\">sudo<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">route<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">add<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">-net<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.0\/15<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">198.18<\/span><span style=\"color: #F6C177\">.0.1<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Now all traffic will go through the new TUN interface then to the proxy.<\/p>\n\n\n\n<p>Once you\u2019re done testing, just exit the command and it will automatically delete the new routes.<\/p>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized centered\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"536\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/testing-udp-traffic-1024x536.jpg\" alt=\"A computer with wires under the title &quot;Testing UDP Traffic&quot;.\" class=\"wp-image-78173\" style=\"object-fit:cover\" srcset=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/testing-udp-traffic-1024x536.jpg 1024w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/testing-udp-traffic-300x157.jpg 300w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/testing-udp-traffic-768x402.jpg 768w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/testing-udp-traffic-600x314.jpg 600w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/testing-udp-traffic.jpg 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Testing UDP Traffic over SOCKS5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Test UDP with DNS Query<\/h3>\n\n\n\n<p>Use the DNS lookup utility to send a query to the DNS server at 8.8.8.8 (which is Google&#8217;s public resolver) instead of your system&#8217;s default one to ping Google&#8217;s homepage.<\/p>\n\n\n\n<p><strong>Command:<\/strong> <code>dig @8.8.8.8<a href=\"http:\/\/google.com\" target=\"_blank\" rel=\"noopener\"> google.com<\/a><\/code>. It\u2019s the same command on Linux and MacOS<\/p>\n\n\n\n<p><strong>Success:<\/strong> Returned the IP behind<a href=\"http:\/\/google.com\" target=\"_blank\" rel=\"noopener\"> google.com<\/a> using a proxy that supports UDP.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"348\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-success-1024x348.jpeg\" alt=\"\" class=\"wp-image-78156\" srcset=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-success-1024x348.jpeg 1024w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-success-300x102.jpeg 300w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-success-768x261.jpeg 768w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-success-1536x521.jpeg 1536w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-success-2048x695.jpeg 2048w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-success-600x204.jpeg 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Failure:<\/strong> Timeout because the proxy does not support UDP.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"225\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-failure-1024x225.jpeg\" alt=\"\" class=\"wp-image-78157\" srcset=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-failure-1024x225.jpeg 1024w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-failure-300x66.jpeg 300w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-failure-768x169.jpeg 768w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-failure-1536x338.jpeg 1536w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-failure-600x132.jpeg 600w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-dns-query-failure.jpeg 1592w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Test UDP with NTP<\/h3>\n\n\n\n<p>Given that NTP traffic is entirely over UDP, sending <code>ntpd -q time.google.com<\/code> through your SOCKS5 proxy is another way to test whether it supports UDP.<\/p>\n\n\n\n<p><strong>Command:<\/strong> <code>sudo ntpd -q time.google.com<\/code> (Linux only). This might require installing <code>ntp<\/code>.<\/p>\n\n\n\n<p><strong>Success:<\/strong> It was able to send\/receive and resolve Google&#8217;s time server.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"526\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-success-1024x526.jpeg\" alt=\"\" class=\"wp-image-78158\" srcset=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-success-1024x526.jpeg 1024w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-success-300x154.jpeg 300w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-success-768x395.jpeg 768w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-success-1536x789.jpeg 1536w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-success-2048x1052.jpeg 2048w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-success-600x308.jpeg 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Failure: <\/strong>It was not able to resolve over the proxy.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"493\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-failure-1024x493.jpeg\" alt=\"\" class=\"wp-image-78159\" srcset=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-failure-1024x493.jpeg 1024w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-failure-300x144.jpeg 300w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-failure-768x370.jpeg 768w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-failure-1536x740.jpeg 1536w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-failure-2048x986.jpeg 2048w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-ntp-failure-600x289.jpeg 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Test UDP with Discord VoIP<\/h3>\n\n\n\n<p>VoIP uses UDP to carry its real-time audio and video. By joining a Discord call or voice channel and successfully being able to hear others and have others hear you, it confirms that UDP is being carried over your SOCKS proxy.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Download the <a href=\"https:\/\/discord.com\/download\" target=\"_blank\" rel=\"noopener\">Discord desktop client<\/a><\/li>\n\n\n\n<li>Connect to any voice channel<\/li>\n<\/ol>\n\n\n\n<p><strong>Success:<\/strong> Displays &#8220;Voice connected&#8221; and others in the channel are able to hear you.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"716\" height=\"292\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-discord-success.jpeg\" alt=\"\" class=\"wp-image-78160\" srcset=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-discord-success.jpeg 716w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-discord-success-300x122.jpeg 300w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-discord-success-600x245.jpeg 600w\" sizes=\"(max-width: 716px) 100vw, 716px\" \/><\/figure>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Failure:<\/strong> You can\u2019t hear anyone in the voice channel and your connection shows \u201cNo Route\u201d.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"716\" height=\"292\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-discord-failure.jpeg\" alt=\"\" class=\"wp-image-78161\" srcset=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-discord-failure.jpeg 716w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-discord-failure-300x122.jpeg 300w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/udp-test-discord-failure-600x245.jpeg 600w\" sizes=\"(max-width: 716px) 100vw, 716px\" \/><\/figure>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Test UDP over SOCKS with Custom UDP Client Script<\/h3>\n\n\n\n<p>Testing <a href=\"https:\/\/proxidize.com\/blog\/udp-over-socks\/\" target=\"_blank\" data-type=\"blog\" data-id=\"60953\" rel=\"noreferrer noopener\">UDP over SOCKS<\/a> for dozens \u2014 if not hundreds \u2014 of proxies can be very time consuming. Instead of doing it all manually, we\u2019ve created a custom script that tests UDP traffic via Google DNS query for you. We\u2019ve included a link so you can download and test your own IPs for yourself.<\/p>\n\n\n\n<p>For the script to work you need to:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Have python3 installed<\/li>\n\n\n\n<li>Create a proxy.txt file that lists your proxies in the following format: <kbd>username:password@host:port<\/kbd> or <kbd>host:port<\/kbd> if it has no authentication<\/li>\n\n\n\n<li>Run the script via python3 test_udp.py<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#e0def4;--cbp-line-number-width:calc(3 * 0.6 * .75rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import base64\nimport socket\nimport struct\nimport sys\nimport time\nfrom typing import Optional, Tuple\n\n\nclass SOCKS5UDPTester:\n    def __init__(\n        self,\n        proxy_host: str,\n        proxy_port: int,\n        username: str = None,\n        password: str = None,\n    ):\n        self.proxy_host = proxy_host\n        self.proxy_port = proxy_port\n        self.username = username\n        self.password = password\n        self.sock = None\n\n    def connect_and_authenticate(self) -> bool:\n        \"\"\"Establish connection and authenticate with SOCKS5 proxy\"\"\"\n        try:\n            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n            self.sock.settimeout(10)\n            self.sock.connect((self.proxy_host, self.proxy_port))\n\n            # SOCKS5 greeting\n            if self.username and self.password:\n                # Request username\/password authentication\n                greeting = b\"\\x05\\x02\\x00\\x02\"  # SOCKS5, 2 methods, no auth + username\/password\n            else:\n                # Request no authentication\n                greeting = b\"\\x05\\x01\\x00\"  # SOCKS5, 1 method, no auth\n\n            self.sock.send(greeting)\n            response = self.sock.recv(2)\n\n            if len(response) != 2 or response&#091;0&#093; != 0x05:\n                print(\"\u274c Invalid SOCKS5 greeting response\")\n                return False\n\n            auth_method = response&#091;1&#093;\n\n            if auth_method == 0x00:  # No authentication\n                print(\"\u2705 Connected with no authentication\")\n                return True\n            elif auth_method == 0x02:  # Username\/password\n                return self._authenticate_userpass()\n            else:\n                print(f\"\u274c Unsupported authentication method: {auth_method}\")\n                return False\n\n        except Exception as e:\n            print(f\"\u274c Connection failed: {e}\")\n            return False\n\n    def _authenticate_userpass(self) -> bool:\n        \"\"\"Perform username\/password authentication\"\"\"\n        if not self.username or not self.password:\n            print(\"\u274c Username\/password required but not provided\")\n            return False\n\n        # Username\/password authentication request\n        username_bytes = self.username.encode(\"utf-8\")\n        password_bytes = self.password.encode(\"utf-8\")\n\n        auth_request = struct.pack(\"!BB\", 0x01, len(username_bytes))\n        auth_request += username_bytes\n        auth_request += struct.pack(\"!B\", len(password_bytes))\n        auth_request += password_bytes\n\n        self.sock.send(auth_request)\n        auth_response = self.sock.recv(2)\n\n        if len(auth_response) != 2 or auth_response&#091;0&#093; != 0x01:\n            print(\"\u274c Invalid authentication response\")\n            return False\n\n        if auth_response&#091;1&#093; == 0x00:\n            print(\"\u2705 Authentication successful\")\n            return True\n        else:\n            print(\"\u274c Authentication failed\")\n            return False\n\n    def test_udp_associate(self) -> Tuple[bool, Optional[Tuple&#091;str, int&#093;]]:\n        \"\"\"Test UDP ASSOCIATE command\"\"\"\n        try:\n            # UDP ASSOCIATE request\n            # VER(0x05) + CMD(0x03) + RSV(0x00) + ATYP(0x01) + DST.ADDR(0.0.0.0) + DST.PORT(0)\n            udp_request = b\"\\x05\\x03\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\"\n\n            self.sock.send(udp_request)\n            response = self.sock.recv(10)\n\n            if len(response) &lt; 10:\n                print(\"\u274c Incomplete UDP ASSOCIATE response\")\n                return False, None\n\n            # Parse response\n            ver, rep, rsv, atyp = struct.unpack(\"!BBBB\", response&#091;:4&#093;)\n\n            if ver != 0x05:\n                print(f\"\u274c Invalid SOCKS version in response: {ver}\")\n                return False, None\n\n            if rep == 0x00:\n                print(\"\u2705 UDP ASSOCIATE command accepted\")\n\n                # Parse relay address and port\n                if atyp == 0x01:  # IPv4\n                    relay_ip = socket.inet_ntoa(response&#091;4:8&#093;)\n                    relay_port = struct.unpack(\"!H\", response&#091;8:10&#093;)&#091;0&#093;\n                    print(f\"\u2705 UDP relay endpoint: {relay_ip}:{relay_port}\")\n                    return True, (relay_ip, relay_port)\n                else:\n                    print(f\"\u274c Unsupported address type in response: {atyp}\")\n                    return False, None\n            else:\n                error_messages = {\n                    0x01: \"General SOCKS server failure\",\n                    0x02: \"Connection not allowed by ruleset\",\n                    0x03: \"Network unreachable\",\n                    0x04: \"Host unreachable\",\n                    0x05: \"Connection refused\",\n                    0x06: \"TTL expired\",\n                    0x07: \"Command not supported\",\n                    0x08: \"Address type not supported\",\n                }\n                error_msg = error_messages.get(rep, f\"Unknown error code: {rep}\")\n                print(f\"\u274c UDP ASSOCIATE failed: {error_msg}\")\n                return False, None\n\n        except Exception as e:\n            print(f\"\u274c UDP ASSOCIATE test failed: {e}\")\n            return False, None\n\n    def test_udp_relay(self, relay_endpoint: Tuple&#091;str, int&#093;) -> bool:\n        \"\"\"Test actual UDP relay functionality\"\"\"\n        try:\n            relay_ip, relay_port = relay_endpoint\n\n            # Create UDP socket for testing\n            udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n            udp_sock.settimeout(5)\n\n            # Create SOCKS5 UDP packet for DNS query to 8.8.8.8:53\n            # RSV(0x0000) + FRAG(0x00) + ATYP(0x01) + DST.ADDR + DST.PORT + DATA\n            dns_query = b\"\\x12\\x34\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x06google\\x03com\\x00\\x00\\x01\\x00\\x01\"\n\n            socks_udp_packet = struct.pack(\n                \"!HBB\", 0x0000, 0x00, 0x01\n            )  # RSV + FRAG + ATYP\n            socks_udp_packet += socket.inet_aton(\"8.8.8.8\")  # DST.ADDR\n            socks_udp_packet += struct.pack(\"!H\", 53)  # DST.PORT\n            socks_udp_packet += dns_query  # DATA\n\n            print(\n                f\"\ud83d\udd04 Testing UDP relay by sending DNS query through {relay_ip}:{relay_port}\"\n            )\n\n            udp_sock.sendto(socks_udp_packet, (relay_ip, relay_port))\n\n            # Try to receive response\n            try:\n                response, addr = udp_sock.recvfrom(4096)\n                print(f\"\u2705 Received UDP response from relay ({len(response)} bytes)\")\n                print(f\"\u2705 UDP relay is working correctly!\")\n                return True\n            except socket.timeout:\n                print(\"\u274c No response from UDP relay (timeout)\")\n                return False\n            finally:\n                udp_sock.close()\n\n        except Exception as e:\n            print(f\"\u274c UDP relay test failed: {e}\")\n            return False\n\n    def test_proxy(self) -> dict:\n        \"\"\"Run complete UDP support test\"\"\"\n        auth_str = f\"{self.username}:{self.password}@\" if self.username else \"\"\n        result = {\n            \"proxy\": f\"{auth_str}{self.proxy_host}:{self.proxy_port}\",\n            \"connection\": False,\n            \"udp_associate\": False,\n            \"udp_relay\": False,\n            \"relay_endpoint\": None,\n        }\n\n        print(f\"\\n\ud83d\udd0d Testing SOCKS5 proxy: {self.proxy_host}:{self.proxy_port}\")\n        print(\"=\" * 50)\n\n        # Test connection and authentication\n        if not self.connect_and_authenticate():\n            return result\n        result&#091;\"connection\"&#093; = True\n\n        # Test UDP ASSOCIATE command\n        udp_supported, relay_endpoint = self.test_udp_associate()\n        result&#091;\"udp_associate\"&#093; = udp_supported\n        result&#091;\"relay_endpoint\"&#093; = relay_endpoint\n\n        if not udp_supported:\n            return result\n\n        # Test actual UDP relay functionality\n        if relay_endpoint:\n            relay_works = self.test_udp_relay(relay_endpoint)\n            result&#091;\"udp_relay\"&#093; = relay_works\n\n        return result\n\n    def close(self):\n        \"\"\"Close connection\"\"\"\n        if self.sock:\n            self.sock.close()\n\n\ndef parse_proxy_file(filename: str) -> list:\n    \"\"\"Parse proxy file with format username:password@ip:port\"\"\"\n    proxies = []\n\n    try:\n        with open(filename, \"r\", encoding=\"utf-8\") as f:\n            for line_num, line in enumerate(f, 1):\n                line = line.strip()\n                if not line or line.startswith(\"#\"):\n                    continue\n\n                try:\n                    # Parse username:password@ip:port format\n                    if \"@\" in line:\n                        auth_part, addr_part = line.rsplit(\"@\", 1)\n                        if \":\" in auth_part:\n                            username, password = auth_part.split(\":\", 1)\n                        else:\n                            print(\n                                f\"\u26a0\ufe0f  Line {line_num}: Invalid auth format, skipping: {line}\"\n                            )\n                            continue\n                    else:\n                        # No authentication\n                        username, password = None, None\n                        addr_part = line\n\n                    # Parse ip:port\n                    if \":\" in addr_part:\n                        host, port_str = addr_part.rsplit(\":\", 1)\n                        port = int(port_str)\n                    else:\n                        print(\n                            f\"\u26a0\ufe0f  Line {line_num}: Invalid address format, skipping: {line}\"\n                        )\n                        continue\n\n                    proxies.append(\n                        {\n                            \"host\": host,\n                            \"port\": port,\n                            \"username\": username,\n                            \"password\": password,\n                            \"original_line\": line,\n                        }\n                    )\n\n                except ValueError as e:\n                    print(f\"\u26a0\ufe0f  Line {line_num}: Error parsing line '{line}': {e}\")\n                    continue\n                except Exception as e:\n                    print(\n                        f\"\u26a0\ufe0f  Line {line_num}: Unexpected error parsing line '{line}': {e}\"\n                    )\n                    continue\n\n        print(f\"\ud83d\udcd6 Loaded {len(proxies)} proxies from {filename}\")\n        return proxies\n\n    except FileNotFoundError:\n        print(f\"\u274c File not found: {filename}\")\n        print(\"\ud83d\udcdd Please create proxy.txt with format: username:password@ip:port\")\n        print(\"\ud83d\udcdd Example content:\")\n        print(\"   test:test@127.0.0.1:1080\")\n        print(\"   XxoWb:CEx3v@127.0.0.1:1026\")\n        print(\"   # Lines starting with # are ignored\")\n        print(\"   127.0.0.1:1080  # No auth proxy\")\n        return []\n    except Exception as e:\n        print(f\"\u274c Error reading proxy file: {e}\")\n        return []\n\n\ndef test_multiple_proxies(proxy_file: str = \"proxy.txt\"):\n    \"\"\"Test multiple SOCKS5 proxies for UDP support\"\"\"\n    proxies = parse_proxy_file(proxy_file)\n\n    if not proxies:\n        return []\n\n    results = []\n\n    for proxy_config in proxies:\n        tester = SOCKS5UDPTester(\n            proxy_config&#091;\"host\"&#093;,\n            proxy_config&#091;\"port\"&#093;,\n            proxy_config.get(\"username\"),\n            proxy_config.get(\"password\"),\n        )\n\n        try:\n            result = tester.test_proxy()\n            results.append(result)\n        finally:\n            tester.close()\n\n    # Print summary\n    print(\"\\n\" + \"=\" * 80)\n    print(\"\ud83d\udcca SUMMARY\")\n    print(\"=\" * 80)\n\n    for result in results:\n        proxy_str = result&#091;\"proxy\"&#093;\n        if result&#091;\"connection\"&#093;:\n            if result&#091;\"udp_associate\"&#093; and result&#091;\"udp_relay\"&#093;:\n                status = \"\u2705 FULL UDP SUPPORT\"\n            elif result&#091;\"udp_associate\"&#093;:\n                status = \"\u26a0\ufe0f  UDP ASSOCIATE ONLY (relay not working)\"\n            else:\n                status = \"\u274c NO UDP SUPPORT\"\n        else:\n            status = \"\u274c CONNECTION FAILED\"\n\n        print(f\"{proxy_str:&lt;35} | {status}\")\n\n    return results\n\n\nif __name__ == \"__main__\":\n    print(\"SOCKS5 UDP Support Tester\")\n    print(\"=\" * 80)\n\n    # Check if custom proxy file specified\n    proxy_file = \"proxy.txt\"\n    if len(sys.argv) > 1:\n        proxy_file = sys.argv&#091;1&#093;\n\n    print(f\"\ud83d\udcc2 Reading proxies from: {proxy_file}\")\n\n    try:\n        results = test_multiple_proxies(proxy_file)\n\n        if results:\n            # Count results\n            total = len(results)\n            working_udp = sum(\n                1 for r in results if r&#091;\"udp_associate\"&#093; and r&#091;\"udp_relay\"&#093;\n            )\n            partial_udp = sum(\n                1 for r in results if r&#091;\"udp_associate\"&#093; and not r&#091;\"udp_relay\"&#093;\n            )\n            no_udp = sum(\n                1 for r in results if r&#091;\"connection\"&#093; and not r&#091;\"udp_associate\"&#093;\n            )\n            failed = sum(1 for r in results if not r&#091;\"connection\"&#093;)\n\n            print(f\"\\n\ud83d\udcc8 STATISTICS\")\n            print(\"=\" * 80)\n            print(f\"Total proxies tested: {total}\")\n            print(f\"\u2705 Full UDP support: {working_udp}\")\n            print(f\"\u26a0\ufe0f  Partial UDP support: {partial_udp}\")\n            print(f\"\u274c No UDP support: {no_udp}\")\n            print(f\"\ud83d\udca5 Connection failed: {failed}\")\n\n        else:\n            print(\"\\n\u274c No proxies to test. Please check your proxy file.\")\n\n    except KeyboardInterrupt:\n        print(\"\\n\u274c Test interrupted by user\")\n        sys.exit(1)\n    except Exception as e:\n        print(f\"\\n\u274c Unexpected error: {e}\")\n        sys.exit(1)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #3E8FB0\">import<\/span><span style=\"color: #E0DEF4\"> base64<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import<\/span><span style=\"color: #E0DEF4\"> socket<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import<\/span><span style=\"color: #E0DEF4\"> struct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import<\/span><span style=\"color: #E0DEF4\"> sys<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import<\/span><span style=\"color: #E0DEF4\"> time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">from<\/span><span style=\"color: #E0DEF4\"> typing <\/span><span style=\"color: #3E8FB0\">import<\/span><span style=\"color: #E0DEF4\"> Optional<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> Tuple<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">class<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">SOCKS5UDPTester<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">def<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">__init__<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #C4A7E7; font-style: italic\">self<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #C4A7E7; font-style: italic\">proxy_host<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">str<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #C4A7E7; font-style: italic\">proxy_port<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">int<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #C4A7E7; font-style: italic\">username<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">str<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #C4A7E7; font-style: italic\">password<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">str<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #908CAA\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">proxy_host <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> proxy_host<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">proxy_port <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> proxy_port<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">username <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">password <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> password<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">def<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">connect_and_authenticate<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">self<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">-&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">bool<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line cbp-see-more-line cbp-see-more-transition\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #F6C177\">&quot;&quot;&quot;Establish connection and authenticate with SOCKS5 proxy&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">try<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> socket<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">socket<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">socket<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #3E8FB0\">AF_INET<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> socket<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #3E8FB0\">SOCK_STREAM<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">settimeout<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #EA9A97\">10<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">connect<\/span><span style=\"color: #908CAA\">((<\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">proxy_host<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">proxy_port<\/span><span style=\"color: #908CAA\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> SOCKS5 greeting<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">username <\/span><span style=\"color: #3E8FB0\">and<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">password<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Request username\/password authentication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                greeting <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">b<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">\\x05\\x02\\x00\\x02<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> SOCKS5, 2 methods, no auth + username\/password<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Request no authentication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                greeting <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">b<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">\\x05\\x01\\x00<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> SOCKS5, 1 method, no auth<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">send<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">greeting<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            response <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">recv<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #EA9A97\">2<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">len<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">response<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">!=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">2<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">or<\/span><span style=\"color: #E0DEF4\"> response<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #EA9A97\">0<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">!=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">05<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\u274c Invalid SOCKS5 greeting response&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            auth_method <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> response<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #908CAA\">&#093;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> auth_method <\/span><span style=\"color: #3E8FB0\">==<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">00<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> No authentication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\u2705 Connected with no authentication&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">True<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">elif<\/span><span style=\"color: #E0DEF4\"> auth_method <\/span><span style=\"color: #3E8FB0\">==<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">02<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Username\/password<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">_authenticate_userpass<\/span><span style=\"color: #908CAA\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u274c Unsupported authentication method: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">auth_method<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">except<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">Exception<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">as<\/span><span style=\"color: #E0DEF4\"> e<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u274c Connection failed: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">e<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">def<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">_authenticate_userpass<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">self<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">-&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">bool<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #F6C177\">&quot;&quot;&quot;Perform username\/password authentication&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">not<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">username <\/span><span style=\"color: #3E8FB0\">or<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">not<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">password<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\u274c Username\/password required but not provided&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Username\/password authentication request<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        username_bytes <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">username<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">encode<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;utf-8&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        password_bytes <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">password<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">encode<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;utf-8&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        auth_request <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> struct<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">pack<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;!BB&quot;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">01<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">len<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">username_bytes<\/span><span style=\"color: #908CAA\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        auth_request <\/span><span style=\"color: #3E8FB0\">+=<\/span><span style=\"color: #E0DEF4\"> username_bytes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        auth_request <\/span><span style=\"color: #3E8FB0\">+=<\/span><span style=\"color: #E0DEF4\"> struct<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">pack<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;!B&quot;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">len<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">password_bytes<\/span><span style=\"color: #908CAA\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        auth_request <\/span><span style=\"color: #3E8FB0\">+=<\/span><span style=\"color: #E0DEF4\"> password_bytes<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">send<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">auth_request<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        auth_response <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">recv<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #EA9A97\">2<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">len<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">auth_response<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">!=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">2<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">or<\/span><span style=\"color: #E0DEF4\"> auth_response<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #EA9A97\">0<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">!=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">01<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\u274c Invalid authentication response&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> auth_response<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">==<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">00<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\u2705 Authentication successful&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">True<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\u274c Authentication failed&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">def<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">test_udp_associate<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">self<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">-&gt;<\/span><span style=\"color: #E0DEF4\"> Tuple<\/span><span style=\"color: #908CAA\">[<\/span><span style=\"color: #9CCFD8\">bool<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> Optional<\/span><span style=\"color: #908CAA\">[<\/span><span style=\"color: #E0DEF4\">Tuple<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #9CCFD8\">str<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">int<\/span><span style=\"color: #908CAA\">&#093;]]:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #F6C177\">&quot;&quot;&quot;Test UDP ASSOCIATE command&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">try<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> UDP ASSOCIATE request<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> VER(0x05) + CMD(0x03) + RSV(0x00) + ATYP(0x01) + DST.ADDR(0.0.0.0) + DST.PORT(0)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            udp_request <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">b<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">\\x05\\x03\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00<\/span><span style=\"color: #F6C177\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">send<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">udp_request<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            response <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">recv<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #EA9A97\">10<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">len<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">response<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">&lt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">10<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\u274c Incomplete UDP ASSOCIATE response&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Parse response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            ver<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> rep<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> rsv<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> atyp <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> struct<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">unpack<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;!BBBB&quot;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> response<\/span><span style=\"color: #908CAA\">&#091;:<\/span><span style=\"color: #EA9A97\">4<\/span><span style=\"color: #908CAA\">&#093;)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> ver <\/span><span style=\"color: #3E8FB0\">!=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">05<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u274c Invalid SOCKS version in response: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">ver<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> rep <\/span><span style=\"color: #3E8FB0\">==<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">00<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\u2705 UDP ASSOCIATE command accepted&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Parse relay address and port<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> atyp <\/span><span style=\"color: #3E8FB0\">==<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">01<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> IPv4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    relay_ip <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> socket<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">inet_ntoa<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">response<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #EA9A97\">4<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #EA9A97\">8<\/span><span style=\"color: #908CAA\">&#093;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    relay_port <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> struct<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">unpack<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;!H&quot;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> response<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #EA9A97\">8<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #EA9A97\">10<\/span><span style=\"color: #908CAA\">&#093;)&#091;<\/span><span style=\"color: #EA9A97\">0<\/span><span style=\"color: #908CAA\">&#093;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u2705 UDP relay endpoint: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">relay_ip<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">:<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">relay_port<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">True<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">relay_ip<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> relay_port<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u274c Unsupported address type in response: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">atyp<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                error_messages <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">01<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;General SOCKS server failure&quot;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">02<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;Connection not allowed by ruleset&quot;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">03<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;Network unreachable&quot;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">04<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;Host unreachable&quot;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">05<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;Connection refused&quot;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">06<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;TTL expired&quot;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">07<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;Command not supported&quot;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">08<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;Address type not supported&quot;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #908CAA\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                error_msg <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> error_messages<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">get<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">rep<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;Unknown error code: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">rep<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u274c UDP ASSOCIATE failed: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">error_msg<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">except<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">Exception<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">as<\/span><span style=\"color: #E0DEF4\"> e<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u274c UDP ASSOCIATE test failed: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">e<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">def<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">test_udp_relay<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">self<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #C4A7E7; font-style: italic\">relay_endpoint<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> Tuple<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #9CCFD8\">str<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">int<\/span><span style=\"color: #908CAA\">&#093;)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">-&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">bool<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #F6C177\">&quot;&quot;&quot;Test actual UDP relay functionality&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">try<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            relay_ip<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> relay_port <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> relay_endpoint<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Create UDP socket for testing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            udp_sock <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> socket<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">socket<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">socket<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #3E8FB0\">AF_INET<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> socket<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #3E8FB0\">SOCK_DGRAM<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            udp_sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">settimeout<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #EA9A97\">5<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Create SOCKS5 UDP packet for DNS query to 8.8.8.8:53<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> RSV(0x0000) + FRAG(0x00) + ATYP(0x01) + DST.ADDR + DST.PORT + DATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            dns_query <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">b<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">\\x12\\x34\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x06<\/span><span style=\"color: #F6C177\">google<\/span><span style=\"color: #3E8FB0\">\\x03<\/span><span style=\"color: #F6C177\">com<\/span><span style=\"color: #3E8FB0\">\\x00\\x00\\x01\\x00\\x01<\/span><span style=\"color: #F6C177\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            socks_udp_packet <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> struct<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">pack<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #F6C177\">&quot;!HBB&quot;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">0000<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">00<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">0x<\/span><span style=\"color: #EA9A97\">01<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> RSV + FRAG + ATYP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            socks_udp_packet <\/span><span style=\"color: #3E8FB0\">+=<\/span><span style=\"color: #E0DEF4\"> socket<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">inet_aton<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;8.8.8.8&quot;<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> DST.ADDR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            socks_udp_packet <\/span><span style=\"color: #3E8FB0\">+=<\/span><span style=\"color: #E0DEF4\"> struct<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">pack<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;!H&quot;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">53<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> DST.PORT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            socks_udp_packet <\/span><span style=\"color: #3E8FB0\">+=<\/span><span style=\"color: #E0DEF4\"> dns_query  <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> DATA<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\ud83d\udd04 Testing UDP relay by sending DNS query through <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">relay_ip<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">:<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">relay_port<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            udp_sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sendto<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">socks_udp_packet<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">relay_ip<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> relay_port<\/span><span style=\"color: #908CAA\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Try to receive response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">try<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                response<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> addr <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> udp_sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">recvfrom<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #EA9A97\">4096<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u2705 Received UDP response from relay (<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #EB6F92; font-style: italic\">len<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">response<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\"> bytes)&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u2705 UDP relay is working correctly!&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">True<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">except<\/span><span style=\"color: #E0DEF4\"> socket<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">timeout<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\u274c No response from UDP relay (timeout)&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">finally<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                udp_sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">close<\/span><span style=\"color: #908CAA\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">except<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">Exception<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">as<\/span><span style=\"color: #E0DEF4\"> e<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u274c UDP relay test failed: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">e<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">def<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">test_proxy<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">self<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">-&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">dict<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #F6C177\">&quot;&quot;&quot;Run complete UDP support test&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        auth_str <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">username<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">:<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">password<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">@&quot;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">username <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        result <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #F6C177\">&quot;proxy&quot;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">auth_str<\/span><span style=\"color: #3E8FB0\">}{<\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">proxy_host<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">:<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">proxy_port<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #F6C177\">&quot;connection&quot;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #F6C177\">&quot;udp_associate&quot;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #F6C177\">&quot;udp_relay&quot;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">False<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #F6C177\">&quot;relay_endpoint&quot;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #908CAA\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">\\n<\/span><span style=\"color: #F6C177\">\ud83d\udd0d Testing SOCKS5 proxy: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">proxy_host<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">:<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">proxy_port<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;=&quot;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">*<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">50<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Test connection and authentication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">not<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">connect_and_authenticate<\/span><span style=\"color: #908CAA\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        result<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;connection&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">True<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Test UDP ASSOCIATE command<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        udp_supported<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> relay_endpoint <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">test_udp_associate<\/span><span style=\"color: #908CAA\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        result<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;udp_associate&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> udp_supported<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        result<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;relay_endpoint&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> relay_endpoint<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">not<\/span><span style=\"color: #E0DEF4\"> udp_supported<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> result<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Test actual UDP relay functionality<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> relay_endpoint<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            relay_works <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">test_udp_relay<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">relay_endpoint<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            result<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;udp_relay&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> relay_works<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> result<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">def<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">close<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">self<\/span><span style=\"color: #908CAA\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #F6C177\">&quot;&quot;&quot;Close connection&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #E0DEF4; font-style: italic\">self<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">sock<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">close<\/span><span style=\"color: #908CAA\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">def<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">parse_proxy_file<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">filename<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">str<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">-&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">list<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #F6C177\">&quot;&quot;&quot;Parse proxy file with format username:password@ip:port&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    proxies <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">[]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">try<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">with<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">open<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">filename<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;r&quot;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #C4A7E7; font-style: italic\">encoding<\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #F6C177\">&quot;utf-8&quot;<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">as<\/span><span style=\"color: #E0DEF4\"> f<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">for<\/span><span style=\"color: #E0DEF4\"> line_num<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> line <\/span><span style=\"color: #3E8FB0\">in<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">enumerate<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">f<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #908CAA\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                line <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> line<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">strip<\/span><span style=\"color: #908CAA\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">not<\/span><span style=\"color: #E0DEF4\"> line <\/span><span style=\"color: #3E8FB0\">or<\/span><span style=\"color: #E0DEF4\"> line<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">startswith<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;#&quot;<\/span><span style=\"color: #908CAA\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">continue<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">try<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Parse username:password@ip:port format<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;@&quot;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">in<\/span><span style=\"color: #E0DEF4\"> line<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        auth_part<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> addr_part <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> line<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">rsplit<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;@&quot;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;:&quot;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">in<\/span><span style=\"color: #E0DEF4\"> auth_part<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                            username<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> password <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> auth_part<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">split<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;:&quot;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                                <\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u26a0\ufe0f  Line <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">line_num<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">: Invalid auth format, skipping: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">line<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                            <\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                            <\/span><span style=\"color: #3E8FB0\">continue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> No authentication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        username<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> password <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">None<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        addr_part <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> line<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Parse ip:port<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;:&quot;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">in<\/span><span style=\"color: #E0DEF4\"> addr_part<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        host<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> port_str <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> addr_part<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">rsplit<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;:&quot;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        port <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">int<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">port_str<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                            <\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u26a0\ufe0f  Line <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">line_num<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">: Invalid address format, skipping: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">line<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        <\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        <\/span><span style=\"color: #3E8FB0\">continue<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    proxies<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">append<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                            <\/span><span style=\"color: #F6C177\">&quot;host&quot;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> host<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                            <\/span><span style=\"color: #F6C177\">&quot;port&quot;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> port<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                            <\/span><span style=\"color: #F6C177\">&quot;username&quot;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> username<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                            <\/span><span style=\"color: #F6C177\">&quot;password&quot;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> password<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                            <\/span><span style=\"color: #F6C177\">&quot;original_line&quot;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> line<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        <\/span><span style=\"color: #908CAA\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">except<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">ValueError<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">as<\/span><span style=\"color: #E0DEF4\"> e<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u26a0\ufe0f  Line <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">line_num<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">: Error parsing line &#39;<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">line<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&#39;: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">e<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">continue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #3E8FB0\">except<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">Exception<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">as<\/span><span style=\"color: #E0DEF4\"> e<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                        <\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u26a0\ufe0f  Line <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">line_num<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">: Unexpected error parsing line &#39;<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">line<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&#39;: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">e<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                    <\/span><span style=\"color: #3E8FB0\">continue<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\ud83d\udcd6 Loaded <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #EB6F92; font-style: italic\">len<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">proxies<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\"> proxies from <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">filename<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> proxies<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">except<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">FileNotFoundError<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u274c File not found: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">filename<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\ud83d\udcdd Please create proxy.txt with format: username:password@ip:port&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\ud83d\udcdd Example content:&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;   test:test@127.0.0.1:1080&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;   XxoWb:CEx3v@127.0.0.1:1026&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;   # Lines starting with # are ignored&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;   127.0.0.1:1080  # No auth proxy&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">[]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">except<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">Exception<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">as<\/span><span style=\"color: #E0DEF4\"> e<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u274c Error reading proxy file: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">e<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">[]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">def<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">test_multiple_proxies<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">proxy_file<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">str<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;proxy.txt&quot;<\/span><span style=\"color: #908CAA\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #F6C177\">&quot;&quot;&quot;Test multiple SOCKS5 proxies for UDP support&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    proxies <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> parse_proxy_file<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">proxy_file<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">not<\/span><span style=\"color: #E0DEF4\"> proxies<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">[]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    results <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">[]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">for<\/span><span style=\"color: #E0DEF4\"> proxy_config <\/span><span style=\"color: #3E8FB0\">in<\/span><span style=\"color: #E0DEF4\"> proxies<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        tester <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> SOCKS5UDPTester<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            proxy_config<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;host&quot;<\/span><span style=\"color: #908CAA\">&#093;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            proxy_config<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;port&quot;<\/span><span style=\"color: #908CAA\">&#093;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            proxy_config<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">get<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;username&quot;<\/span><span style=\"color: #908CAA\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            proxy_config<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">get<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;password&quot;<\/span><span style=\"color: #908CAA\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">try<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            result <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> tester<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">test_proxy<\/span><span style=\"color: #908CAA\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            results<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">append<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">result<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">finally<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            tester<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">close<\/span><span style=\"color: #908CAA\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Print summary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">\\n<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">+<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;=&quot;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">*<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">80<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;\ud83d\udcca SUMMARY&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;=&quot;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">*<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">80<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">for<\/span><span style=\"color: #E0DEF4\"> result <\/span><span style=\"color: #3E8FB0\">in<\/span><span style=\"color: #E0DEF4\"> results<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        proxy_str <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> result<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;proxy&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> result<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;connection&quot;<\/span><span style=\"color: #908CAA\">&#093;:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> result<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;udp_associate&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">and<\/span><span style=\"color: #E0DEF4\"> result<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;udp_relay&quot;<\/span><span style=\"color: #908CAA\">&#093;:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                status <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;\u2705 FULL UDP SUPPORT&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">elif<\/span><span style=\"color: #E0DEF4\"> result<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;udp_associate&quot;<\/span><span style=\"color: #908CAA\">&#093;:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                status <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;\u26a0\ufe0f  UDP ASSOCIATE ONLY (relay not working)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                status <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;\u274c NO UDP SUPPORT&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            status <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;\u274c CONNECTION FAILED&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">proxy_str<\/span><span style=\"color: #3E8FB0\">:&lt;35}<\/span><span style=\"color: #F6C177\"> | <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">status<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> results<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">__name__<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">==<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;__main__&quot;<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;SOCKS5 UDP Support Tester&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;=&quot;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">*<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">80<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Check if custom proxy file specified<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    proxy_file <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&quot;proxy.txt&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">len<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">sys<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">argv<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        proxy_file <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> sys<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">argv<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #908CAA\">&#093;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\ud83d\udcc2 Reading proxies from: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">proxy_file<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">try<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        results <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> test_multiple_proxies<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">proxy_file<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> results<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA; font-style: italic\">#<\/span><span style=\"color: #6E6A86; font-style: italic\"> Count results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            total <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">len<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #E0DEF4\">results<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            working_udp <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">sum<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">for<\/span><span style=\"color: #E0DEF4\"> r <\/span><span style=\"color: #3E8FB0\">in<\/span><span style=\"color: #E0DEF4\"> results <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> r<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;udp_associate&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">and<\/span><span style=\"color: #E0DEF4\"> r<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;udp_relay&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            partial_udp <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">sum<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">for<\/span><span style=\"color: #E0DEF4\"> r <\/span><span style=\"color: #3E8FB0\">in<\/span><span style=\"color: #E0DEF4\"> results <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> r<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;udp_associate&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">and<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">not<\/span><span style=\"color: #E0DEF4\"> r<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;udp_relay&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            no_udp <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">sum<\/span><span style=\"color: #908CAA\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">                <\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">for<\/span><span style=\"color: #E0DEF4\"> r <\/span><span style=\"color: #3E8FB0\">in<\/span><span style=\"color: #E0DEF4\"> results <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> r<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;connection&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">and<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">not<\/span><span style=\"color: #E0DEF4\"> r<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;udp_associate&quot;<\/span><span style=\"color: #908CAA\">&#093;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            failed <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EB6F92; font-style: italic\">sum<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">for<\/span><span style=\"color: #E0DEF4\"> r <\/span><span style=\"color: #3E8FB0\">in<\/span><span style=\"color: #E0DEF4\"> results <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">not<\/span><span style=\"color: #E0DEF4\"> r<\/span><span style=\"color: #908CAA\">&#091;<\/span><span style=\"color: #F6C177\">&quot;connection&quot;<\/span><span style=\"color: #908CAA\">&#093;)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">\\n<\/span><span style=\"color: #F6C177\">\ud83d\udcc8 STATISTICS&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;=&quot;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">*<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">80<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;Total proxies tested: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">total<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u2705 Full UDP support: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">working_udp<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u26a0\ufe0f  Partial UDP support: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">partial_udp<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\u274c No UDP support: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">no_udp<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;\ud83d\udca5 Connection failed: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">failed<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">            <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">\\n<\/span><span style=\"color: #F6C177\">\u274c No proxies to test. Please check your proxy file.&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">except<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">KeyboardInterrupt<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">\\n<\/span><span style=\"color: #F6C177\">\u274c Test interrupted by user&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        sys<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">exit<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">except<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #9CCFD8\">Exception<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">as<\/span><span style=\"color: #E0DEF4\"> e<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #EB6F92; font-style: italic\">print<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #3E8FB0\">f<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #3E8FB0\">\\n<\/span><span style=\"color: #F6C177\">\u274c Unexpected error: <\/span><span style=\"color: #3E8FB0\">{<\/span><span style=\"color: #E0DEF4\">e<\/span><span style=\"color: #3E8FB0\">}<\/span><span style=\"color: #F6C177\">&quot;<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        sys<\/span><span style=\"color: #908CAA\">.<\/span><span style=\"color: #E0DEF4\">exit<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #EA9A97\">1<\/span><span style=\"color: #908CAA\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><div class=\"cbp-see-more-container\" data-see-more-collapse-string=\"Collapse\" data-see-more-string=\"Expand\" style=\"display:flex;flex-direction:column;align-items:flex-start;width:100%;background-color:transparent;font-size:12px;line-height:1;position:relative;margin-bottom:-16px;height:32px\"><span role=\"button\" tabindex=\"0\" class=\"cbp-see-more-simple-btn cbp-see-more-simple-btn-hover\" style=\"color:#cecbee;background-color:#232136;padding:10px 16px;cursor:default\">Expand<\/span><\/div><\/div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Here we tested two different proxies and found that one supports UDP and the other does not.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"450\" src=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/test-udp-custom-script-1024x450.jpeg\" alt=\"\" class=\"wp-image-78162\" srcset=\"https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/test-udp-custom-script-1024x450.jpeg 1024w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/test-udp-custom-script-300x132.jpeg 300w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/test-udp-custom-script-768x337.jpeg 768w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/test-udp-custom-script-1536x675.jpeg 1536w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/test-udp-custom-script-2048x900.jpeg 2048w, https:\/\/proxidize.com\/wp-content\/uploads\/2025\/07\/test-udp-custom-script-600x264.jpeg 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>We hope that over the course of this article you\u2019ve learned that testing UDP doesn\u2019t have to be difficult or confusing. By using some strategically chosen methods we can, in a straightforward way, set up a SOCKS5 server and proxy UDP traffic through it.<\/p>\n\n\n\n<p><strong>Key Takeaways:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use tun2socks to create a virtual interface that will forward your traffic over a SOCKS5 proxy.<\/li>\n\n\n\n<li>Run a DNS lookup using <code>dig @8.8.8.8<a href=\"http:\/\/google.com\" target=\"_blank\" rel=\"noopener\"> google.com<\/a><\/code><\/li>\n\n\n\n<li>On Linux: Test UDP via <code>sudo ntpd -q <a href=\"http:\/\/time.google.com\" target=\"_blank\" rel=\"noopener\">time.google.com<\/a><\/code><\/li>\n\n\n\n<li>Test UDP over SOCKS by connecting to a Discord voice channel.<\/li>\n\n\n\n<li>Use our custom script to test your proxies at scale.<\/li>\n<\/ul>\n\n\n\n<p>Between running a DNS lookup, syncing your clock via NTP, joining a Discord voice channel, and using a custom script, we\u2019ve given you a range of options to test UDP over SOCKS.<\/p>\n","protected":false},"author":2284,"featured_media":78171,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","categories":[263],"tags":[],"class_list":["post-78151","blog","type-blog","status-publish","format-standard","has-post-thumbnail","hentry","category-proxies-and-anonymity"],"acf":[],"_links":{"self":[{"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/blog\/78151","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/users\/2284"}],"replies":[{"embeddable":true,"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/comments?post=78151"}],"version-history":[{"count":14,"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/blog\/78151\/revisions"}],"predecessor-version":[{"id":87222,"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/blog\/78151\/revisions\/87222"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/media\/78171"}],"wp:attachment":[{"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/media?parent=78151"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/categories?post=78151"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/proxidize.com\/wp-json\/wp\/v2\/tags?post=78151"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}