mirror of
https://github.com/bol-van/zapret.git
synced 2026-09-19 06:44:55 +09:00
Compare commits
725 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1f46e91342 | |||
| d6f929ee5c | |||
| 6bdec3f87c | |||
| 1a6a2b702e | |||
| e95a06c7ee | |||
| afce40981c | |||
| 33720dee60 | |||
| 994e9c3488 | |||
| d4cfb6800f | |||
| a36e6ee60e | |||
| 813fe416f8 | |||
| 8e766744b6 | |||
| 0bc0997191 | |||
| b056ba95a1 | |||
| bae45abfbf | |||
| 21fc356476 | |||
| 88b6b791e9 | |||
| 48185174cf | |||
| aa8d903bb1 | |||
| cb653bedd6 | |||
| 534c88c96a | |||
| 7be9790839 | |||
| 14d7f27b6a | |||
| 97cefbace9 | |||
| 43cea80619 | |||
| ce7d91a7ca | |||
| 105ac57655 | |||
| 06f5305617 | |||
| 45c3f00539 | |||
| 0c0c2547db | |||
| 60d182b97e | |||
| 907b530068 | |||
| 8763768180 | |||
| 793cd76621 | |||
| 9b47b21918 | |||
| caa364e0ed | |||
| 76992dc3d9 | |||
| 0b8e0dc97d | |||
| 1408c38522 | |||
| cea968d259 | |||
| f91bca170a | |||
| 9d5c9191be | |||
| f4ce79a97c | |||
| 845b9edf85 | |||
| 5ec5ce8246 | |||
| 29935b0934 | |||
| fe12b55181 | |||
| 2cafc7ddeb | |||
| 2daf764760 | |||
| 078022bccf | |||
| 57778b6249 | |||
| 845f4b43ef | |||
| a485030423 | |||
| 6821093493 | |||
| 0dea2d6ad0 | |||
| 16e71fc5fc | |||
| b2795989b7 | |||
| dbfc20a5bc | |||
| 2aa301bf0b | |||
| 324aa12ecf | |||
| af5cf623be | |||
| 9556eff091 | |||
| ca42c88ce0 | |||
| 62cdc8bf13 | |||
| 643c254fab | |||
| 3f2ef1feee | |||
| 3c8e4ed15d | |||
| 8c06a6335d | |||
| f12cae3674 | |||
| 170281bfa6 | |||
| 5d4747458f | |||
| 5774e883d6 | |||
| 80b801c1ca | |||
| 9d8ee398c3 | |||
| 4d35d8d1ec | |||
| 977d117417 | |||
| cc8313db51 | |||
| 1e51f90130 | |||
| da6b89e739 | |||
| 90470440a7 | |||
| a5c9d79417 | |||
| c003ef2a7b | |||
| 42541fcab8 | |||
| 20b5952978 | |||
| 4b6aa1b5f9 | |||
| 9e141dcefd | |||
| b1b992eb3f | |||
| 2d061c911a | |||
| a213084188 | |||
| 1c7ec32b96 | |||
| dcd9cfbb2b | |||
| beb0692d28 | |||
| 140af2b741 | |||
| f8cc109f0b | |||
| b4a2f44d56 | |||
| 14d05d8012 | |||
| 71d5afeaf4 | |||
| 45df8bfb09 | |||
| 784058cf66 | |||
| ce367b1a91 | |||
| a832c19974 | |||
| 2c14109163 | |||
| c467e696e3 | |||
| 528c27a01a | |||
| c2f1e708fc | |||
| 211a4f4673 | |||
| fd81053d79 | |||
| 1bb9f260dd | |||
| 26f3cbd06f | |||
| e384f88931 | |||
| 59bce0036b | |||
| 0a48c923b8 | |||
| ed4782887f | |||
| 80b6b75934 | |||
| 245ce41550 | |||
| db5dca28b0 | |||
| 6dad239fe3 | |||
| aa4982a526 | |||
| 61808b37d8 | |||
| 4b90ee920c | |||
| 170e9d7ffd | |||
| d8f9ba29c3 | |||
| 4914b813e7 | |||
| c3fdec9bf0 | |||
| 1cbdf9b891 | |||
| 706dd7b2d9 | |||
| b2468a9095 | |||
| acfbbc58ac | |||
| fd506dfe08 | |||
| 1ee25e01ea | |||
| 521c385adb | |||
| 17971e87b4 | |||
| 4dc1d035d8 | |||
| 07eee8af25 | |||
| 06e7818240 | |||
| 00b0f3c940 | |||
| 17df2adbe0 | |||
| 40342745f7 | |||
| 54d4cdb2d5 | |||
| b251ea839c | |||
| 595cf863fc | |||
| 91d5b90ded | |||
| 33a7132920 | |||
| d9b23f14a2 | |||
| 06613b4fd5 | |||
| 7364bab8a7 | |||
| 1f48453989 | |||
| dc5efebee2 | |||
| 10c9499647 | |||
| a50082df92 | |||
| 0c33bbfb37 | |||
| ea1be413a6 | |||
| 850d4023fb | |||
| 4872b8e4e8 | |||
| 75eaefa950 | |||
| 582ade3190 | |||
| efd369bb0e | |||
| 784465bdcf | |||
| 40a80cd328 | |||
| 73f21b0524 | |||
| 34698479d0 | |||
| 0830633f42 | |||
| fc837e14fa | |||
| 0e288262b5 | |||
| dce049d6b8 | |||
| d103602d86 | |||
| aaf8f18a7d | |||
| de19cc3cd4 | |||
| 1e56703d4b | |||
| cd0f1c4bdf | |||
| 135b152497 | |||
| 56456c1e0c | |||
| d6a8d1dc33 | |||
| 04b3b6abcb | |||
| fd58ecf8a5 | |||
| a560e251a1 | |||
| 2ff0f9c0ff | |||
| 4dbd673eaa | |||
| 497810ab4e | |||
| 4cfed1db7e | |||
| fd6b7a2b7f | |||
| 6d865ad790 | |||
| dfe36aee4c | |||
| 2d704a859d | |||
| 8026d11f71 | |||
| 2f77cec863 | |||
| ba7954f068 | |||
| 8b5c951451 | |||
| 84e75b0f28 | |||
| c4e5db309f | |||
| 769f7b60c8 | |||
| b0578c5e9f | |||
| 40362bfb5b | |||
| 10eb9050a1 | |||
| b63e598085 | |||
| c60f9c9027 | |||
| 951c980bec | |||
| 5eaec085dd | |||
| 721b353776 | |||
| e6d2051c87 | |||
| e665794ac4 | |||
| 7db14a07c5 | |||
| c14554c1f3 | |||
| ced1682003 | |||
| 4701f27372 | |||
| a1699067b3 | |||
| 643fc0c456 | |||
| 09c07f6d21 | |||
| dd72c68ae6 | |||
| 9c1a3e77cc | |||
| ae957e9a73 | |||
| bc47a13ba4 | |||
| 20b69cb63d | |||
| ef4f8a2b86 | |||
| d00d341505 | |||
| 0738d3980f | |||
| 34ff4630bf | |||
| f8b5f602a4 | |||
| 8dacb57a86 | |||
| 9776d5d8a9 | |||
| f88c9a662d | |||
| 97bcb9740d | |||
| b6e9fa3434 | |||
| 32cfee705a | |||
| 1303bf0fef | |||
| 2417d4ee76 | |||
| 64280cbf3d | |||
| 54dd06056e | |||
| 0be4cbf8a4 | |||
| acf888c493 | |||
| f3d90d4e00 | |||
| ceec80a8ed | |||
| e876096072 | |||
| 796e4a40b6 | |||
| 5b7c4a4318 | |||
| f09d918b40 | |||
| f3d48b7160 | |||
| 58d306b552 | |||
| 30a947b42b | |||
| 9fe26c92a5 | |||
| ab0d16f4e1 | |||
| c37c39996d | |||
| 87a0cf0797 | |||
| 893a133f86 | |||
| fa9e3c09f1 | |||
| 2edf6bee34 | |||
| 468d293b46 | |||
| fd698d801b | |||
| 38a3833351 | |||
| 6c9ff2010b | |||
| 06f57e27ed | |||
| 06921bdbee | |||
| 3999e0b350 | |||
| 1301aca25b | |||
| bf4244809f | |||
| 99b5406905 | |||
| ebd01868ee | |||
| c451addd86 | |||
| 4c8ea084d7 | |||
| 02badb3c4c | |||
| 323307cbfa | |||
| 00560719bd | |||
| 56c96df47b | |||
| f0a8a35c12 | |||
| d566f48f94 | |||
| 3513cbb65e | |||
| 20f91cb7ab | |||
| 4becc07572 | |||
| a39c18737b | |||
| ed7b743fe2 | |||
| d3b0b3e0b1 | |||
| ba040769a7 | |||
| 0ced50e393 | |||
| f3abd6815a | |||
| 4572799750 | |||
| 696167509a | |||
| 2374df6d74 | |||
| ab06d6b640 | |||
| 60efab1cc6 | |||
| 71aebbb4d3 | |||
| c993f117a2 | |||
| b2f0c46388 | |||
| 2b095f863f | |||
| a141dff374 | |||
| b34bfda8b5 | |||
| c1046a20db | |||
| 24b93cca7e | |||
| 4f0fdb24f2 | |||
| 6d52b49b98 | |||
| 4b632313e2 | |||
| 22f3ecaec1 | |||
| 2a23bc99f6 | |||
| 8a1d7c7abd | |||
| ba712f308d | |||
| 9ace0328ad | |||
| 5c6f79799a | |||
| a84d015b1e | |||
| 2d90a28dbc | |||
| 3c77bab002 | |||
| 8f27725d6a | |||
| 729ded0c61 | |||
| 691a501b0d | |||
| e62fb2f0f4 | |||
| 603265dac2 | |||
| ed0bb4c106 | |||
| 6eae2b0e71 | |||
| c59771f744 | |||
| dd23d6f3f4 | |||
| 92dc012f08 | |||
| 9bcefde37a | |||
| d2f7a53927 | |||
| f1dd351854 | |||
| 5c63cb43e7 | |||
| 7f24f82002 | |||
| b0c7af789a | |||
| a426ea6dad | |||
| bda4226162 | |||
| dc1dc5c876 | |||
| 3ca682e25a | |||
| 9629ce5cb7 | |||
| c626d88f54 | |||
| c91ddf4a54 | |||
| 6f1286b5b9 | |||
| c96bc62d3b | |||
| 8432388b37 | |||
| 7efa83e61e | |||
| abe91a4bfa | |||
| 43173e6396 | |||
| 5cc888cd2c | |||
| 5b625fa709 | |||
| 0a8135b2de | |||
| d21175b4a3 | |||
| 68a538daed | |||
| d2c9ff50cd | |||
| 50539d6cbf | |||
| 8b5dfcfae1 | |||
| ccc60b5f07 | |||
| 7f94f42b1d | |||
| 1c1f259b39 | |||
| 6ef6c8ee5a | |||
| 581badfb73 | |||
| 8fce75daa4 | |||
| c1e2e56576 | |||
| e16ec69922 | |||
| 63256a142f | |||
| 4a9a8bd48e | |||
| b996abd5ce | |||
| 12461de3b0 | |||
| 7dab497b57 | |||
| 41dbba1c4c | |||
| d19f6c19a4 | |||
| b12b1a5a17 | |||
| 8022e2576d | |||
| f4ea264ba9 | |||
| 061acb27e4 | |||
| 8eb830d304 | |||
| 2fb93c6add | |||
| ad5c246629 | |||
| 58e73d0331 | |||
| 9ebeff621a | |||
| 69df271a16 | |||
| e285b2401d | |||
| 6e1e7e43bc | |||
| d04419a60c | |||
| fc1bf47e82 | |||
| 929df3f094 | |||
| 7272b243cb | |||
| 72d48d957a | |||
| f4069d484a | |||
| 1c82b0a6af | |||
| c08e69aa65 | |||
| 8097f08020 | |||
| 4cae291e6f | |||
| 82ad5508dc | |||
| fa8ddcfc79 | |||
| b560e32e18 | |||
| 67e1aee8a8 | |||
| 1d8385a9b4 | |||
| 340dec62a7 | |||
| db4585c02f | |||
| e792ca67ef | |||
| e5e53db6b8 | |||
| e14ee9d1fe | |||
| 360506ba4e | |||
| aa769e05c6 | |||
| 6b0bc7a96b | |||
| 93bdfdb6be | |||
| 6d95eada2b | |||
| e452ee8688 | |||
| 6e746f94cd | |||
| 9fd61e5d38 | |||
| 0c0fba4461 | |||
| 056e4c588a | |||
| 4b288643ac | |||
| cbdee74e5f | |||
| 743eb5a4a2 | |||
| 4e8e3a9ed9 | |||
| b9b91a0e68 | |||
| 9de7b66eef | |||
| a2ffa3455d | |||
| 60b97dbed0 | |||
| e56e4f5f35 | |||
| 5305ea83c8 | |||
| 14b3dd459b | |||
| 66fda2c33d | |||
| 77df43b9cb | |||
| 85f2b37c88 | |||
| e2d600fcc6 | |||
| 37eda0ad98 | |||
| 770be21e1c | |||
| 1b880d42f9 | |||
| 6387315c0b | |||
| 3d4b395bfe | |||
| 55950ed7d0 | |||
| f2b0341484 | |||
| b2d89c5d22 | |||
| 778b611f86 | |||
| ffaf91c251 | |||
| 326b42fafd | |||
| 94d4238af2 | |||
| 15e22fa1bd | |||
| bd8decddc5 | |||
| 2db1ebafe3 | |||
| 33bcf6f7b4 | |||
| f037f1acb2 | |||
| cdd9b32b27 | |||
| 7934125c09 | |||
| 6493d55977 | |||
| cafbb17e70 | |||
| 9ac73f7d2f | |||
| 08a6e8e069 | |||
| 644a934099 | |||
| 0eec445af0 | |||
| b8acc1b979 | |||
| 123eb057ae | |||
| 56d06456fb | |||
| a6efe05aa6 | |||
| a1d29b0c3a | |||
| 756603338b | |||
| 8b73e2ea8e | |||
| 2a0e952153 | |||
| 1065202349 | |||
| 307d38f6af | |||
| 8ac4fc0af5 | |||
| af89d03118 | |||
| d89daaaeac | |||
| f62b289cb5 | |||
| 5f9fa28251 | |||
| bd67b41f32 | |||
| 00619c8dab | |||
| 58e26c3e9d | |||
| eddbc3c3e0 | |||
| 2cc73de15c | |||
| 9762f2d22b | |||
| 8c9aa188c3 | |||
| 2f151c0943 | |||
| 9498456c4a | |||
| 860607bce2 | |||
| 94f59511f0 | |||
| b07ce8d8ca | |||
| 6fc4e75d89 | |||
| fb894a8e2c | |||
| 86352430d4 | |||
| e5f20d05f6 | |||
| b610f08a9c | |||
| 8bbd2d97d5 | |||
| 972f665d88 | |||
| a9a497fa77 | |||
| 14a170c9a3 | |||
| d4080b6c6f | |||
| 20f1fb2cfd | |||
| 35c3216287 | |||
| 628f629c49 | |||
| 33d3059dc8 | |||
| f5cf7917fb | |||
| b39508de7f | |||
| c69a92f901 | |||
| aba1fdeb04 | |||
| 02c76a4fb6 | |||
| 2ff6ec03aa | |||
| 80a0b38295 | |||
| e0e935c2ae | |||
| 31cf106728 | |||
| 502e34a96d | |||
| 29ab747e5b | |||
| b897ec5d9a | |||
| 440878cb9f | |||
| 1935473bd1 | |||
| de6cadf8e4 | |||
| d509497bb8 | |||
| d7949f70b1 | |||
| 0912b7d104 | |||
| 29ff997a3f | |||
| f21bd0c63c | |||
| 41693b1008 | |||
| d000345043 | |||
| f986da9ae2 | |||
| c6e729b237 | |||
| 12a800db97 | |||
| 5e84656707 | |||
| e87965cd2f | |||
| 4585cc4656 | |||
| c0a08d3353 | |||
| 77474c9f76 | |||
| 15b2ee2d82 | |||
| 709279d6cf | |||
| 35d676406c | |||
| 9aff90b466 | |||
| bc463930aa | |||
| 6fe9471077 | |||
| 884213f7ac | |||
| 80bf409615 | |||
| 3fe46ffb82 | |||
| 42c52014ee | |||
| 8aabc8b743 | |||
| 5df9b5d109 | |||
| 50616896c8 | |||
| eb1cf7c15a | |||
| b878c313f8 | |||
| 869e2cd8f9 | |||
| 8a996b415e | |||
| 62d2de904b | |||
| a02be13dd1 | |||
| c6058a4ea9 | |||
| 27ffe77243 | |||
| 3eb969cdaf | |||
| 73040bb156 | |||
| c2bda9388f | |||
| 6cd0de7a0b | |||
| 85d319568c | |||
| b3fd5c5dc1 | |||
| 202b7224fb | |||
| 647ee11917 | |||
| 63fbf2857c | |||
| 9c8636081c | |||
| 578d6d6db8 | |||
| 9ab9aef32b | |||
| d4a72df111 | |||
| ead91ae4f7 | |||
| 49385b6e57 | |||
| 499f9824ab | |||
| 2be5f1221a | |||
| fef64e8849 | |||
| 675a8e52b6 | |||
| d9a24b4105 | |||
| 594e613fcb | |||
| 7b7a6dd154 | |||
| dcf78a76e5 | |||
| fc42f6e20e | |||
| 45b93f3a45 | |||
| 1476cd2149 | |||
| 4ec6e5fa9f | |||
| 9d8398628c | |||
| fe98c9d972 | |||
| 720c2fad86 | |||
| 7b057491af | |||
| 8e7b694076 | |||
| e8395eea56 | |||
| 6e619eba1a | |||
| f8bd218e67 | |||
| 207a6faf33 | |||
| 991e3534a6 | |||
| ebb22dfa3f | |||
| 9bd65e0c1d | |||
| 5b337b6015 | |||
| 4189803693 | |||
| 1175b171ba | |||
| bea643c967 | |||
| addc813956 | |||
| 0f1721d2c4 | |||
| abdc8d9449 | |||
| 9e9136cffd | |||
| c802069a11 | |||
| 4e5caf4087 | |||
| de63ee7321 | |||
| d6688b935d | |||
| 21e08ca55e | |||
| c4f53549b1 | |||
| 08645997f8 | |||
| e42a545ebc | |||
| 8324c04a41 | |||
| 166847ba92 | |||
| 1904f01cf4 | |||
| 4ae1ad053d | |||
| 7d9946b007 | |||
| 86462f4cee | |||
| 669182c133 | |||
| f81bb51f4a | |||
| d4ff423add | |||
| b14ff9b647 | |||
| 277c5f9e00 | |||
| f016e5a4dc | |||
| fc3912b4fe | |||
| c01a764e1f | |||
| 4ecb40e03b | |||
| be9c300cb3 | |||
| 839c720f60 | |||
| 127bec2f14 | |||
| 15879c82f6 | |||
| 9d188840c1 | |||
| 35a28f4efe | |||
| 78ea379e0f | |||
| 007cbe600b | |||
| d1a8e276b5 | |||
| eb2f5b5f45 | |||
| a623cef95d | |||
| f00b45a28e | |||
| 422faaa29c | |||
| 16a9e3f9c9 | |||
| 7c5869bc29 | |||
| feb3dd4d73 | |||
| b4204ca2ba | |||
| 89a67e6952 | |||
| 34199b151c | |||
| c6962f575e | |||
| 9c8662b25e | |||
| fedb62df66 | |||
| 44c19c1743 | |||
| 56aa481226 | |||
| 9184317549 | |||
| a3048ae120 | |||
| fc44d74f2b | |||
| 1779cfad30 | |||
| 4856be4ef1 | |||
| 033043bdc0 | |||
| 46284938ce | |||
| 09378553b9 | |||
| 6b85884cdf | |||
| 1b14a8210c | |||
| 182fe850db | |||
| 62b081e9fb | |||
| e3e7449d74 | |||
| 669f1978a3 | |||
| 57c4b1a2b2 | |||
| ac7385391e | |||
| 50a52d79ec | |||
| d77a1c8cd6 | |||
| 395b9480c5 | |||
| 4470c73e48 | |||
| 9812630ef2 | |||
| 818520452e | |||
| f0cc49c7e3 | |||
| cc30a90556 | |||
| e12dd237c2 | |||
| 19e7fca627 | |||
| a0e1742861 | |||
| a93b142dcd | |||
| fc2d511d78 | |||
| 5207104c06 | |||
| 06147836d0 | |||
| 46eb30a897 | |||
| 840617a0c3 | |||
| f7ae5eaae5 | |||
| 827a838715 | |||
| db5c60e19f | |||
| 256c2d7e50 | |||
| 07c8cd3d5d | |||
| 8979384847 | |||
| 2a134b864a | |||
| 765770d2c7 | |||
| ba58892011 | |||
| 63f40dd8a4 | |||
| 30443ed31d | |||
| a8432a3caa | |||
| 53546a8d92 | |||
| 97f20a1cb5 | |||
| 2816f93831 | |||
| 8624ae1c4a | |||
| ebcec6e79d | |||
| faa9a3e714 | |||
| 69007b5098 | |||
| ee44aebcc4 | |||
| 667d32a3e7 | |||
| 9a087fc6c9 | |||
| 3ad029efe0 | |||
| 92c27ea7d8 | |||
| 7b850e2e0e | |||
| c48398871c | |||
| 8629a29eaa | |||
| df69ce1991 | |||
| c56e672600 | |||
| 677feecada | |||
| 5d6c91f7e9 | |||
| cde3ca15c2 | |||
| fa6f6822a1 | |||
| ce33a27c57 | |||
| 4d47749e7c | |||
| 42090daf24 | |||
| 36cd8ca3b2 | |||
| 9ec2d685e3 | |||
| 46d31003e2 | |||
| ef9f9ae428 | |||
| e5bcc5f682 | |||
| 4961e0d1a5 | |||
| 6a20fa27b3 | |||
| 01af779f2a | |||
| feb332140a | |||
| a85a0f19da | |||
| 611292281c | |||
| 14e9fc4d43 | |||
| 8bc74333b8 | |||
| 28797184e4 | |||
| 08238664cd | |||
| 187affb844 | |||
| 5a82874624 | |||
| 200cd9caf2 | |||
| f8b3dca6f5 | |||
| f973a6f3a6 | |||
| 9b3bbb7285 | |||
| 284f911785 | |||
| a17e490851 | |||
| c1e670be23 | |||
| 918d52c2e6 | |||
| 1c7080ca68 | |||
| 656c549113 | |||
| 41b4c6650b | |||
| 925fdd633a | |||
| c16b125a55 | |||
| 591b246ed6 | |||
| 07b8567beb | |||
| f0e68527ba | |||
| 6514b6f4c3 | |||
| d551f2f4ae | |||
| acb07c9792 | |||
| da3eedb443 |
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
* text=auto eol=lf
|
* text=auto eol=lf
|
||||||
binaries/win64/readme.txt eol=crlf
|
|
||||||
binaries/win32/readme.txt eol=crlf
|
|
||||||
*.cmd eol=crlf
|
*.cmd eol=crlf
|
||||||
*.bat eol=crlf
|
*.bat eol=crlf
|
||||||
|
init.d/windivert.filter.examples/** eol=crlf
|
||||||
|
files/** binary
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
name: bugs
|
||||||
|
about: do not write lame questions
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Issues - это место для обращений к разработчику.
|
||||||
|
Discussions - место для обсуждения вопросов между пользователями.
|
||||||
|
Не тратье время разработчика на ерунду. Вам не будут здесь обьяснять как скопировать, что "писать в", почему сразу же закрывается окно, почему не открывается сайт или госуслуги. Здесь не место обсуждению любых шаманств , т.е. манипуляций без понимания, в стиле 4pda.
|
||||||
|
Пишите только конкретные проблемы на техническом уровне в оригинальном zapret (не в сборках), которые вы заметили, и которые являются или могут являться багами в софте.
|
||||||
|
Или если вы считаете, что ваше обращение обосновано, технически грамотно и по адресу.
|
||||||
|
Все, что будет нарушать эти критерии, может быть молча удалено, закрыто или перенесено в дискуссии на усмотрение разработчика.
|
||||||
|
Если сомневаетесь - пишите лучше сразу в дискуссии.
|
||||||
|
|
||||||
|
Прочитайте для начала docs/quick_start.md или docs/quick_start_windows.md.
|
||||||
|
Там обьясняется для кого этот софт, какие требуются знания, почему это не простая волшебная таблетка.
|
||||||
|
|
||||||
|
Вирусов здесь нет. У вас либо чья-то сборка, либо ваш антивирус давно пора отправить на покой. Антивирусы в основном жалуются на upx и windivert, которые убраны НЕ будут. upx - это паковщик для сокращения требуемого места на openwrt, windivert - замена iptables для windows, потенциальный инструмент хакера или компонент зловредной программы, но сам по себе вирусом не является. Не согласны - удаляйте софт. За агрессивные наезды "почему автор распространяет вирусы" молча схватите бан.
|
||||||
|
|
||||||
|
|
||||||
|
Here is the place for bugs only. All questions, especially user-like questions (non-technical) go to Discussions.
|
||||||
|
There're also no viruses here. All virus claims and everyting non-technical and non-bugs will be instantly deleted, closed or moved to Discussions.
|
||||||
+142
-34
@@ -52,6 +52,13 @@ jobs:
|
|||||||
tool: i586-unknown-linux-musl
|
tool: i586-unknown-linux-musl
|
||||||
- arch: x86_64
|
- arch: x86_64
|
||||||
tool: x86_64-unknown-linux-musl
|
tool: x86_64-unknown-linux-musl
|
||||||
|
- arch: lexra
|
||||||
|
tool: mips-linux
|
||||||
|
dir: rsdk-4.6.4-5281-EB-3.10-0.9.33-m32ub-20141001
|
||||||
|
env:
|
||||||
|
CFLAGS: '-march=5281'
|
||||||
|
LDFLAGS: '-lgcc_eh'
|
||||||
|
repo: 'bol-van/build'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -60,18 +67,31 @@ jobs:
|
|||||||
|
|
||||||
- name: Set up build tools
|
- name: Set up build tools
|
||||||
env:
|
env:
|
||||||
REPO: 'spvkgn/musl-cross'
|
ARCH: ${{ matrix.arch }}
|
||||||
TOOL: ${{ matrix.tool }}
|
TOOL: ${{ matrix.tool }}
|
||||||
|
REPO: ${{ matrix.arch == 'lexra' && matrix.repo || 'spvkgn/musl-cross' }}
|
||||||
|
DIR: ${{ matrix.arch == 'lexra' && matrix.dir || matrix.tool }}
|
||||||
run: |
|
run: |
|
||||||
sudo apt update -qq && sudo apt install -y libcap-dev
|
if [[ "$ARCH" == lexra ]]; then
|
||||||
|
sudo dpkg --add-architecture i386
|
||||||
|
sudo apt update -qq
|
||||||
|
sudo apt install -y libcap-dev libc6:i386 zlib1g:i386
|
||||||
|
URL=https://github.com/$REPO/raw/refs/heads/master/$DIR.txz
|
||||||
|
else
|
||||||
|
sudo apt update -qq
|
||||||
|
sudo apt install -y libcap-dev
|
||||||
|
URL=https://github.com/$REPO/releases/download/latest/$TOOL.tar.xz
|
||||||
|
fi
|
||||||
mkdir -p $HOME/tools
|
mkdir -p $HOME/tools
|
||||||
wget -qO- https://github.com/$REPO/releases/download/latest/$TOOL.tar.xz | tar -C $HOME/tools -xJ || exit 1
|
wget -qO- $URL | tar -C $HOME/tools -xJ || exit 1
|
||||||
[ -d "$HOME/tools/$TOOL/bin" ] && echo "$HOME/tools/$TOOL/bin" >> $GITHUB_PATH
|
[[ -d "$HOME/tools/$DIR/bin" ]] && echo "$HOME/tools/$DIR/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
env:
|
env:
|
||||||
ARCH: ${{ matrix.arch }}
|
ARCH: ${{ matrix.arch }}
|
||||||
TARGET: ${{ matrix.tool }}
|
TARGET: ${{ matrix.tool }}
|
||||||
|
CFLAGS: ${{ matrix.env.CFLAGS != '' && matrix.env.CFLAGS || null }}
|
||||||
|
LDFLAGS: ${{ matrix.env.LDFLAGS != '' && matrix.env.LDFLAGS || null }}
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
DEPS_DIR=$GITHUB_WORKSPACE/deps
|
DEPS_DIR=$GITHUB_WORKSPACE/deps
|
||||||
@@ -81,21 +101,18 @@ jobs:
|
|||||||
export NM=$TARGET-nm
|
export NM=$TARGET-nm
|
||||||
export STRIP=$TARGET-strip
|
export STRIP=$TARGET-strip
|
||||||
export PKG_CONFIG_PATH=$DEPS_DIR/lib/pkgconfig
|
export PKG_CONFIG_PATH=$DEPS_DIR/lib/pkgconfig
|
||||||
|
export STAGING_DIR=$RUNNER_TEMP
|
||||||
# optimize for size
|
|
||||||
export CFLAGS="-Os -flto=auto"
|
|
||||||
export LDFLAGS="-Os"
|
|
||||||
|
|
||||||
# netfilter libs
|
# netfilter libs
|
||||||
git clone --depth 1 -b libmnl-1.0.5 git://git.netfilter.org/libmnl
|
wget -qO- https://www.netfilter.org/pub/libnfnetlink/libnfnetlink-1.0.2.tar.bz2 | tar -xj
|
||||||
git clone --depth 1 -b libnfnetlink-1.0.2 git://git.netfilter.org/libnfnetlink
|
wget -qO- https://www.netfilter.org/pub/libmnl/libmnl-1.0.5.tar.bz2 | tar -xj
|
||||||
git clone --depth 1 -b libnetfilter_queue-1.0.5 git://git.netfilter.org/libnetfilter_queue
|
wget -qO- https://www.netfilter.org/pub/libnetfilter_queue/libnetfilter_queue-1.0.5.tar.bz2 | tar -xj
|
||||||
|
|
||||||
for i in libmnl libnfnetlink libnetfilter_queue ; do
|
for i in libmnl libnfnetlink libnetfilter_queue ; do
|
||||||
(
|
(
|
||||||
cd $i
|
cd $i-*
|
||||||
./autogen.sh && \
|
CFLAGS="-Os -flto=auto $CFLAGS" \
|
||||||
./configure --prefix= --host=$TARGET --enable-static --disable-shared && \
|
./configure --prefix= --host=$TARGET --enable-static --disable-shared --disable-dependency-tracking
|
||||||
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
||||||
)
|
)
|
||||||
sed -i "s|^prefix=.*|prefix=$DEPS_DIR|g" $DEPS_DIR/lib/pkgconfig/$i.pc
|
sed -i "s|^prefix=.*|prefix=$DEPS_DIR|g" $DEPS_DIR/lib/pkgconfig/$i.pc
|
||||||
@@ -106,7 +123,8 @@ jobs:
|
|||||||
xargs -I{} wget -qO- https://github.com/madler/zlib/archive/refs/tags/{}.tar.gz | tar -xz
|
xargs -I{} wget -qO- https://github.com/madler/zlib/archive/refs/tags/{}.tar.gz | tar -xz
|
||||||
(
|
(
|
||||||
cd zlib-*
|
cd zlib-*
|
||||||
./configure --prefix= --static && \
|
CFLAGS="-Os -flto=auto $CFLAGS" \
|
||||||
|
./configure --prefix= --static
|
||||||
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -116,8 +134,8 @@ jobs:
|
|||||||
install -Dm644 -t $DEPS_DIR/include/sys /usr/include/x86_64-linux-gnu/sys/queue.h /usr/include/sys/capability.h
|
install -Dm644 -t $DEPS_DIR/include/sys /usr/include/x86_64-linux-gnu/sys/queue.h /usr/include/sys/capability.h
|
||||||
|
|
||||||
# zapret
|
# zapret
|
||||||
CFLAGS="$CFLAGS -static-libgcc -static -I$DEPS_DIR/include" \
|
CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }} -static-libgcc -static -I$DEPS_DIR/include $CFLAGS" \
|
||||||
LDFLAGS="$LDFLAGS -L$DEPS_DIR/lib" \
|
LDFLAGS="-L$DEPS_DIR/lib $LDFLAGS" \
|
||||||
make -C zapret -j$(nproc)
|
make -C zapret -j$(nproc)
|
||||||
tar -C zapret/binaries/my -cJf zapret-linux-$ARCH.tar.xz .
|
tar -C zapret/binaries/my -cJf zapret-linux-$ARCH.tar.xz .
|
||||||
|
|
||||||
@@ -137,6 +155,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build zapret
|
- name: Build zapret
|
||||||
run: |
|
run: |
|
||||||
|
export CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }}"
|
||||||
make mac -j$(sysctl -n hw.logicalcpu)
|
make mac -j$(sysctl -n hw.logicalcpu)
|
||||||
tar -C binaries/my -cJf zapret-mac-x64.tar.xz .
|
tar -C binaries/my -cJf zapret-mac-x64.tar.xz .
|
||||||
|
|
||||||
@@ -171,7 +190,8 @@ jobs:
|
|||||||
TARGET: ${{ matrix.target }}
|
TARGET: ${{ matrix.target }}
|
||||||
ARCH: ${{ matrix.arch }}
|
ARCH: ${{ matrix.arch }}
|
||||||
run: |
|
run: |
|
||||||
settarget $TARGET-freebsd11 make bsd -j$(nproc) || exit 1
|
export CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }}"
|
||||||
|
settarget $TARGET-freebsd11 make bsd -j$(nproc)
|
||||||
tar -C binaries/my -cJf zapret-freebsd-$ARCH.tar.xz .
|
tar -C binaries/my -cJf zapret-freebsd-$ARCH.tar.xz .
|
||||||
|
|
||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
@@ -204,6 +224,7 @@ jobs:
|
|||||||
- name: Build ip2net, mdig
|
- name: Build ip2net, mdig
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
run: |
|
run: |
|
||||||
|
export CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }}"
|
||||||
mkdir -p output
|
mkdir -p output
|
||||||
cd zapret
|
cd zapret
|
||||||
mingw32-make -C ip2net win
|
mingw32-make -C ip2net win
|
||||||
@@ -260,6 +281,7 @@ jobs:
|
|||||||
shell: C:\cygwin\bin\bash.exe -eo pipefail '{0}'
|
shell: C:\cygwin\bin\bash.exe -eo pipefail '{0}'
|
||||||
run: >-
|
run: >-
|
||||||
export MAKEFLAGS=-j$(nproc) &&
|
export MAKEFLAGS=-j$(nproc) &&
|
||||||
|
export CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }}" &&
|
||||||
cd zapret &&
|
cd zapret &&
|
||||||
make -C nfq ${TARGET} &&
|
make -C nfq ${TARGET} &&
|
||||||
cp -a nfq/winws.exe ../output
|
cp -a nfq/winws.exe ../output
|
||||||
@@ -282,9 +304,81 @@ jobs:
|
|||||||
path: zapret-*.zip
|
path: zapret-*.zip
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
|
build-android:
|
||||||
|
name: Android ${{ matrix.abi }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- abi: armeabi-v7a
|
||||||
|
target: armv7a-linux-androideabi
|
||||||
|
- abi: arm64-v8a
|
||||||
|
target: aarch64-linux-android
|
||||||
|
- abi: x86
|
||||||
|
target: i686-linux-android
|
||||||
|
- abi: x86_64
|
||||||
|
target: x86_64-linux-android
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: zapret
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
env:
|
||||||
|
ABI: ${{ matrix.abi }}
|
||||||
|
API: 21
|
||||||
|
TARGET: ${{ matrix.target }}
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
DEPS_DIR=$GITHUB_WORKSPACE/deps
|
||||||
|
export TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64
|
||||||
|
export CC="$TOOLCHAIN/bin/clang --target=$TARGET$API"
|
||||||
|
export AR=$TOOLCHAIN/bin/llvm-ar
|
||||||
|
export AS=$CC
|
||||||
|
export LD=$TOOLCHAIN/bin/ld
|
||||||
|
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
|
||||||
|
export STRIP=$TOOLCHAIN/bin/llvm-strip
|
||||||
|
export PKG_CONFIG_PATH=$DEPS_DIR/lib/pkgconfig
|
||||||
|
|
||||||
|
# netfilter libs
|
||||||
|
wget -qO- https://www.netfilter.org/pub/libnfnetlink/libnfnetlink-1.0.2.tar.bz2 | tar -xj
|
||||||
|
wget -qO- https://www.netfilter.org/pub/libmnl/libmnl-1.0.5.tar.bz2 | tar -xj
|
||||||
|
wget -qO- https://www.netfilter.org/pub/libnetfilter_queue/libnetfilter_queue-1.0.5.tar.bz2 | tar -xj
|
||||||
|
patch -p1 -d libnetfilter_queue-* -i ../zapret/.github/workflows/libnetfilter_queue-android.patch
|
||||||
|
|
||||||
|
for i in libmnl libnfnetlink libnetfilter_queue ; do
|
||||||
|
(
|
||||||
|
cd $i-*
|
||||||
|
CFLAGS="-Os -flto=auto -Wno-implicit-function-declaration" \
|
||||||
|
./configure --prefix= --host=$TARGET --enable-static --disable-shared --disable-dependency-tracking
|
||||||
|
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
||||||
|
)
|
||||||
|
sed -i "s|^prefix=.*|prefix=$DEPS_DIR|g" $DEPS_DIR/lib/pkgconfig/$i.pc
|
||||||
|
done
|
||||||
|
|
||||||
|
# zapret
|
||||||
|
CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }} -I$DEPS_DIR/include" \
|
||||||
|
LDFLAGS="-L$DEPS_DIR/lib" \
|
||||||
|
make -C zapret android -j$(nproc)
|
||||||
|
|
||||||
|
# strip unwanted ELF sections to prevent warnings on old Android versions
|
||||||
|
gh api repos/termux/termux-elf-cleaner/releases/latest --jq '.tag_name' |\
|
||||||
|
xargs -I{} wget -O elf-cleaner https://github.com/termux/termux-elf-cleaner/releases/download/{}/termux-elf-cleaner
|
||||||
|
chmod +x elf-cleaner
|
||||||
|
./elf-cleaner --api-level $API zapret/binaries/my/*
|
||||||
|
zip zapret-android-$ABI.zip -j zapret/binaries/my/*
|
||||||
|
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: zapret-android-${{ matrix.abi }}
|
||||||
|
path: zapret-*.zip
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
release:
|
release:
|
||||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
|
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
|
||||||
needs: [ build-linux, build-windows, build-macos, build-freebsd ]
|
needs: [ build-linux, build-windows, build-macos, build-freebsd, build-android ]
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -307,6 +401,7 @@ jobs:
|
|||||||
uses: crazy-max/ghaction-upx@v3
|
uses: crazy-max/ghaction-upx@v3
|
||||||
with:
|
with:
|
||||||
install-only: true
|
install-only: true
|
||||||
|
version: v4.2.4
|
||||||
|
|
||||||
- name: Prepare binaries
|
- name: Prepare binaries
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -324,7 +419,7 @@ jobs:
|
|||||||
if [[ $dir == *-linux-x86_64 ]]; then
|
if [[ $dir == *-linux-x86_64 ]]; then
|
||||||
tar -C $dir -czvf $dir/tpws_wsl.tgz tpws
|
tar -C $dir -czvf $dir/tpws_wsl.tgz tpws
|
||||||
run_upx $dir/*
|
run_upx $dir/*
|
||||||
elif [[ $dir =~ linux ]] && [[ $dir != *-linux-mips64 ]]; then
|
elif [[ $dir =~ linux ]] && [[ $dir != *-linux-mips64 ]] && [[ $dir != *-linux-lexra ]]; then
|
||||||
run_upx $dir/*
|
run_upx $dir/*
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
@@ -332,7 +427,6 @@ jobs:
|
|||||||
unzip $f -d $dir && rm $f
|
unzip $f -d $dir && rm $f
|
||||||
if [[ $dir =~ win ]]; then
|
if [[ $dir =~ win ]]; then
|
||||||
chmod -x $dir/*
|
chmod -x $dir/*
|
||||||
run_upx --force $dir/cygwin1.dll
|
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -343,18 +437,23 @@ jobs:
|
|||||||
if [ -d $dir ]; then
|
if [ -d $dir ]; then
|
||||||
echo "Processing $dir"
|
echo "Processing $dir"
|
||||||
case $dir in
|
case $dir in
|
||||||
*-freebsd-x86_64 ) run_dir freebsd-x64 ;;
|
*-android-arm64-v8a ) run_dir android-arm64 ;;
|
||||||
*-linux-arm ) run_dir arm ;;
|
*-android-armeabi-v7a ) run_dir android-arm ;;
|
||||||
*-linux-arm64 ) run_dir aarch64 ;;
|
*-android-x86 ) run_dir android-x86 ;;
|
||||||
*-linux-mips64 ) run_dir mips64r2-msb ;;
|
*-android-x86_64 ) run_dir android-x86_64 ;;
|
||||||
*-linux-mipselsf ) run_dir mips32r1-lsb ;;
|
*-freebsd-x86_64 ) run_dir freebsd-x86_64 ;;
|
||||||
*-linux-mipssf ) run_dir mips32r1-msb ;;
|
*-linux-arm ) run_dir linux-arm ;;
|
||||||
*-linux-ppc ) run_dir ppc ;;
|
*-linux-arm64 ) run_dir linux-arm64 ;;
|
||||||
*-linux-x86 ) run_dir x86 ;;
|
*-linux-mips64 ) run_dir linux-mips64 ;;
|
||||||
*-linux-x86_64 ) run_dir x86_64 ;;
|
*-linux-mipselsf ) run_dir linux-mipsel ;;
|
||||||
*-mac-x64 ) run_dir mac64 ;;
|
*-linux-mipssf ) run_dir linux-mips ;;
|
||||||
*-win-x86 ) run_dir win32 ;;
|
*-linux-ppc ) run_dir linux-ppc ;;
|
||||||
*-win-x86_64 ) run_dir win64 ;;
|
*-linux-x86 ) run_dir linux-x86 ;;
|
||||||
|
*-linux-x86_64 ) run_dir linux-x86_64 ;;
|
||||||
|
*-linux-lexra ) run_dir linux-lexra ;;
|
||||||
|
*-mac-x64 ) run_dir mac64 ;;
|
||||||
|
*-win-x86 ) run_dir windows-x86 ;;
|
||||||
|
*-win-x86_64 ) run_dir windows-x86_64 ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -363,8 +462,16 @@ jobs:
|
|||||||
- name: Create release bundles
|
- name: Create release bundles
|
||||||
run: |
|
run: |
|
||||||
rm -rf ${{ env.repo_dir }}/.git*
|
rm -rf ${{ env.repo_dir }}/.git*
|
||||||
tar -czf ${{ env.repo_dir }}.tar.gz ${{ env.repo_dir }}
|
find ${{ env.repo_dir }}/binaries -type f -exec sha256sum {} \; >sha256sum.txt
|
||||||
|
tar --owner=0 --group=0 -czf ${{ env.repo_dir }}.tar.gz ${{ env.repo_dir }}
|
||||||
zip -qr ${{ env.repo_dir }}.zip ${{ env.repo_dir }}
|
zip -qr ${{ env.repo_dir }}.zip ${{ env.repo_dir }}
|
||||||
|
(
|
||||||
|
cd ${{ env.repo_dir }}
|
||||||
|
rm -rf binaries/{android*,freebsd*,mac*,win*,x86_64/tpws_wsl.tgz} \
|
||||||
|
init.d/{openrc,macos,pfsense,runit,s6,systemd,windivert.filter.examples} \
|
||||||
|
tpws nfq ip2net mdig docs files/huawei Makefile
|
||||||
|
)
|
||||||
|
tar --owner=0 --group=0 -czf ${{ env.repo_dir }}-openwrt-embedded.tar.gz ${{ env.repo_dir }}
|
||||||
|
|
||||||
- name: Upload release assets
|
- name: Upload release assets
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
@@ -377,3 +484,4 @@ jobs:
|
|||||||
files: |
|
files: |
|
||||||
zapret*.tar.gz
|
zapret*.tar.gz
|
||||||
zapret*.zip
|
zapret*.zip
|
||||||
|
sha256sum.txt
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
--- a/src/extra/pktbuff.c
|
||||||
|
+++ b/src/extra/pktbuff.c
|
||||||
|
@@ -14,7 +14,7 @@
|
||||||
|
#include <string.h> /* for memcpy */
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
-#include <netinet/if_ether.h>
|
||||||
|
+#include <linux/if_ether.h>
|
||||||
|
#include <netinet/ip.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
|
||||||
|
--- a/src/nlmsg.c
|
||||||
|
+++ b/src/nlmsg.c
|
||||||
|
@@ -21,7 +21,7 @@
|
||||||
|
|
||||||
|
#include <linux/netfilter/nfnetlink_queue.h>
|
||||||
|
|
||||||
|
-#include <libnetfilter_queue/libnetfilter_queue.h>
|
||||||
|
+// #include <libnetfilter_queue/libnetfilter_queue.h>
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
--- a/src/extra/tcp.c
|
||||||
|
+++ b/src/extra/tcp.c
|
||||||
|
@@ -139,12 +139,16 @@ void nfq_tcp_compute_checksum_ipv6(struc
|
||||||
|
* (union is compatible to any of its members)
|
||||||
|
* This means this part of the code is -fstrict-aliasing safe now.
|
||||||
|
*/
|
||||||
|
+#ifndef __ANDROID__
|
||||||
|
union tcp_word_hdr {
|
||||||
|
struct tcphdr hdr;
|
||||||
|
uint32_t words[5];
|
||||||
|
};
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
+#ifndef tcp_flag_word
|
||||||
|
#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words[3])
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nfq_pkt_snprintf_tcp_hdr - print tcp header into one buffer in a humnan
|
||||||
+3
-1
@@ -1,10 +1,12 @@
|
|||||||
/config
|
/config
|
||||||
ip2net/ip2net
|
ip2net/ip2net
|
||||||
mdig/mdig
|
mdig/mdig
|
||||||
|
nfq/dvtws
|
||||||
nfq/nfqws
|
nfq/nfqws
|
||||||
|
nfq/winws.exe
|
||||||
|
nfq/WinDivert*
|
||||||
tpws/tpws
|
tpws/tpws
|
||||||
binaries/my/
|
binaries/my/
|
||||||
init.d/**/custom
|
|
||||||
ipset/zapret-ip*.txt
|
ipset/zapret-ip*.txt
|
||||||
ipset/zapret-ip*.gz
|
ipset/zapret-ip*.gz
|
||||||
ipset/zapret-hosts*.txt
|
ipset/zapret-hosts*.txt
|
||||||
|
|||||||
@@ -15,6 +15,32 @@ all: clean
|
|||||||
done \
|
done \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
systemd: clean
|
||||||
|
@mkdir -p "$(TGT)"; \
|
||||||
|
for dir in $(DIRS); do \
|
||||||
|
find "$$dir" -type f \( -name "*.c" -o -name "*.h" -o -name "*akefile" \) -exec chmod -x {} \; ; \
|
||||||
|
$(MAKE) -C "$$dir" systemd || exit; \
|
||||||
|
for exe in "$$dir/"*; do \
|
||||||
|
if [ -f "$$exe" ] && [ -x "$$exe" ]; then \
|
||||||
|
mv -f "$$exe" "${TGT}" ; \
|
||||||
|
ln -fs "../${TGT}/$$(basename "$$exe")" "$$exe" ; \
|
||||||
|
fi \
|
||||||
|
done \
|
||||||
|
done
|
||||||
|
|
||||||
|
android: clean
|
||||||
|
@mkdir -p "$(TGT)"; \
|
||||||
|
for dir in $(DIRS); do \
|
||||||
|
find "$$dir" -type f \( -name "*.c" -o -name "*.h" -o -name "*akefile" \) -exec chmod -x {} \; ; \
|
||||||
|
$(MAKE) -C "$$dir" android || exit; \
|
||||||
|
for exe in "$$dir/"*; do \
|
||||||
|
if [ -f "$$exe" ] && [ -x "$$exe" ]; then \
|
||||||
|
mv -f "$$exe" "${TGT}" ; \
|
||||||
|
ln -fs "../${TGT}/$$(basename "$$exe")" "$$exe" ; \
|
||||||
|
fi \
|
||||||
|
done \
|
||||||
|
done
|
||||||
|
|
||||||
bsd: clean
|
bsd: clean
|
||||||
@mkdir -p "$(TGT)"; \
|
@mkdir -p "$(TGT)"; \
|
||||||
for dir in $(DIRS); do \
|
for dir in $(DIRS); do \
|
||||||
|
|||||||
+667
-315
File diff suppressed because it is too large
Load Diff
+60
-19
@@ -4,6 +4,10 @@ which()
|
|||||||
# 'command -v' replacement does not work exactly the same way. it outputs shell aliases if present
|
# 'command -v' replacement does not work exactly the same way. it outputs shell aliases if present
|
||||||
# $1 - executable name
|
# $1 - executable name
|
||||||
local IFS=:
|
local IFS=:
|
||||||
|
[ "$1" != "${1#/}" ] && [ -x "$1" ] && {
|
||||||
|
echo "$1"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
for p in $PATH; do
|
for p in $PATH; do
|
||||||
[ -x "$p/$1" ] && {
|
[ -x "$p/$1" ] && {
|
||||||
echo "$p/$1"
|
echo "$p/$1"
|
||||||
@@ -60,11 +64,22 @@ starts_with()
|
|||||||
esac
|
esac
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
extract_arg()
|
||||||
|
{
|
||||||
|
# $1 - arg number
|
||||||
|
# $2,$3,... - args
|
||||||
|
local n=$1
|
||||||
|
while [ -n "$1" ]; do
|
||||||
|
shift
|
||||||
|
[ $n -eq 1 ] && { echo "$1"; return 0; }
|
||||||
|
n=$(($n-1))
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
find_str_in_list()
|
find_str_in_list()
|
||||||
{
|
{
|
||||||
# $1 - string
|
# $1 - string
|
||||||
# $2 - space separated values
|
# $2 - space separated values
|
||||||
|
|
||||||
local v
|
local v
|
||||||
[ -n "$1" ] && {
|
[ -n "$1" ] && {
|
||||||
for v in $2; do
|
for v in $2; do
|
||||||
@@ -82,6 +97,18 @@ trim()
|
|||||||
{
|
{
|
||||||
awk '{gsub(/^ +| +$/,"")}1'
|
awk '{gsub(/^ +| +$/,"")}1'
|
||||||
}
|
}
|
||||||
|
split_by_separator()
|
||||||
|
{
|
||||||
|
# $1 - string
|
||||||
|
# $2 - separator
|
||||||
|
# $3 - var name to get "before" part
|
||||||
|
# $4 - var name to get "after" part
|
||||||
|
local before="${1%%$2*}"
|
||||||
|
local after="${1#*$2}"
|
||||||
|
[ "$after" = "$1" ] && after=
|
||||||
|
[ -n "$3" ] && eval $3="\$before"
|
||||||
|
[ -n "$4" ] && eval $4="\$after"
|
||||||
|
}
|
||||||
|
|
||||||
dir_is_not_empty()
|
dir_is_not_empty()
|
||||||
{
|
{
|
||||||
@@ -230,7 +257,7 @@ fix_sbin_path()
|
|||||||
# it can calculate floating point expr
|
# it can calculate floating point expr
|
||||||
calc()
|
calc()
|
||||||
{
|
{
|
||||||
awk "BEGIN { print $*}";
|
LC_ALL=C awk "BEGIN { print $*}";
|
||||||
}
|
}
|
||||||
|
|
||||||
fsleep_setup()
|
fsleep_setup()
|
||||||
@@ -286,10 +313,10 @@ minsleep()
|
|||||||
|
|
||||||
replace_char()
|
replace_char()
|
||||||
{
|
{
|
||||||
local a=$1
|
local a="$1"
|
||||||
local b=$2
|
local b="$2"
|
||||||
shift; shift
|
shift; shift
|
||||||
echo "$@" | tr $a $b
|
echo "$@" | tr "$a" "$b"
|
||||||
}
|
}
|
||||||
|
|
||||||
replace_str()
|
replace_str()
|
||||||
@@ -307,18 +334,32 @@ setup_md5()
|
|||||||
exists $MD5 || MD5=md5
|
exists $MD5 || MD5=md5
|
||||||
}
|
}
|
||||||
|
|
||||||
|
md5f()
|
||||||
|
{
|
||||||
|
setup_md5
|
||||||
|
$MD5 | cut -d ' ' -f1
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_random()
|
||||||
|
{
|
||||||
|
[ -n "$RCUT" ] && return
|
||||||
|
RCUT="cut -c 1-17"
|
||||||
|
# some shells can operate with 32 bit signed int
|
||||||
|
[ $((0x100000000)) = 0 ] && RCUT="cut -c 1-9"
|
||||||
|
}
|
||||||
|
|
||||||
random()
|
random()
|
||||||
{
|
{
|
||||||
# $1 - min, $2 - max
|
# $1 - min, $2 - max
|
||||||
local r rs
|
local r rs
|
||||||
setup_md5
|
setup_random
|
||||||
if [ -c /dev/urandom ]; then
|
if [ -c /dev/urandom ]; then
|
||||||
read rs </dev/urandom
|
read rs </dev/urandom
|
||||||
else
|
else
|
||||||
rs="$RANDOM$RANDOM$(date)"
|
rs="$RANDOM$RANDOM$(date)"
|
||||||
fi
|
fi
|
||||||
# shells use signed int64
|
# shells use signed int64
|
||||||
r=1$(echo $rs | $MD5 | sed 's/[^0-9]//g' | cut -c 1-17)
|
r=1$(echo $rs | md5f | sed 's/[^0-9]//g' | $RCUT)
|
||||||
echo $(( ($r % ($2-$1+1)) + $1 ))
|
echo $(( ($r % ($2-$1+1)) + $1 ))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -385,14 +426,17 @@ std_ports()
|
|||||||
has_bad_ws_options()
|
has_bad_ws_options()
|
||||||
{
|
{
|
||||||
# $1 - nfqws/tpws opts
|
# $1 - nfqws/tpws opts
|
||||||
# ПРИМЕЧАНИЕ ДЛЯ РАСПРОСТРАНИТЕЛЕЙ КОПИПАСТЫ
|
|
||||||
# ЭТОТ КОД СДЕЛАН СПЕЦИАЛЬНО ДЛЯ ВАС, ЧТОБЫ ВЫ НЕ ПОСТИЛИ В СЕТЬ ПЛОХИЕ РЕЦЕПТЫ
|
contains "$1" "--ipset" && {
|
||||||
# ЕСЛИ ВАМ ХОЧЕТСЯ ЕГО УДАЛИТЬ И НАПИСАТЬ ИНСТРУКЦИЮ КАК ЕГО УДАЛЯТЬ, ВЫ ДЕЛАЕТЕ ХРЕНОВУЮ УСЛУГУ. НАПИШИТЕ ЛУЧШЕ custom script.
|
echo
|
||||||
# custom script - ЭТО ФАЙЛИК, КОТОРЫЙ ДОСТАТОЧНО СКОПИРОВАТЬ В НУЖНУЮ ДИРЕКТОРИЮ, ЧТОБЫ ОН СДЕЛАЛ ТОЖЕ САМОЕ, НО ЭФФЕКТИВНО.
|
echo "WARNING !!! --ipset parameter is present"
|
||||||
# ФИЛЬТРАЦИЯ ПО IPSET В ЯДРЕ НЕСРАВНИМО ЭФФЕКТИВНЕЕ, ЧЕМ ПЕРЕКИДЫВАТЬ ВСЕ ПАКЕТЫ В nfqws И ТАМ ФИЛЬТРОВАТЬ
|
echo "It's OK if you only specialize already redirected traffic and also process the rest."
|
||||||
# --ipset СУЩЕСТВУЕТ ТОЛЬКО ДЛЯ ВИНДЫ И LINUX СИСТЕМ БЕЗ ipset (НАПРИМЕР, Android).
|
echo "If you redirect port X to process several IPs from the list and do nothing with the rest - IT'S VERY INEFFECTIVE !"
|
||||||
# И ТОЛЬКО ПО ЭТОЙ ПРИЧИНЕ ОНО НЕ ВЫКИНУТО ПОЛНОСТЬЮ ИЗ LINUX ВЕРСИИ
|
echo "Kernel ipsets should be used instead. Write custom scripts and filter IPs in kernel."
|
||||||
contains "$1" "--ipset"
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1
|
||||||
}
|
}
|
||||||
check_bad_ws_options()
|
check_bad_ws_options()
|
||||||
{
|
{
|
||||||
@@ -408,8 +452,5 @@ check_bad_ws_options()
|
|||||||
}
|
}
|
||||||
help_bad_ws_options()
|
help_bad_ws_options()
|
||||||
{
|
{
|
||||||
echo "WARNING ! you have specified --ipset option"
|
echo "WARNING ! BAD options detected"
|
||||||
echo "WARNING ! it would work but on ${UNAME:-$(uname)} it's not the best option"
|
|
||||||
echo "WARNING ! you should use kernel mode sets. they are much more efficient."
|
|
||||||
echo "WARNING ! to use ipsets you have to write your own custom script"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ custom_runner()
|
|||||||
# $1 - function name
|
# $1 - function name
|
||||||
# $2+ - params
|
# $2+ - params
|
||||||
|
|
||||||
|
[ "$DISABLE_CUSTOM" = 1 ] && return 0
|
||||||
|
|
||||||
local n script FUNC=$1
|
local n script FUNC=$1
|
||||||
|
|
||||||
shift
|
shift
|
||||||
|
|||||||
+130
-55
@@ -1,4 +1,4 @@
|
|||||||
readonly GET_LIST_PREFIX=/ipset/get_
|
GET_LIST_PREFIX=/ipset/get_
|
||||||
|
|
||||||
SYSTEMD_DIR=/lib/systemd
|
SYSTEMD_DIR=/lib/systemd
|
||||||
[ -d "$SYSTEMD_DIR" ] || SYSTEMD_DIR=/usr/lib/systemd
|
[ -d "$SYSTEMD_DIR" ] || SYSTEMD_DIR=/usr/lib/systemd
|
||||||
@@ -140,7 +140,7 @@ echo_var()
|
|||||||
eval v="\$$1"
|
eval v="\$$1"
|
||||||
if find_str_in_list $1 "$EDITVAR_NEWLINE_VARS"; then
|
if find_str_in_list $1 "$EDITVAR_NEWLINE_VARS"; then
|
||||||
echo "$1=\""
|
echo "$1=\""
|
||||||
echo "$v\"" | sed "s/$EDITVAR_NEWLINE_DELIMETER /$EDITVAR_NEWLINE_DELIMETER\n/g"
|
echo "$v\"" | tr '\n' ' ' | tr -d '\r' | sed -e 's/^ *//' -e 's/ *$//' -e "s/$EDITVAR_NEWLINE_DELIMETER /$EDITVAR_NEWLINE_DELIMETER\n/g"
|
||||||
else
|
else
|
||||||
if contains "$v" " "; then
|
if contains "$v" " "; then
|
||||||
echo $1=\"$v\"
|
echo $1=\"$v\"
|
||||||
@@ -170,6 +170,7 @@ list_vars()
|
|||||||
echo_var $1
|
echo_var $1
|
||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
echo
|
||||||
}
|
}
|
||||||
|
|
||||||
openrc_test()
|
openrc_test()
|
||||||
@@ -186,10 +187,11 @@ check_system()
|
|||||||
|
|
||||||
SYSTEM=
|
SYSTEM=
|
||||||
SUBSYS=
|
SUBSYS=
|
||||||
SYSTEMCTL=$(whichq systemctl)
|
SYSTEMCTL="$(whichq systemctl)"
|
||||||
|
|
||||||
get_fwtype
|
get_fwtype
|
||||||
OPENWRT_FW3=
|
OPENWRT_FW3=
|
||||||
|
OPENWRT_FW4=
|
||||||
|
|
||||||
local info
|
local info
|
||||||
UNAME=$(uname)
|
UNAME=$(uname)
|
||||||
@@ -201,42 +203,55 @@ check_system()
|
|||||||
# some distros include systemctl without systemd
|
# some distros include systemctl without systemd
|
||||||
if [ -d "$SYSTEMD_DIR" ] && [ -x "$SYSTEMCTL" ] && [ "$INIT" = "systemd" ]; then
|
if [ -d "$SYSTEMD_DIR" ] && [ -x "$SYSTEMCTL" ] && [ "$INIT" = "systemd" ]; then
|
||||||
SYSTEM=systemd
|
SYSTEM=systemd
|
||||||
elif [ -f "/etc/openwrt_release" ] && exists opkg && exists uci && [ "$INIT" = "procd" ] ; then
|
[ -f "$EXEDIR/init.d/sysv/functions" ] && . "$EXEDIR/init.d/sysv/functions"
|
||||||
{
|
elif [ -f "/etc/openwrt_release" ] && exists opkg || exists apk && exists uci && [ "$INIT" = "procd" ] ; then
|
||||||
SYSTEM=openwrt
|
SYSTEM=openwrt
|
||||||
|
OPENWRT_PACKAGER=opkg
|
||||||
|
OPENWRT_PACKAGER_INSTALL="opkg install"
|
||||||
|
OPENWRT_PACKAGER_UPDATE="opkg update"
|
||||||
|
exists apk && {
|
||||||
|
OPENWRT_PACKAGER=apk
|
||||||
|
OPENWRT_PACKAGER_INSTALL="apk add"
|
||||||
|
OPENWRT_PACKAGER_UPDATE=
|
||||||
|
}
|
||||||
|
info="package manager $OPENWRT_PACKAGER\n"
|
||||||
if openwrt_fw3 ; then
|
if openwrt_fw3 ; then
|
||||||
OPENWRT_FW3=1
|
OPENWRT_FW3=1
|
||||||
info="openwrt firewall uses fw3"
|
info="${info}firewall fw3"
|
||||||
if is_ipt_flow_offload_avail; then
|
if is_ipt_flow_offload_avail; then
|
||||||
info="$info. hardware flow offloading requires iptables."
|
info="$info. hardware flow offloading requires iptables."
|
||||||
else
|
else
|
||||||
info="$info. flow offloading unavailable."
|
info="$info. flow offloading unavailable."
|
||||||
fi
|
fi
|
||||||
elif openwrt_fw4; then
|
elif openwrt_fw4; then
|
||||||
info="openwrt firewall uses fw4. flow offloading requires nftables."
|
OPENWRT_FW4=1
|
||||||
|
info="${info}firewall fw4. flow offloading requires nftables."
|
||||||
fi
|
fi
|
||||||
}
|
[ -f "$EXEDIR/init.d/openwrt/functions" ] && . "$EXEDIR/init.d/openwrt/functions"
|
||||||
elif openrc_test; then
|
elif openrc_test; then
|
||||||
SYSTEM=openrc
|
SYSTEM=openrc
|
||||||
|
[ -f "$EXEDIR/init.d/sysv/functions" ] && . "$EXEDIR/init.d/sysv/functions"
|
||||||
else
|
else
|
||||||
echo system is not either systemd, openrc or openwrt based
|
echo system is not either systemd, openrc or openwrt based
|
||||||
echo easy installer can set up config settings but can\'t configure auto start
|
echo easy installer can set up config settings but can\'t configure auto start
|
||||||
echo you have to do it manually. check readme.txt for manual setup info.
|
echo you have to do it manually. check readme.md for manual setup info.
|
||||||
if [ -n "$1" ] || ask_yes_no N "do you want to continue"; then
|
if [ -n "$1" ] || ask_yes_no N "do you want to continue"; then
|
||||||
SYSTEM=linux
|
SYSTEM=linux
|
||||||
else
|
else
|
||||||
exitp 5
|
exitp 5
|
||||||
fi
|
fi
|
||||||
|
[ -f "$EXEDIR/init.d/sysv/functions" ] && . "$EXEDIR/init.d/sysv/functions"
|
||||||
fi
|
fi
|
||||||
linux_get_subsys
|
linux_get_subsys
|
||||||
elif [ "$UNAME" = "Darwin" ]; then
|
elif [ "$UNAME" = "Darwin" ]; then
|
||||||
SYSTEM=macos
|
SYSTEM=macos
|
||||||
|
[ -f "$EXEDIR/init.d/macos/functions" ] && . "$EXEDIR/init.d/macos/functions"
|
||||||
else
|
else
|
||||||
echo easy installer only supports Linux and MacOS. check readme.txt for supported systems and manual setup info.
|
echo easy installer only supports Linux and MacOS. check readme.md for supported systems and manual setup info.
|
||||||
exitp 5
|
exitp 5
|
||||||
fi
|
fi
|
||||||
echo system is based on $SYSTEM
|
echo system is based on $SYSTEM
|
||||||
[ -n "$info" ] && echo $info
|
[ -n "$info" ] && printf "${info}\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
get_free_space_mb()
|
get_free_space_mb()
|
||||||
@@ -420,14 +435,21 @@ check_kmod()
|
|||||||
}
|
}
|
||||||
check_package_exists_openwrt()
|
check_package_exists_openwrt()
|
||||||
{
|
{
|
||||||
[ -n "$(opkg list $1)" ]
|
[ -n "$($OPENWRT_PACKAGER list $1)" ]
|
||||||
}
|
}
|
||||||
check_package_openwrt()
|
check_package_openwrt()
|
||||||
{
|
{
|
||||||
[ -n "$(opkg list-installed $1)" ] && return 0
|
case $OPENWRT_PACKAGER in
|
||||||
local what="$(opkg whatprovides $1 | tail -n +2 | head -n 1)"
|
opkg)
|
||||||
[ -n "$what" ] || return 1
|
[ -n "$(opkg list-installed $1)" ] && return 0
|
||||||
[ -n "$(opkg list-installed $what)" ]
|
local what="$(opkg whatprovides $1 | tail -n +2 | head -n 1)"
|
||||||
|
[ -n "$what" ] || return 1
|
||||||
|
[ -n "$(opkg list-installed $what)" ]
|
||||||
|
;;
|
||||||
|
apk)
|
||||||
|
apk info -e $1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
}
|
}
|
||||||
check_packages_openwrt()
|
check_packages_openwrt()
|
||||||
{
|
{
|
||||||
@@ -516,9 +538,8 @@ restart_openwrt_firewall()
|
|||||||
|
|
||||||
local FW=fw4
|
local FW=fw4
|
||||||
[ -n "$OPENWRT_FW3" ] && FW=fw3
|
[ -n "$OPENWRT_FW3" ] && FW=fw3
|
||||||
$FW -q restart || {
|
exists $FW && $FW -q restart || {
|
||||||
echo could not restart firewall $FW
|
echo could not restart firewall $FW
|
||||||
exitp 30
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
remove_openwrt_firewall()
|
remove_openwrt_firewall()
|
||||||
@@ -601,11 +622,17 @@ write_config_var()
|
|||||||
replace_var_def $1 "$M" "$ZAPRET_CONFIG"
|
replace_var_def $1 "$M" "$ZAPRET_CONFIG"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
no_prereq_exit()
|
||||||
|
{
|
||||||
|
echo could not install prerequisites
|
||||||
|
exitp 6
|
||||||
|
}
|
||||||
check_prerequisites_linux()
|
check_prerequisites_linux()
|
||||||
{
|
{
|
||||||
echo \* checking prerequisites
|
echo \* checking prerequisites
|
||||||
|
|
||||||
local s cmd PKGS UTILS req="curl curl"
|
local s cmd PKGS UTILS req="curl curl"
|
||||||
|
local APTGET DNF YUM PACMAN ZYPPER EOPKG APK
|
||||||
case "$FWTYPE" in
|
case "$FWTYPE" in
|
||||||
iptables)
|
iptables)
|
||||||
req="$req iptables iptables ip6tables iptables ipset ipset"
|
req="$req iptables iptables ip6tables iptables ipset ipset"
|
||||||
@@ -634,6 +661,7 @@ check_prerequisites_linux()
|
|||||||
echo packages required : $PKGS
|
echo packages required : $PKGS
|
||||||
|
|
||||||
APTGET=$(whichq apt-get)
|
APTGET=$(whichq apt-get)
|
||||||
|
DNF=$(whichq dnf)
|
||||||
YUM=$(whichq yum)
|
YUM=$(whichq yum)
|
||||||
PACMAN=$(whichq pacman)
|
PACMAN=$(whichq pacman)
|
||||||
ZYPPER=$(whichq zypper)
|
ZYPPER=$(whichq zypper)
|
||||||
@@ -641,39 +669,23 @@ check_prerequisites_linux()
|
|||||||
APK=$(whichq apk)
|
APK=$(whichq apk)
|
||||||
if [ -x "$APTGET" ] ; then
|
if [ -x "$APTGET" ] ; then
|
||||||
"$APTGET" update
|
"$APTGET" update
|
||||||
"$APTGET" install -y --no-install-recommends $PKGS dnsutils || {
|
"$APTGET" install -y --no-install-recommends $PKGS dnsutils || no_prereq_exit
|
||||||
echo could not install prerequisites
|
elif [ -x "$DNF" ] ; then
|
||||||
exitp 6
|
"$DNF" -y install $PKGS || no_prereq_exit
|
||||||
}
|
|
||||||
elif [ -x "$YUM" ] ; then
|
elif [ -x "$YUM" ] ; then
|
||||||
"$YUM" -y install $PKGS || {
|
"$YUM" -y install $PKGS || no_prereq_exit
|
||||||
echo could not install prerequisites
|
|
||||||
exitp 6
|
|
||||||
}
|
|
||||||
elif [ -x "$PACMAN" ] ; then
|
elif [ -x "$PACMAN" ] ; then
|
||||||
"$PACMAN" -Syy
|
"$PACMAN" -Syy
|
||||||
"$PACMAN" --noconfirm -S $PKGS || {
|
"$PACMAN" --noconfirm -S $PKGS || no_prereq_exit
|
||||||
echo could not install prerequisites
|
|
||||||
exitp 6
|
|
||||||
}
|
|
||||||
elif [ -x "$ZYPPER" ] ; then
|
elif [ -x "$ZYPPER" ] ; then
|
||||||
"$ZYPPER" --non-interactive install $PKGS || {
|
"$ZYPPER" --non-interactive install $PKGS || no_prereq_exit
|
||||||
echo could not install prerequisites
|
|
||||||
exitp 6
|
|
||||||
}
|
|
||||||
elif [ -x "$EOPKG" ] ; then
|
elif [ -x "$EOPKG" ] ; then
|
||||||
"$EOPKG" -y install $PKGS || {
|
"$EOPKG" -y install $PKGS || no_prereq_exit
|
||||||
echo could not install prerequisites
|
|
||||||
exitp 6
|
|
||||||
}
|
|
||||||
elif [ -x "$APK" ] ; then
|
elif [ -x "$APK" ] ; then
|
||||||
"$APK" update
|
"$APK" update
|
||||||
# for alpine
|
# for alpine
|
||||||
[ "$FWTYPE" = iptables ] && [ -n "$($APK list ip6tables)" ] && PKGS="$PKGS ip6tables"
|
[ "$FWTYPE" = iptables ] && [ -n "$($APK list ip6tables)" ] && PKGS="$PKGS ip6tables"
|
||||||
"$APK" add $PKGS || {
|
"$APK" add $PKGS || no_prereq_exit
|
||||||
echo could not install prerequisites
|
|
||||||
exitp 6
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
echo supported package manager not found
|
echo supported package manager not found
|
||||||
echo you must manually install : $UTILS
|
echo you must manually install : $UTILS
|
||||||
@@ -684,7 +696,23 @@ check_prerequisites_linux()
|
|||||||
|
|
||||||
removable_pkgs_openwrt()
|
removable_pkgs_openwrt()
|
||||||
{
|
{
|
||||||
PKGS="iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra ip6tables-mod-nat ip6tables-extra kmod-nft-queue gzip coreutils-sort coreutils-sleep curl"
|
local pkg PKGS2
|
||||||
|
[ -n "$OPENWRT_FW4" ] && PKGS2="$PKGS2 iptables-zz-legacy iptables ip6tables-zz-legacy ip6tables"
|
||||||
|
[ -n "$OPENWRT_FW3" ] && PKGS2="$PKGS2 nftables-json nftables-nojson nftables"
|
||||||
|
PKGS=
|
||||||
|
for pkg in $PKGS2; do
|
||||||
|
check_package_exists_openwrt $pkg && PKGS="${PKGS:+$PKGS }$pkg"
|
||||||
|
done
|
||||||
|
PKGS="ipset iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra iptables-mod-u32 ip6tables-mod-nat ip6tables-extra kmod-nft-queue gzip coreutils-sort coreutils-sleep curl $PKGS"
|
||||||
|
}
|
||||||
|
|
||||||
|
openwrt_fix_broken_apk_uninstall_scripts()
|
||||||
|
{
|
||||||
|
# at least in early snapshots with apk removing gnu gzip, sort, ... does not restore links to busybox
|
||||||
|
# system may become unusable
|
||||||
|
exists sort || { echo fixing missing sort; ln -fs /bin/busybox /usr/bin/sort; }
|
||||||
|
exists gzip || { echo fixing missing gzip; ln -fs /bin/busybox /bin/gzip; }
|
||||||
|
exists sleep || { echo fixing missing sleep; ln -fs /bin/busybox /bin/sleep; }
|
||||||
}
|
}
|
||||||
|
|
||||||
remove_extra_pkgs_openwrt()
|
remove_extra_pkgs_openwrt()
|
||||||
@@ -693,19 +721,32 @@ remove_extra_pkgs_openwrt()
|
|||||||
echo \* remove dependencies
|
echo \* remove dependencies
|
||||||
removable_pkgs_openwrt
|
removable_pkgs_openwrt
|
||||||
echo these packages may have been installed by install_easy.sh : $PKGS
|
echo these packages may have been installed by install_easy.sh : $PKGS
|
||||||
ask_yes_no N "do you want to remove them" && opkg remove --autoremove $PKGS
|
ask_yes_no N "do you want to remove them" && {
|
||||||
|
case $OPENWRT_PACKAGER in
|
||||||
|
opkg)
|
||||||
|
opkg remove --autoremove $PKGS
|
||||||
|
;;
|
||||||
|
apk)
|
||||||
|
apk del $PKGS
|
||||||
|
openwrt_fix_broken_apk_uninstall_scripts
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
check_prerequisites_openwrt()
|
check_prerequisites_openwrt()
|
||||||
{
|
{
|
||||||
echo \* checking prerequisites
|
echo \* checking prerequisites
|
||||||
|
|
||||||
local PKGS="curl" UPD=0
|
local PKGS="curl" UPD=0 local pkg_iptables
|
||||||
|
|
||||||
case "$FWTYPE" in
|
case "$FWTYPE" in
|
||||||
iptables)
|
iptables)
|
||||||
PKGS="$PKGS ipset iptables iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra"
|
pkg_iptables=iptables
|
||||||
[ "$DISABLE_IPV6" != "1" ] && PKGS="$PKGS ip6tables ip6tables-mod-nat ip6tables-extra"
|
check_package_exists_openwrt iptables-zz-legacy && pkg_iptables=iptables-zz-legacy
|
||||||
|
PKGS="$PKGS ipset $pkg_iptables iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra iptables-mod-u32"
|
||||||
|
check_package_exists_openwrt ip6tables-zz-legacy && pkg_iptables=ip6tables-zz-legacy
|
||||||
|
[ "$DISABLE_IPV6" = 1 ] || PKGS="$PKGS $pkg_iptables ip6tables-mod-nat ip6tables-extra"
|
||||||
;;
|
;;
|
||||||
nftables)
|
nftables)
|
||||||
PKGS="$PKGS nftables kmod-nft-nat kmod-nft-offload kmod-nft-queue"
|
PKGS="$PKGS nftables kmod-nft-nat kmod-nft-offload kmod-nft-queue"
|
||||||
@@ -717,9 +758,9 @@ check_prerequisites_openwrt()
|
|||||||
else
|
else
|
||||||
echo \* installing prerequisites
|
echo \* installing prerequisites
|
||||||
|
|
||||||
opkg update
|
$OPENWRT_PACKAGER_UPDATE
|
||||||
UPD=1
|
UPD=1
|
||||||
opkg install $PKGS || {
|
$OPENWRT_PACKAGER_INSTALL $PKGS || {
|
||||||
echo could not install prerequisites
|
echo could not install prerequisites
|
||||||
exitp 6
|
exitp 6
|
||||||
}
|
}
|
||||||
@@ -732,10 +773,10 @@ check_prerequisites_openwrt()
|
|||||||
echo installer can install GNU gzip but it requires about 100 Kb space
|
echo installer can install GNU gzip but it requires about 100 Kb space
|
||||||
if ask_yes_no N "do you want to install GNU gzip"; then
|
if ask_yes_no N "do you want to install GNU gzip"; then
|
||||||
[ "$UPD" = "0" ] && {
|
[ "$UPD" = "0" ] && {
|
||||||
opkg update
|
$OPENWRT_PACKAGER_UPDATE
|
||||||
UPD=1
|
UPD=1
|
||||||
}
|
}
|
||||||
opkg install --force-overwrite gzip
|
$OPENWRT_PACKAGER_INSTALL --force-overwrite gzip
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
is_linked_to_busybox sort && {
|
is_linked_to_busybox sort && {
|
||||||
@@ -745,10 +786,10 @@ check_prerequisites_openwrt()
|
|||||||
echo installer can install GNU sort but it requires about 100 Kb space
|
echo installer can install GNU sort but it requires about 100 Kb space
|
||||||
if ask_yes_no N "do you want to install GNU sort"; then
|
if ask_yes_no N "do you want to install GNU sort"; then
|
||||||
[ "$UPD" = "0" ] && {
|
[ "$UPD" = "0" ] && {
|
||||||
opkg update
|
$OPENWRT_PACKAGER_UPDATE
|
||||||
UPD=1
|
UPD=1
|
||||||
}
|
}
|
||||||
opkg install --force-overwrite coreutils-sort
|
$OPENWRT_PACKAGER_INSTALL --force-overwrite coreutils-sort
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
[ "$FSLEEP" = 0 ] && is_linked_to_busybox sleep && {
|
[ "$FSLEEP" = 0 ] && is_linked_to_busybox sleep && {
|
||||||
@@ -757,10 +798,10 @@ check_prerequisites_openwrt()
|
|||||||
echo if you want to speed up blockcheck install coreutils-sleep. it requires about 40 Kb space
|
echo if you want to speed up blockcheck install coreutils-sleep. it requires about 40 Kb space
|
||||||
if ask_yes_no N "do you want to install COREUTILS sleep"; then
|
if ask_yes_no N "do you want to install COREUTILS sleep"; then
|
||||||
[ "$UPD" = "0" ] && {
|
[ "$UPD" = "0" ] && {
|
||||||
opkg update
|
$OPENWRT_PACKAGER_UPDATE
|
||||||
UPD=1
|
UPD=1
|
||||||
}
|
}
|
||||||
opkg install --force-overwrite coreutils-sleep
|
$OPENWRT_PACKAGER_INSTALL --force-overwrite coreutils-sleep
|
||||||
fsleep_setup
|
fsleep_setup
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -793,3 +834,37 @@ select_fwtype()
|
|||||||
echo select firewall type :
|
echo select firewall type :
|
||||||
ask_list FWTYPE "iptables nftables" "$FWTYPE" && write_config_var FWTYPE
|
ask_list FWTYPE "iptables nftables" "$FWTYPE" && write_config_var FWTYPE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dry_run_tpws_()
|
||||||
|
{
|
||||||
|
local TPWS="$ZAPRET_BASE/tpws/tpws"
|
||||||
|
echo verifying tpws options
|
||||||
|
"$TPWS" --dry-run ${WS_USER:+--user=$WS_USER} "$@"
|
||||||
|
}
|
||||||
|
dry_run_nfqws_()
|
||||||
|
{
|
||||||
|
local NFQWS="$ZAPRET_BASE/nfq/nfqws"
|
||||||
|
echo verifying nfqws options
|
||||||
|
"$NFQWS" --dry-run ${WS_USER:+--user=$WS_USER} "$@"
|
||||||
|
}
|
||||||
|
dry_run_tpws()
|
||||||
|
{
|
||||||
|
[ "$TPWS_ENABLE" = 1 ] || return 0
|
||||||
|
local opt="$TPWS_OPT" port=${TPPORT_SOCKS:-988}
|
||||||
|
filter_apply_hostlist_target opt
|
||||||
|
dry_run_tpws_ --port=$port $opt
|
||||||
|
}
|
||||||
|
dry_run_tpws_socks()
|
||||||
|
{
|
||||||
|
[ "$TPWS_SOCKS_ENABLE" = 1 ] || return 0
|
||||||
|
local opt="$TPWS_SOCKS_OPT" port=${TPPORT:-987}
|
||||||
|
filter_apply_hostlist_target opt
|
||||||
|
dry_run_tpws_ --port=$port --socks $opt
|
||||||
|
}
|
||||||
|
dry_run_nfqws()
|
||||||
|
{
|
||||||
|
[ "$NFQWS_ENABLE" = 1 ] || return 0
|
||||||
|
local opt="$NFQWS_OPT" qn=${QNUM:-200}
|
||||||
|
filter_apply_hostlist_target opt
|
||||||
|
dry_run_nfqws_ --qnum=$qn $opt
|
||||||
|
}
|
||||||
|
|||||||
+49
-10
@@ -1,5 +1,9 @@
|
|||||||
std_ports
|
std_ports
|
||||||
readonly ipt_connbytes="-m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes"
|
ipt_connbytes="-m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes"
|
||||||
|
IPSET_EXCLUDE="-m set ! --match-set nozapret"
|
||||||
|
IPSET_EXCLUDE6="-m set ! --match-set nozapret6"
|
||||||
|
IPBAN_EXCLUDE="-m set ! --match-set ipban"
|
||||||
|
IPBAN_EXCLUDE6="-m set ! --match-set ipban6"
|
||||||
|
|
||||||
ipt()
|
ipt()
|
||||||
{
|
{
|
||||||
@@ -108,6 +112,10 @@ unprepare_tpws_fw()
|
|||||||
unprepare_tpws_fw4
|
unprepare_tpws_fw4
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ipt_mark_filter()
|
||||||
|
{
|
||||||
|
[ -n "$FILTER_MARK" ] && echo "-m mark --mark $FILTER_MARK/$FILTER_MARK"
|
||||||
|
}
|
||||||
|
|
||||||
ipt_print_op()
|
ipt_print_op()
|
||||||
{
|
{
|
||||||
@@ -132,7 +140,7 @@ _fw_tpws4()
|
|||||||
|
|
||||||
ipt_print_op $1 "$2" "tpws (port $3)"
|
ipt_print_op $1 "$2" "tpws (port $3)"
|
||||||
|
|
||||||
rule="$2 $IPSET_EXCLUDE dst -j DNAT --to $TPWS_LOCALHOST4:$3"
|
rule="$(ipt_mark_filter) $2 $IPSET_EXCLUDE dst $IPBAN_EXCLUDE dst -j DNAT --to $TPWS_LOCALHOST4:$3"
|
||||||
for i in $4 ; do
|
for i in $4 ; do
|
||||||
ipt_add_del $1 PREROUTING -t nat -i $i $rule
|
ipt_add_del $1 PREROUTING -t nat -i $i $rule
|
||||||
done
|
done
|
||||||
@@ -160,7 +168,7 @@ _fw_tpws6()
|
|||||||
|
|
||||||
ipt_print_op $1 "$2" "tpws (port $3)" 6
|
ipt_print_op $1 "$2" "tpws (port $3)" 6
|
||||||
|
|
||||||
rule="$2 $IPSET_EXCLUDE6 dst"
|
rule="$(ipt_mark_filter) $2 $IPSET_EXCLUDE6 dst $IPBAN_EXCLUDE6 dst"
|
||||||
for i in $4 ; do
|
for i in $4 ; do
|
||||||
_dnat6_target $i DNAT6
|
_dnat6_target $i DNAT6
|
||||||
[ -n "$DNAT6" -a "$DNAT6" != "-" ] && ipt6_add_del $1 PREROUTING -t nat -i $i $rule -j DNAT --to [$DNAT6]:$3
|
[ -n "$DNAT6" -a "$DNAT6" != "-" ] && ipt6_add_del $1 PREROUTING -t nat -i $i $rule -j DNAT --to [$DNAT6]:$3
|
||||||
@@ -198,7 +206,7 @@ _fw_nfqws_post4()
|
|||||||
|
|
||||||
ipt_print_op $1 "$2" "nfqws postrouting (qnum $3)"
|
ipt_print_op $1 "$2" "nfqws postrouting (qnum $3)"
|
||||||
|
|
||||||
rule="-m mark ! --mark $DESYNC_MARK/$DESYNC_MARK $2 $IPSET_EXCLUDE dst -j NFQUEUE --queue-num $3 --queue-bypass"
|
rule="$(ipt_mark_filter) -m mark ! --mark $DESYNC_MARK/$DESYNC_MARK $2 $IPSET_EXCLUDE dst -j NFQUEUE --queue-num $3 --queue-bypass"
|
||||||
if [ -n "$4" ] ; then
|
if [ -n "$4" ] ; then
|
||||||
for i in $4; do
|
for i in $4; do
|
||||||
ipt_add_del $1 POSTROUTING -t mangle -o $i $rule
|
ipt_add_del $1 POSTROUTING -t mangle -o $i $rule
|
||||||
@@ -219,7 +227,7 @@ _fw_nfqws_post6()
|
|||||||
|
|
||||||
ipt_print_op $1 "$2" "nfqws postrouting (qnum $3)" 6
|
ipt_print_op $1 "$2" "nfqws postrouting (qnum $3)" 6
|
||||||
|
|
||||||
rule="-m mark ! --mark $DESYNC_MARK/$DESYNC_MARK $2 $IPSET_EXCLUDE6 dst -j NFQUEUE --queue-num $3 --queue-bypass"
|
rule="$(ipt_mark_filter) -m mark ! --mark $DESYNC_MARK/$DESYNC_MARK $2 $IPSET_EXCLUDE6 dst -j NFQUEUE --queue-num $3 --queue-bypass"
|
||||||
if [ -n "$4" ] ; then
|
if [ -n "$4" ] ; then
|
||||||
for i in $4; do
|
for i in $4; do
|
||||||
ipt6_add_del $1 POSTROUTING -t mangle -o $i $rule
|
ipt6_add_del $1 POSTROUTING -t mangle -o $i $rule
|
||||||
@@ -349,27 +357,37 @@ ipt_do_nfqws_in_out()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
zapret_do_firewall_standard_rules_ipt()
|
zapret_do_firewall_standard_tpws_rules_ipt()
|
||||||
{
|
{
|
||||||
# $1 - 1 - add, 0 - del
|
# $1 - 1 - add, 0 - del
|
||||||
|
|
||||||
local f4 f6
|
local f4 f6
|
||||||
|
|
||||||
[ "$TPWS_ENABLE" = 1 -a -n "$TPWS_PORTS" ] &&
|
[ "$TPWS_ENABLE" = 1 -a -n "$TPWS_PORTS" ] && {
|
||||||
{
|
|
||||||
f4="-p tcp -m multiport --dports $TPWS_PORTS_IPT"
|
f4="-p tcp -m multiport --dports $TPWS_PORTS_IPT"
|
||||||
f6=$f4
|
f6=$f4
|
||||||
filter_apply_ipset_target f4 f6
|
filter_apply_ipset_target f4 f6
|
||||||
fw_tpws $1 "$f4" "$f6" $TPPORT
|
fw_tpws $1 "$f4" "$f6" $TPPORT
|
||||||
}
|
}
|
||||||
[ "$NFQWS_ENABLE" = 1 ] &&
|
}
|
||||||
{
|
zapret_do_firewall_standard_nfqws_rules_ipt()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - del
|
||||||
|
|
||||||
|
[ "$NFQWS_ENABLE" = 1 ] && {
|
||||||
ipt_do_nfqws_in_out $1 tcp "$NFQWS_PORTS_TCP_IPT" "$NFQWS_TCP_PKT_OUT" "$NFQWS_TCP_PKT_IN"
|
ipt_do_nfqws_in_out $1 tcp "$NFQWS_PORTS_TCP_IPT" "$NFQWS_TCP_PKT_OUT" "$NFQWS_TCP_PKT_IN"
|
||||||
ipt_do_nfqws_in_out $1 tcp "$NFQWS_PORTS_TCP_KEEPALIVE_IPT" keepalive "$NFQWS_TCP_PKT_IN"
|
ipt_do_nfqws_in_out $1 tcp "$NFQWS_PORTS_TCP_KEEPALIVE_IPT" keepalive "$NFQWS_TCP_PKT_IN"
|
||||||
ipt_do_nfqws_in_out $1 udp "$NFQWS_PORTS_UDP_IPT" "$NFQWS_UDP_PKT_OUT" "$NFQWS_UDP_PKT_IN"
|
ipt_do_nfqws_in_out $1 udp "$NFQWS_PORTS_UDP_IPT" "$NFQWS_UDP_PKT_OUT" "$NFQWS_UDP_PKT_IN"
|
||||||
ipt_do_nfqws_in_out $1 udp "$NFQWS_PORTS_UDP_KEEPALIVE_IPT" keepalive "$NFQWS_UDP_PKT_IN"
|
ipt_do_nfqws_in_out $1 udp "$NFQWS_PORTS_UDP_KEEPALIVE_IPT" keepalive "$NFQWS_UDP_PKT_IN"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
zapret_do_firewall_standard_rules_ipt()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - del
|
||||||
|
|
||||||
|
zapret_do_firewall_standard_tpws_rules_ipt $1
|
||||||
|
zapret_do_firewall_standard_nfqws_rules_ipt $1
|
||||||
|
}
|
||||||
|
|
||||||
zapret_do_firewall_rules_ipt()
|
zapret_do_firewall_rules_ipt()
|
||||||
{
|
{
|
||||||
@@ -377,6 +395,27 @@ zapret_do_firewall_rules_ipt()
|
|||||||
|
|
||||||
zapret_do_firewall_standard_rules_ipt $1
|
zapret_do_firewall_standard_rules_ipt $1
|
||||||
custom_runner zapret_custom_firewall $1
|
custom_runner zapret_custom_firewall $1
|
||||||
|
zapret_do_icmp_filter $1
|
||||||
|
}
|
||||||
|
|
||||||
|
zapret_do_icmp_filter()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - del
|
||||||
|
|
||||||
|
local FW_EXTRA_PRE= FW_EXTRA_POST=
|
||||||
|
|
||||||
|
[ "$FILTER_TTL_EXPIRED_ICMP" = 1 ] && {
|
||||||
|
[ "$DISABLE_IPV4" = 1 ] || {
|
||||||
|
ipt_add_del $1 POSTROUTING -t mangle -m mark --mark $DESYNC_MARK/$DESYNC_MARK -j CONNMARK --or-mark $DESYNC_MARK
|
||||||
|
ipt_add_del $1 INPUT -p icmp -m icmp --icmp-type time-exceeded -m connmark --mark $DESYNC_MARK/$DESYNC_MARK -j DROP
|
||||||
|
ipt_add_del $1 FORWARD -p icmp -m icmp --icmp-type time-exceeded -m connmark --mark $DESYNC_MARK/$DESYNC_MARK -j DROP
|
||||||
|
}
|
||||||
|
[ "$DISABLE_IPV6" = 1 ] || {
|
||||||
|
ipt6_add_del $1 POSTROUTING -t mangle -m mark --mark $DESYNC_MARK/$DESYNC_MARK -j CONNMARK --or-mark $DESYNC_MARK
|
||||||
|
ipt6_add_del $1 INPUT -p icmpv6 -m icmp6 --icmpv6-type time-exceeded -m connmark --mark $DESYNC_MARK/$DESYNC_MARK -j DROP
|
||||||
|
ipt6_add_del $1 FORWARD -p icmpv6 -m icmp6 --icmpv6-type time-exceeded -m connmark --mark $DESYNC_MARK/$DESYNC_MARK -j DROP
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
zapret_do_firewall_ipt()
|
zapret_do_firewall_ipt()
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
standard_mode_tpws_socks()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
local opt
|
||||||
|
[ "$TPWS_SOCKS_ENABLE" = 1 ] && {
|
||||||
|
opt="--port=$TPPORT_SOCKS $TPWS_SOCKS_OPT"
|
||||||
|
filter_apply_hostlist_target opt
|
||||||
|
do_tpws_socks $1 2 "$opt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
standard_mode_tpws()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
local opt
|
||||||
|
[ "$TPWS_ENABLE" = 1 ] && check_bad_ws_options $1 "$TPWS_OPT" && {
|
||||||
|
opt="--port=$TPPORT $TPWS_OPT"
|
||||||
|
filter_apply_hostlist_target opt
|
||||||
|
do_tpws $1 1 "$opt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
standard_mode_nfqws()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
local opt
|
||||||
|
[ "$NFQWS_ENABLE" = 1 ] && check_bad_ws_options $1 "$NFQWS_OPT" && {
|
||||||
|
opt="--qnum=$QNUM $NFQWS_OPT"
|
||||||
|
filter_apply_hostlist_target opt
|
||||||
|
do_nfqws $1 3 "$opt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
standard_mode_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
standard_mode_tpws_socks $1
|
||||||
|
standard_mode_tpws $1
|
||||||
|
standard_mode_nfqws $1
|
||||||
|
}
|
||||||
|
zapret_do_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
standard_mode_daemons $1
|
||||||
|
custom_runner zapret_custom_daemons $1
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
zapret_run_daemons()
|
||||||
|
{
|
||||||
|
zapret_do_daemons 1 "$@"
|
||||||
|
}
|
||||||
|
zapret_stop_daemons()
|
||||||
|
{
|
||||||
|
zapret_do_daemons 0 "$@"
|
||||||
|
}
|
||||||
@@ -4,6 +4,8 @@
|
|||||||
# PREROUTING - can't DNAT to ::1. can DNAT to link local of -i interface or to any global addr
|
# PREROUTING - can't DNAT to ::1. can DNAT to link local of -i interface or to any global addr
|
||||||
# not a good idea to expose tpws to the world (bind to ::)
|
# not a good idea to expose tpws to the world (bind to ::)
|
||||||
|
|
||||||
|
# max wait time for the link local ipv6 on the LAN interface
|
||||||
|
LINKLOCAL_WAIT_SEC=${LINKLOCAL_WAIT_SEC:-5}
|
||||||
|
|
||||||
get_ipv6_linklocal()
|
get_ipv6_linklocal()
|
||||||
{
|
{
|
||||||
@@ -109,6 +111,14 @@ unprepare_route_localnet()
|
|||||||
set_route_localnet 0 "$@"
|
set_route_localnet 0 "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_uevent_devtype()
|
||||||
|
{
|
||||||
|
local DEVTYPE INTERFACE IFINDEX OF_NAME OF_FULLNAME OF_COMPATIBLE_N
|
||||||
|
[ -f "/sys/class/net/$1/uevent" ] && {
|
||||||
|
. "/sys/class/net/$1/uevent"
|
||||||
|
echo -n $DEVTYPE
|
||||||
|
}
|
||||||
|
}
|
||||||
resolve_lower_devices()
|
resolve_lower_devices()
|
||||||
{
|
{
|
||||||
# $1 - bridge interface name
|
# $1 - bridge interface name
|
||||||
@@ -125,3 +135,13 @@ resolve_lower_devices()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default_route_interfaces6()
|
||||||
|
{
|
||||||
|
sed -nre 's/^00000000000000000000000000000000 00 [0-9a-f]{32} [0-9a-f]{2} [0-9a-f]{32} [0-9a-f]{8} [0-9a-f]{8} [0-9a-f]{8} [0-9a-f]{8} +(.*)$/\1/p' /proc/net/ipv6_route | grep -v '^lo$' | sort -u | xargs
|
||||||
|
}
|
||||||
|
|
||||||
|
default_route_interfaces4()
|
||||||
|
{
|
||||||
|
sed -nre 's/^([^\t]+)\t00000000\t[0-9A-F]{8}\t[0-9A-F]{4}\t[0-9]+\t[0-9]+\t[0-9]+\t00000000.*$/\1/p' /proc/net/route | sort -u | xargs
|
||||||
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
readonly HOSTLIST_MARKER="<HOSTLIST>"
|
HOSTLIST_MARKER="<HOSTLIST>"
|
||||||
readonly HOSTLIST_NOAUTO_MARKER="<HOSTLIST_NOAUTO>"
|
HOSTLIST_NOAUTO_MARKER="<HOSTLIST_NOAUTO>"
|
||||||
|
|
||||||
find_hostlists()
|
find_hostlists()
|
||||||
{
|
{
|
||||||
|
|||||||
+62
-53
@@ -1,5 +1,5 @@
|
|||||||
[ -n "$ZAPRET_NFT_TABLE" ] || ZAPRET_NFT_TABLE=zapret
|
[ -n "$ZAPRET_NFT_TABLE" ] || ZAPRET_NFT_TABLE=zapret
|
||||||
readonly nft_connbytes="ct original packets"
|
nft_connbytes="ct original packets"
|
||||||
|
|
||||||
# required for : nft -f -
|
# required for : nft -f -
|
||||||
create_dev_stdin
|
create_dev_stdin
|
||||||
@@ -106,7 +106,7 @@ cat << EOF | nft -f -
|
|||||||
flush chain inet $ZAPRET_NFT_TABLE predefrag_nfqws
|
flush chain inet $ZAPRET_NFT_TABLE predefrag_nfqws
|
||||||
add rule inet $ZAPRET_NFT_TABLE predefrag mark and $DESYNC_MARK !=0 jump predefrag_nfqws comment "nfqws generated : avoid drop by INVALID conntrack state"
|
add rule inet $ZAPRET_NFT_TABLE predefrag mark and $DESYNC_MARK !=0 jump predefrag_nfqws comment "nfqws generated : avoid drop by INVALID conntrack state"
|
||||||
add rule inet $ZAPRET_NFT_TABLE predefrag_nfqws mark and $DESYNC_MARK_POSTNAT !=0 notrack comment "postnat traffic"
|
add rule inet $ZAPRET_NFT_TABLE predefrag_nfqws mark and $DESYNC_MARK_POSTNAT !=0 notrack comment "postnat traffic"
|
||||||
add rule inet $ZAPRET_NFT_TABLE predefrag_nfqws ip frag-off != 0 notrack comment "ipfrag"
|
add rule inet $ZAPRET_NFT_TABLE predefrag_nfqws ip frag-off & 0x1fff != 0 notrack comment "ipfrag"
|
||||||
add rule inet $ZAPRET_NFT_TABLE predefrag_nfqws exthdr frag exists notrack comment "ipfrag"
|
add rule inet $ZAPRET_NFT_TABLE predefrag_nfqws exthdr frag exists notrack comment "ipfrag"
|
||||||
add rule inet $ZAPRET_NFT_TABLE predefrag_nfqws tcp flags ! syn,rst,ack notrack comment "datanoack"
|
add rule inet $ZAPRET_NFT_TABLE predefrag_nfqws tcp flags ! syn,rst,ack notrack comment "datanoack"
|
||||||
add set inet $ZAPRET_NFT_TABLE lanif { type ifname; }
|
add set inet $ZAPRET_NFT_TABLE lanif { type ifname; }
|
||||||
@@ -119,6 +119,20 @@ EOF
|
|||||||
nft_flush_chain predefrag_nfqws
|
nft_flush_chain predefrag_nfqws
|
||||||
nft_add_rule predefrag_nfqws notrack comment \"do not track nfqws generated packets to avoid nat tampering and defragmentation\"
|
nft_add_rule predefrag_nfqws notrack comment \"do not track nfqws generated packets to avoid nat tampering and defragmentation\"
|
||||||
}
|
}
|
||||||
|
[ "$FILTER_TTL_EXPIRED_ICMP" = 1 ] && {
|
||||||
|
if is_postnat; then
|
||||||
|
# can be caused by untracked nfqws-generated packets
|
||||||
|
nft_add_rule prerouting icmp type time-exceeded ct state invalid drop
|
||||||
|
else
|
||||||
|
nft_add_rule postrouting_hook mark and $DESYNC_MARK != 0 ct mark set ct mark or $DESYNC_MARK comment \"nfqws related : prevent ttl expired socket errors\"
|
||||||
|
fi
|
||||||
|
[ "$DISABLE_IPV4" = "1" ] || {
|
||||||
|
nft_add_rule prerouting icmp type time-exceeded ct mark and $DESYNC_MARK != 0 drop comment \"nfqws related : prevent ttl expired socket errors\"
|
||||||
|
}
|
||||||
|
[ "$DISABLE_IPV6" = "1" ] || {
|
||||||
|
nft_add_rule prerouting icmpv6 type time-exceeded ct mark and $DESYNC_MARK != 0 drop comment \"nfqws related : prevent ttl expired socket errors\"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nft_del_chains()
|
nft_del_chains()
|
||||||
{
|
{
|
||||||
@@ -263,28 +277,6 @@ nft_add_flow_offload_exemption()
|
|||||||
[ "$DISABLE_IPV6" = "1" -o -z "$2" ] || nft_add_rule flow_offload oifname @wanif6 $2 ip6 daddr != @nozapret6 return comment \"$3\"
|
[ "$DISABLE_IPV6" = "1" -o -z "$2" ] || nft_add_rule flow_offload oifname @wanif6 $2 ip6 daddr != @nozapret6 return comment \"$3\"
|
||||||
}
|
}
|
||||||
|
|
||||||
nft_hw_offload_supported()
|
|
||||||
{
|
|
||||||
# $1,$2,... - interface names
|
|
||||||
local devices res=1
|
|
||||||
make_quoted_comma_list devices "$@"
|
|
||||||
[ -n "$devices" ] && devices="devices={$devices};"
|
|
||||||
nft add table ${ZAPRET_NFT_TABLE}_test && nft add flowtable ${ZAPRET_NFT_TABLE}_test ft "{ flags offload; $devices }" 2>/dev/null && res=0
|
|
||||||
nft delete table ${ZAPRET_NFT_TABLE}_test 2>/dev/null
|
|
||||||
return $res
|
|
||||||
}
|
|
||||||
|
|
||||||
nft_hw_offload_find_supported()
|
|
||||||
{
|
|
||||||
# $1,$2,... - interface names
|
|
||||||
local supported_list
|
|
||||||
while [ -n "$1" ]; do
|
|
||||||
nft_hw_offload_supported "$1" && append_separator_list supported_list ' ' '' "$1"
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
echo $supported_list
|
|
||||||
}
|
|
||||||
|
|
||||||
nft_apply_flow_offloading()
|
nft_apply_flow_offloading()
|
||||||
{
|
{
|
||||||
# ft can be absent
|
# ft can be absent
|
||||||
@@ -320,6 +312,10 @@ nft_filter_apply_ipset_target()
|
|||||||
nft_filter_apply_ipset_target6 $2
|
nft_filter_apply_ipset_target6 $2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nft_mark_filter()
|
||||||
|
{
|
||||||
|
[ -n "$FILTER_MARK" ] && echo "mark and $FILTER_MARK != 0"
|
||||||
|
}
|
||||||
|
|
||||||
nft_script_add_ifset_element()
|
nft_script_add_ifset_element()
|
||||||
{
|
{
|
||||||
@@ -342,7 +338,7 @@ nft_fill_ifsets()
|
|||||||
# $5 - space separated wan physical interface names (optional)
|
# $5 - space separated wan physical interface names (optional)
|
||||||
# $6 - space separated wan6 physical interface names (optional)
|
# $6 - space separated wan6 physical interface names (optional)
|
||||||
|
|
||||||
local script i j ALLDEVS devs
|
local script i j ALLDEVS devs b
|
||||||
|
|
||||||
# if large sets exist nft works very ineffectively
|
# if large sets exist nft works very ineffectively
|
||||||
# looks like it analyzes the whole table blob to find required data pieces
|
# looks like it analyzes the whole table blob to find required data pieces
|
||||||
@@ -370,17 +366,18 @@ flush set inet $ZAPRET_NFT_TABLE lanif"
|
|||||||
nft_create_or_update_flowtable 'offload' 2>/dev/null
|
nft_create_or_update_flowtable 'offload' 2>/dev/null
|
||||||
# then add elements. some of them can cause error because unsupported
|
# then add elements. some of them can cause error because unsupported
|
||||||
for i in $ALLDEVS; do
|
for i in $ALLDEVS; do
|
||||||
if nft_hw_offload_supported $i; then
|
# bridge members must be added instead of the bridge itself
|
||||||
nft_create_or_update_flowtable 'offload' $i
|
# some members may not support hw offload. example : lan1 lan2 lan3 support, wlan0 wlan1 - not
|
||||||
else
|
b=
|
||||||
# bridge members must be added instead of the bridge itself
|
devs=$(resolve_lower_devices $i)
|
||||||
# some members may not support hw offload. example : lan1 lan2 lan3 support, wlan0 wlan1 - not
|
for j in $devs; do
|
||||||
devs=$(resolve_lower_devices $i)
|
# do not display error if addition failed
|
||||||
for j in $devs; do
|
nft_create_or_update_flowtable 'offload' $j && b=1 2>/dev/null
|
||||||
# do not display error if addition failed
|
done
|
||||||
nft_create_or_update_flowtable 'offload' $j 2>/dev/null
|
[ -n "$b" ] || {
|
||||||
done
|
# no lower devices added ? try to add interface itself
|
||||||
fi
|
nft_create_or_update_flowtable 'offload' $i 2>/dev/null
|
||||||
|
}
|
||||||
done
|
done
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -410,9 +407,10 @@ _nft_fw_tpws4()
|
|||||||
|
|
||||||
[ "$DISABLE_IPV4" = "1" -o -z "$1" ] || {
|
[ "$DISABLE_IPV4" = "1" -o -z "$1" ] || {
|
||||||
local filter="$1" port="$2"
|
local filter="$1" port="$2"
|
||||||
|
local mark_filter=$(nft_mark_filter)
|
||||||
nft_print_op "$filter" "tpws (port $2)" 4
|
nft_print_op "$filter" "tpws (port $2)" 4
|
||||||
nft_insert_rule dnat_output skuid != $WS_USER ${3:+oifname @wanif }$filter ip daddr != @nozapret $FW_EXTRA_POST dnat ip to $TPWS_LOCALHOST4:$port
|
nft_insert_rule dnat_output skuid != $WS_USER ${3:+oifname @wanif} $mark_filter $filter ip daddr != @nozapret ip daddr != @ipban $FW_EXTRA_POST dnat ip to $TPWS_LOCALHOST4:$port
|
||||||
nft_insert_rule dnat_pre iifname @lanif $filter ip daddr != @nozapret $FW_EXTRA_POST dnat ip to $TPWS_LOCALHOST4:$port
|
nft_insert_rule dnat_pre iifname @lanif $mark_filter $filter ip daddr != @nozapret ip daddr != @ipban $FW_EXTRA_POST dnat ip to $TPWS_LOCALHOST4:$port
|
||||||
prepare_route_localnet
|
prepare_route_localnet
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -425,10 +423,11 @@ _nft_fw_tpws6()
|
|||||||
|
|
||||||
[ "$DISABLE_IPV6" = "1" -o -z "$1" ] || {
|
[ "$DISABLE_IPV6" = "1" -o -z "$1" ] || {
|
||||||
local filter="$1" port="$2" DNAT6 i
|
local filter="$1" port="$2" DNAT6 i
|
||||||
|
local mark_filter=$(nft_mark_filter)
|
||||||
nft_print_op "$filter" "tpws (port $port)" 6
|
nft_print_op "$filter" "tpws (port $port)" 6
|
||||||
nft_insert_rule dnat_output skuid != $WS_USER ${4:+oifname @wanif6 }$filter ip6 daddr != @nozapret6 $FW_EXTRA_POST dnat ip6 to [::1]:$port
|
nft_insert_rule dnat_output skuid != $WS_USER ${4:+oifname @wanif6} $mark_filter $filter ip6 daddr != @nozapret6 ip6 daddr != @ipban6 $FW_EXTRA_POST dnat ip6 to [::1]:$port
|
||||||
[ -n "$3" ] && {
|
[ -n "$3" ] && {
|
||||||
nft_insert_rule dnat_pre $filter ip6 daddr != @nozapret6 $FW_EXTRA_POST dnat ip6 to iifname map @link_local:$port
|
nft_insert_rule dnat_pre $mark_filter $filter ip6 daddr != @nozapret6 ip6 daddr != @ipban6 $FW_EXTRA_POST dnat ip6 to iifname map @link_local:$port
|
||||||
for i in $3; do
|
for i in $3; do
|
||||||
_dnat6_target $i DNAT6
|
_dnat6_target $i DNAT6
|
||||||
# can be multiple tpws processes on different ports
|
# can be multiple tpws processes on different ports
|
||||||
@@ -475,9 +474,9 @@ _nft_fw_nfqws_post4()
|
|||||||
[ "$DISABLE_IPV4" = "1" -o -z "$1" ] || {
|
[ "$DISABLE_IPV4" = "1" -o -z "$1" ] || {
|
||||||
local filter="$1" port="$2" rule chain=$(get_postchain) setmark
|
local filter="$1" port="$2" rule chain=$(get_postchain) setmark
|
||||||
nft_print_op "$filter" "nfqws postrouting (qnum $port)" 4
|
nft_print_op "$filter" "nfqws postrouting (qnum $port)" 4
|
||||||
rule="${3:+oifname @wanif }$filter ip daddr != @nozapret"
|
rule="${3:+oifname @wanif} $(nft_mark_filter) $filter ip daddr != @nozapret"
|
||||||
is_postnat && setmark="meta mark set meta mark or $DESYNC_MARK_POSTNAT"
|
is_postnat && setmark="meta mark set meta mark or $DESYNC_MARK_POSTNAT"
|
||||||
nft_insert_rule $chain $rule $setmark $FW_EXTRA_POST queue num $port bypass
|
nft_insert_rule $chain $rule $setmark $CONNMARKER $FW_EXTRA_POST queue num $port bypass
|
||||||
nft_add_nfqws_flow_exempt_rule "$rule"
|
nft_add_nfqws_flow_exempt_rule "$rule"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -490,9 +489,9 @@ _nft_fw_nfqws_post6()
|
|||||||
[ "$DISABLE_IPV6" = "1" -o -z "$1" ] || {
|
[ "$DISABLE_IPV6" = "1" -o -z "$1" ] || {
|
||||||
local filter="$1" port="$2" rule chain=$(get_postchain) setmark
|
local filter="$1" port="$2" rule chain=$(get_postchain) setmark
|
||||||
nft_print_op "$filter" "nfqws postrouting (qnum $port)" 6
|
nft_print_op "$filter" "nfqws postrouting (qnum $port)" 6
|
||||||
rule="${3:+oifname @wanif6 }$filter ip6 daddr != @nozapret6"
|
rule="${3:+oifname @wanif6} $(nft_mark_filter) $filter ip6 daddr != @nozapret6"
|
||||||
is_postnat && setmark="meta mark set meta mark or $DESYNC_MARK_POSTNAT"
|
is_postnat && setmark="meta mark set meta mark or $DESYNC_MARK_POSTNAT"
|
||||||
nft_insert_rule $chain $rule $setmark $FW_EXTRA_POST queue num $port bypass
|
nft_insert_rule $chain $rule $setmark $CONNMARKER $FW_EXTRA_POST queue num $port bypass
|
||||||
nft_add_nfqws_flow_exempt_rule "$rule"
|
nft_add_nfqws_flow_exempt_rule "$rule"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -515,8 +514,8 @@ _nft_fw_nfqws_pre4()
|
|||||||
[ "$DISABLE_IPV4" = "1" -o -z "$1" ] || {
|
[ "$DISABLE_IPV4" = "1" -o -z "$1" ] || {
|
||||||
local filter="$1" port="$2" rule
|
local filter="$1" port="$2" rule
|
||||||
nft_print_op "$filter" "nfqws prerouting (qnum $port)" 4
|
nft_print_op "$filter" "nfqws prerouting (qnum $port)" 4
|
||||||
rule="${3:+iifname @wanif }$filter ip saddr != @nozapret"
|
rule="${3:+iifname @wanif} $filter ip saddr != @nozapret"
|
||||||
nft_insert_rule $(get_prechain) $rule $FW_EXTRA_POST queue num $port bypass
|
nft_insert_rule $(get_prechain) $rule $CONNMARKER $FW_EXTRA_POST queue num $port bypass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_nft_fw_nfqws_pre6()
|
_nft_fw_nfqws_pre6()
|
||||||
@@ -528,8 +527,8 @@ _nft_fw_nfqws_pre6()
|
|||||||
[ "$DISABLE_IPV6" = "1" -o -z "$1" ] || {
|
[ "$DISABLE_IPV6" = "1" -o -z "$1" ] || {
|
||||||
local filter="$1" port="$2" rule
|
local filter="$1" port="$2" rule
|
||||||
nft_print_op "$filter" "nfqws prerouting (qnum $port)" 6
|
nft_print_op "$filter" "nfqws prerouting (qnum $port)" 6
|
||||||
rule="${3:+iifname @wanif6 }$filter ip6 saddr != @nozapret6"
|
rule="${3:+iifname @wanif6} $filter ip6 saddr != @nozapret6"
|
||||||
nft_insert_rule $(get_prechain) $rule $FW_EXTRA_POST queue num $port bypass
|
nft_insert_rule $(get_prechain) $rule $CONNMARKER $FW_EXTRA_POST queue num $port bypass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nft_fw_nfqws_pre()
|
nft_fw_nfqws_pre()
|
||||||
@@ -640,25 +639,31 @@ nft_apply_nfqws_in_out()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
zapret_apply_firewall_standard_rules_nft()
|
zapret_apply_firewall_standard_tpws_rules_nft()
|
||||||
{
|
{
|
||||||
local f4 f6
|
local f4 f6
|
||||||
|
|
||||||
[ "$TPWS_ENABLE" = 1 -a -n "$TPWS_PORTS" ] &&
|
[ "$TPWS_ENABLE" = 1 -a -n "$TPWS_PORTS" ] && {
|
||||||
{
|
|
||||||
f4="tcp dport {$TPWS_PORTS}"
|
f4="tcp dport {$TPWS_PORTS}"
|
||||||
f6=$f4
|
f6=$f4
|
||||||
nft_filter_apply_ipset_target f4 f6
|
nft_filter_apply_ipset_target f4 f6
|
||||||
nft_fw_tpws "$f4" "$f6" $TPPORT
|
nft_fw_tpws "$f4" "$f6" $TPPORT
|
||||||
}
|
}
|
||||||
[ "$NFQWS_ENABLE" = 1 ] &&
|
}
|
||||||
{
|
zapret_apply_firewall_standard_nfqws_rules_nft()
|
||||||
|
{
|
||||||
|
[ "$NFQWS_ENABLE" = 1 ] && {
|
||||||
nft_apply_nfqws_in_out tcp "$NFQWS_PORTS_TCP" "$NFQWS_TCP_PKT_OUT" "$NFQWS_TCP_PKT_IN"
|
nft_apply_nfqws_in_out tcp "$NFQWS_PORTS_TCP" "$NFQWS_TCP_PKT_OUT" "$NFQWS_TCP_PKT_IN"
|
||||||
nft_apply_nfqws_in_out tcp "$NFQWS_PORTS_TCP_KEEPALIVE" keepalive "$NFQWS_TCP_PKT_IN"
|
nft_apply_nfqws_in_out tcp "$NFQWS_PORTS_TCP_KEEPALIVE" keepalive "$NFQWS_TCP_PKT_IN"
|
||||||
nft_apply_nfqws_in_out udp "$NFQWS_PORTS_UDP" "$NFQWS_UDP_PKT_OUT" "$NFQWS_UDP_PKT_IN"
|
nft_apply_nfqws_in_out udp "$NFQWS_PORTS_UDP" "$NFQWS_UDP_PKT_OUT" "$NFQWS_UDP_PKT_IN"
|
||||||
nft_apply_nfqws_in_out udp "$NFQWS_PORTS_UDP_KEEPALIVE" keepalive "$NFQWS_UDP_PKT_IN"
|
nft_apply_nfqws_in_out udp "$NFQWS_PORTS_UDP_KEEPALIVE" keepalive "$NFQWS_UDP_PKT_IN"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
zapret_apply_firewall_standard_rules_nft()
|
||||||
|
{
|
||||||
|
zapret_apply_firewall_standard_tpws_rules_nft
|
||||||
|
zapret_apply_firewall_standard_nfqws_rules_nft
|
||||||
|
}
|
||||||
|
|
||||||
zapret_apply_firewall_rules_nft()
|
zapret_apply_firewall_rules_nft()
|
||||||
{
|
{
|
||||||
@@ -701,3 +706,7 @@ zapret_do_firewall_nft()
|
|||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ctmark is not available in POSTNAT mode
|
||||||
|
CONNMARKER=
|
||||||
|
[ "$FILTER_TTL_EXPIRED_ICMP" = 1 ] && is_postnat && CONNMARKER="ct mark set ct mark or $DESYNC_MARK"
|
||||||
|
|||||||
@@ -1,85 +0,0 @@
|
|||||||
apply_unspecified_desync_modes()
|
|
||||||
{
|
|
||||||
NFQWS_OPT_DESYNC_HTTP="${NFQWS_OPT_DESYNC_HTTP:-$NFQWS_OPT_DESYNC}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTP_SUFFIX="${NFQWS_OPT_DESYNC_HTTP_SUFFIX:-$NFQWS_OPT_DESYNC_SUFFIX}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS="${NFQWS_OPT_DESYNC_HTTPS:-$NFQWS_OPT_DESYNC}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS_SUFFIX="${NFQWS_OPT_DESYNC_HTTPS_SUFFIX:-$NFQWS_OPT_DESYNC_SUFFIX}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTP6="${NFQWS_OPT_DESYNC_HTTP6:-$NFQWS_OPT_DESYNC_HTTP}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTP6_SUFFIX="${NFQWS_OPT_DESYNC_HTTP6_SUFFIX:-$NFQWS_OPT_DESYNC_HTTP_SUFFIX}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS6="${NFQWS_OPT_DESYNC_HTTPS6:-$NFQWS_OPT_DESYNC_HTTPS}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS6_SUFFIX="${NFQWS_OPT_DESYNC_HTTPS6_SUFFIX:-$NFQWS_OPT_DESYNC_HTTPS_SUFFIX}"
|
|
||||||
NFQWS_OPT_DESYNC_QUIC6="${NFQWS_OPT_DESYNC_QUIC6:-$NFQWS_OPT_DESYNC_QUIC}"
|
|
||||||
NFQWS_OPT_DESYNC_QUIC6_SUFFIX="${NFQWS_OPT_DESYNC_QUIC6_SUFFIX:-$NFQWS_OPT_DESYNC_QUIC_SUFFIX}"
|
|
||||||
}
|
|
||||||
|
|
||||||
get_nfqws_qnums()
|
|
||||||
{
|
|
||||||
# $1 - var name for ipv4 http
|
|
||||||
# $2 - var name for ipv4 https
|
|
||||||
# $3 - var name for ipv6 http
|
|
||||||
# $4 - var name for ipv6 https
|
|
||||||
local _qn _qns _qn6 _qns6
|
|
||||||
|
|
||||||
[ "$DISABLE_IPV4" = "1" ] || {
|
|
||||||
_qn=$QNUM
|
|
||||||
_qns=$_qn
|
|
||||||
[ "$NFQWS_OPT_DESYNC_HTTP $NFQWS_OPT_DESYNC_HTTP_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTPS $NFQWS_OPT_DESYNC_HTTPS_SUFFIX" ] || _qns=$(($QNUM+1))
|
|
||||||
}
|
|
||||||
[ "$DISABLE_IPV6" = "1" ] || {
|
|
||||||
_qn6=$(($QNUM+2))
|
|
||||||
_qns6=$(($QNUM+3))
|
|
||||||
[ "$DISABLE_IPV4" = "1" ] || {
|
|
||||||
if [ "$NFQWS_OPT_DESYNC_HTTP6 $NFQWS_OPT_DESYNC_HTTP6_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTP $NFQWS_OPT_DESYNC_HTTP_SUFFIX" ]; then
|
|
||||||
_qn6=$_qn;
|
|
||||||
elif [ "$NFQWS_OPT_DESYNC_HTTP6 $NFQWS_OPT_DESYNC_HTTP6_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTPS $NFQWS_OPT_DESYNC_HTTPS_SUFFIX" ]; then
|
|
||||||
_qn6=$_qns;
|
|
||||||
fi
|
|
||||||
if [ "$NFQWS_OPT_DESYNC_HTTPS6 $NFQWS_OPT_DESYNC_HTTPS6_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTP $NFQWS_OPT_DESYNC_HTTP_SUFFIX" ]; then
|
|
||||||
_qns6=$_qn;
|
|
||||||
elif [ "$NFQWS_OPT_DESYNC_HTTPS6 $NFQWS_OPT_DESYNC_HTTPS6_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTPS $NFQWS_OPT_DESYNC_HTTPS_SUFFIX" ]; then
|
|
||||||
_qns6=$_qns;
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
[ "$NFQWS_OPT_DESYNC_HTTPS6 $NFQWS_OPT_DESYNC_HTTPS6_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTP6 $NFQWS_OPT_DESYNC_HTTP6_SUFFIX" ] && _qns6=$_qn6;
|
|
||||||
}
|
|
||||||
if [ "$MODE_HTTP" = 1 ]; then
|
|
||||||
eval $1=$_qn
|
|
||||||
eval $3=$_qn6
|
|
||||||
else
|
|
||||||
eval $1=
|
|
||||||
eval $3=
|
|
||||||
fi
|
|
||||||
if [ "$MODE_HTTPS" = 1 ]; then
|
|
||||||
eval $2=$_qns
|
|
||||||
eval $4=$_qns6
|
|
||||||
else
|
|
||||||
eval $2=
|
|
||||||
eval $4=
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_nfqws_qnums_quic()
|
|
||||||
{
|
|
||||||
# $1 - var name for ipv4 quic
|
|
||||||
# $2 - var name for ipv6 quic
|
|
||||||
local _qn _qn6
|
|
||||||
|
|
||||||
[ "$DISABLE_IPV4" = "1" ] || {
|
|
||||||
_qn=$(($QNUM+10))
|
|
||||||
}
|
|
||||||
[ "$DISABLE_IPV6" = "1" ] || {
|
|
||||||
_qn6=$(($QNUM+11))
|
|
||||||
[ "$DISABLE_IPV4" = "1" ] || {
|
|
||||||
if [ "$NFQWS_OPT_DESYNC_QUIC $NFQWS_OPT_DESYNC_QUIC_SUFFIX" = "$NFQWS_OPT_DESYNC_QUIC6 $NFQWS_OPT_DESYNC_QUIC6_SUFFIX" ]; then
|
|
||||||
_qn6=$_qn;
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if [ "$MODE_QUIC" = 1 ]; then
|
|
||||||
eval $1=$_qn
|
|
||||||
eval $2=$_qn6
|
|
||||||
else
|
|
||||||
eval $1=
|
|
||||||
eval $2=
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
+16
-5
@@ -47,6 +47,12 @@ GZIP_LISTS=1
|
|||||||
DESYNC_MARK=0x40000000
|
DESYNC_MARK=0x40000000
|
||||||
DESYNC_MARK_POSTNAT=0x20000000
|
DESYNC_MARK_POSTNAT=0x20000000
|
||||||
|
|
||||||
|
# do not pass outgoing traffic to tpws/nfqws not marked with this bit
|
||||||
|
# this setting allows to write your own rules to limit traffic that should be fooled
|
||||||
|
# for example based on source IP or incoming interface name
|
||||||
|
# no filter if not defined
|
||||||
|
#FILTER_MARK=0x10000000
|
||||||
|
|
||||||
TPWS_SOCKS_ENABLE=0
|
TPWS_SOCKS_ENABLE=0
|
||||||
# tpws socks listens on this port on localhost and LAN interfaces
|
# tpws socks listens on this port on localhost and LAN interfaces
|
||||||
TPPORT_SOCKS=987
|
TPPORT_SOCKS=987
|
||||||
@@ -55,7 +61,7 @@ TPPORT_SOCKS=987
|
|||||||
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
||||||
TPWS_SOCKS_OPT="
|
TPWS_SOCKS_OPT="
|
||||||
--filter-tcp=80 --methodeol <HOSTLIST> --new
|
--filter-tcp=80 --methodeol <HOSTLIST> --new
|
||||||
--filter-tcp=443 --split-tls=sni --disorder <HOSTLIST>
|
--filter-tcp=443 --split-pos=1,midsld --disorder <HOSTLIST>
|
||||||
"
|
"
|
||||||
|
|
||||||
TPWS_ENABLE=0
|
TPWS_ENABLE=0
|
||||||
@@ -65,7 +71,7 @@ TPWS_PORTS=80,443
|
|||||||
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
||||||
TPWS_OPT="
|
TPWS_OPT="
|
||||||
--filter-tcp=80 --methodeol <HOSTLIST> --new
|
--filter-tcp=80 --methodeol <HOSTLIST> --new
|
||||||
--filter-tcp=443 --split-tls=sni --disorder <HOSTLIST>
|
--filter-tcp=443 --split-pos=1,midsld --disorder <HOSTLIST>
|
||||||
"
|
"
|
||||||
|
|
||||||
NFQWS_ENABLE=0
|
NFQWS_ENABLE=0
|
||||||
@@ -89,15 +95,15 @@ NFQWS_UDP_PKT_IN=0
|
|||||||
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy
|
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy
|
||||||
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
||||||
NFQWS_OPT="
|
NFQWS_OPT="
|
||||||
--filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-fooling=md5sig <HOSTLIST> --new
|
--filter-tcp=80 --dpi-desync=fake,multisplit --dpi-desync-split-pos=method+2 --dpi-desync-fooling=md5sig <HOSTLIST> --new
|
||||||
--filter-tcp=443 --dpi-desync=fake,disorder2 --dpi-desync-fooling=md5sig <HOSTLIST> --new
|
--filter-tcp=443 --dpi-desync=fake,multidisorder --dpi-desync-split-pos=1,midsld --dpi-desync-fooling=badseq,md5sig <HOSTLIST> --new
|
||||||
--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=6 <HOSTLIST_NOAUTO>
|
--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=6 <HOSTLIST_NOAUTO>
|
||||||
"
|
"
|
||||||
|
|
||||||
# none,ipset,hostlist,autohostlist
|
# none,ipset,hostlist,autohostlist
|
||||||
MODE_FILTER=none
|
MODE_FILTER=none
|
||||||
|
|
||||||
# openwrt only : donttouch,none,software,hardware
|
# donttouch,none,software,hardware
|
||||||
FLOWOFFLOAD=donttouch
|
FLOWOFFLOAD=donttouch
|
||||||
|
|
||||||
# openwrt: specify networks to be treated as LAN. default is "lan"
|
# openwrt: specify networks to be treated as LAN. default is "lan"
|
||||||
@@ -129,6 +135,11 @@ INIT_APPLY_FW=1
|
|||||||
# do not work with ipv6
|
# do not work with ipv6
|
||||||
DISABLE_IPV6=1
|
DISABLE_IPV6=1
|
||||||
|
|
||||||
|
# drop icmp time exceeded messages for nfqws tampered connections
|
||||||
|
# in POSTNAT mode this can interfere with default mtr/traceroute in tcp or udp mode. use source port not redirected to nfqws
|
||||||
|
# set to 0 if you are not expecting connection breakage due to icmp in response to TCP SYN or UDP
|
||||||
|
FILTER_TTL_EXPIRED_ICMP=1
|
||||||
|
|
||||||
# select which init script will be used to get ip or host list
|
# select which init script will be used to get ip or host list
|
||||||
# possible values : get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh get_hostlist.sh
|
# possible values : get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh get_hostlist.sh
|
||||||
# comment if not required
|
# comment if not required
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2016-2021 bol-van
|
Copyright (c) 2016-2024 bol-van
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
+27
-9
@@ -100,7 +100,7 @@ Later you will add ipfw commands to `/etc/rc.firewall.my` to be reapplied after
|
|||||||
You can also run zapret daemons from there. Start them with `--daemon` options, for example
|
You can also run zapret daemons from there. Start them with `--daemon` options, for example
|
||||||
```
|
```
|
||||||
pkill ^dvtws$
|
pkill ^dvtws$
|
||||||
/opt/zapret/nfq/dvtws --port=989 --daemon --dpi-desync=split2
|
/opt/zapret/nfq/dvtws --port=989 --daemon --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
To restart firewall and daemons run : `/etc/rc.d/ipfw restart`
|
To restart firewall and daemons run : `/etc/rc.d/ipfw restart`
|
||||||
@@ -157,7 +157,7 @@ ipfw delete 100
|
|||||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg xmit em0
|
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg xmit em0
|
||||||
# required for autottl mode only
|
# required for autottl mode only
|
||||||
ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
||||||
/opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
/opt/zapret/nfq/dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
Process only table zapret with the exception of table nozapret:
|
Process only table zapret with the exception of table nozapret:
|
||||||
@@ -167,7 +167,7 @@ ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
|||||||
ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0
|
ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0
|
||||||
# required for autottl mode only
|
# required for autottl mode only
|
||||||
ipfw add 100 divert 989 tcp from table\(zapret\) 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
ipfw add 100 divert 989 tcp from table\(zapret\) 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
||||||
/opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
/opt/zapret/nfq/dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
Reinjection loop avoidance. FreeBSD artificially ignores sockarg for ipv6 in
|
Reinjection loop avoidance. FreeBSD artificially ignores sockarg for ipv6 in
|
||||||
@@ -245,7 +245,7 @@ sysctl net.inet6.ip6.pfil.inbound=ipfw,pf
|
|||||||
ipfw delete 100
|
ipfw delete 100
|
||||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg xmit em0
|
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg xmit em0
|
||||||
pkill ^dvtws$
|
pkill ^dvtws$
|
||||||
dvtws --daemon --port 989 --dpi-desync=split2
|
dvtws --daemon --port 989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
|
|
||||||
# required for newer pfsense versions (2.6.0 tested) to return ipfw to functional state
|
# required for newer pfsense versions (2.6.0 tested) to return ipfw to functional state
|
||||||
pfctl -d ; pfctl -e
|
pfctl -d ; pfctl -e
|
||||||
@@ -280,7 +280,7 @@ Autostart `/usr/local/etc/rc.d/zapret.sh`:
|
|||||||
```
|
```
|
||||||
pfctl -a zapret -f /etc/zapret.anchor
|
pfctl -a zapret -f /etc/zapret.anchor
|
||||||
pkill ^tpws$
|
pkill ^tpws$
|
||||||
tpws --daemon --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force --split-http-req=method --split-pos=2
|
tpws --daemon --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force --split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
After reboot check that anchor is created and referred from the main ruleset:
|
After reboot check that anchor is created and referred from the main ruleset:
|
||||||
@@ -312,7 +312,7 @@ In OpenBSD default `tpws` bind is ipv6 only. To bind to ipv4 specify
|
|||||||
Use `--bind-addr=0.0.0.0 --bind-addr=::` to achieve the same default bind as in
|
Use `--bind-addr=0.0.0.0 --bind-addr=::` to achieve the same default bind as in
|
||||||
others OSes.
|
others OSes.
|
||||||
|
|
||||||
`tpws` for forwarded traffic only :
|
`tpws` for forwarded traffic only (OLDER OS versions):
|
||||||
|
|
||||||
`/etc/pf.conf`:
|
`/etc/pf.conf`:
|
||||||
```
|
```
|
||||||
@@ -323,13 +323,31 @@ pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988
|
|||||||
Then:
|
Then:
|
||||||
```
|
```
|
||||||
pfctl -f /etc/pf.conf
|
pfctl -f /etc/pf.conf
|
||||||
tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 --enable-pf
|
||||||
```
|
```
|
||||||
|
|
||||||
Its not clear how to do rdr-to outgoing traffic. I could not make route-to
|
Its not clear how to do rdr-to outgoing traffic. I could not make route-to
|
||||||
scheme work. rdr-to support is done using /dev/pf, that's why transparent mode
|
scheme work. rdr-to support is done using /dev/pf, that's why transparent mode
|
||||||
requires root.
|
requires root.
|
||||||
|
|
||||||
|
`tpws` for forwarded traffic only (NEWER OS versions):
|
||||||
|
|
||||||
|
```
|
||||||
|
pass on em1 inet proto tcp to port {80,443} divert-to 127.0.0.1 port 989
|
||||||
|
pass on em1 inet6 proto tcp to port {80,443} divert-to ::1 port 989
|
||||||
|
```
|
||||||
|
|
||||||
|
Then:
|
||||||
|
```
|
||||||
|
pfctl -f /etc/pf.conf
|
||||||
|
tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
tpws must be bound exactly to diverted IPs, not `0.0.0.0` or `::`.
|
||||||
|
|
||||||
|
It's also not clear how to divert connections from local system.
|
||||||
|
|
||||||
|
|
||||||
`dvtws` for all traffic:
|
`dvtws` for all traffic:
|
||||||
|
|
||||||
`/etc/pf.conf`:
|
`/etc/pf.conf`:
|
||||||
@@ -342,7 +360,7 @@ pass out quick on em0 proto tcp to port {80,443} divert-packet port 989
|
|||||||
Then:
|
Then:
|
||||||
```
|
```
|
||||||
pfctl -f /etc/pf.conf
|
pfctl -f /etc/pf.conf
|
||||||
./dvtws --port=989 --dpi-desync=split2
|
./dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
`dwtws` only for table zapret with the exception of table nozapret :
|
`dwtws` only for table zapret with the exception of table nozapret :
|
||||||
@@ -375,7 +393,7 @@ pass out quick on em0 inet6 proto tcp to <zapret6-user> port {80,443} divert-p
|
|||||||
Then:
|
Then:
|
||||||
```
|
```
|
||||||
pfctl -f /etc/pf.conf
|
pfctl -f /etc/pf.conf
|
||||||
./dvtws --port=989 --dpi-desync=split2
|
./dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
divert-packet automatically adds the reverse rule. By default also incoming
|
divert-packet automatically adds the reverse rule. By default also incoming
|
||||||
|
|||||||
+36
-11
@@ -19,7 +19,8 @@
|
|||||||
* [pfsense](#pfsense)
|
* [pfsense](#pfsense)
|
||||||
* [OpenBSD](#openbsd)
|
* [OpenBSD](#openbsd)
|
||||||
* [tpws bind на ipv4](#tpws-bind-на-ipv4)
|
* [tpws bind на ipv4](#tpws-bind-на-ipv4)
|
||||||
* [tpws для проходящего трафика](#tpws-для-проходящего-трафика)
|
* [tpws для проходящего трафика (старые системы)](#tpws-для-проходящего-трафика-старая-схема-не-работает-в-новых-версиях))
|
||||||
|
* [tpws для проходящего трафика (новые системы)](#tpws-для-проходящего-трафика-новые-системы))
|
||||||
* [Запуск dvtws](#запуск-dvtws)
|
* [Запуск dvtws](#запуск-dvtws)
|
||||||
* [Проблемы с badsum](#проблемы-с-badsum)
|
* [Проблемы с badsum](#проблемы-с-badsum)
|
||||||
* [Особенность отправки fake пакетов](#особенность-отправки-fake-пакетов)
|
* [Особенность отправки fake пакетов](#особенность-отправки-fake-пакетов)
|
||||||
@@ -143,7 +144,7 @@ $ ipfw -q -f flush
|
|||||||
zapret, добавив в параметры `--daemon`. Например так:
|
zapret, добавив в параметры `--daemon`. Например так:
|
||||||
```sh
|
```sh
|
||||||
$ pkill ^dvtws$
|
$ pkill ^dvtws$
|
||||||
$ /opt/zapret/nfq/dvtws --port=989 --daemon --dpi-desync=split2
|
$ /opt/zapret/nfq/dvtws --port=989 --daemon --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
Для перезапуска фаервола и демонов достаточно будет сделать:
|
Для перезапуска фаервола и демонов достаточно будет сделать:
|
||||||
@@ -209,7 +210,7 @@ $ ipfw delete 100
|
|||||||
$ ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
$ ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
||||||
# required for autottl mode only
|
# required for autottl mode only
|
||||||
$ ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv em0
|
$ ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv em0
|
||||||
$ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
$ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Трафик только на таблицу zapret, за исключением таблицы nozapret
|
#### Трафик только на таблицу zapret, за исключением таблицы nozapret
|
||||||
@@ -220,7 +221,7 @@ $ ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
|||||||
$ ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0
|
$ ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0
|
||||||
# required for autottl mode only
|
# required for autottl mode only
|
||||||
$ ipfw add 100 divert 989 tcp from table\(zapret\) 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
$ ipfw add 100 divert 989 tcp from table\(zapret\) 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
||||||
$ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
$ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -317,7 +318,7 @@ sysctl net.inet6.ip6.pfil.inbound=ipfw,pf
|
|||||||
ipfw delete 100
|
ipfw delete 100
|
||||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
||||||
pkill ^dvtws$
|
pkill ^dvtws$
|
||||||
dvtws --daemon --port 989 --dpi-desync=split2
|
dvtws --daemon --port 989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
|
|
||||||
# required for newer pfsense versions (2.6.0 tested) to return ipfw to functional state
|
# required for newer pfsense versions (2.6.0 tested) to return ipfw to functional state
|
||||||
pfctl -d ; pfctl -e
|
pfctl -d ; pfctl -e
|
||||||
@@ -357,7 +358,7 @@ rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::20c:29ff:5ae3:4821 por
|
|||||||
```sh
|
```sh
|
||||||
$ pfctl -a zapret -f /etc/zapret.anchor
|
$ pfctl -a zapret -f /etc/zapret.anchor
|
||||||
$ pkill ^tpws$
|
$ pkill ^tpws$
|
||||||
$ tpws --daemon --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force --split-http-req=method --split-pos=2
|
$ tpws --daemon --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force --split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
4. После перезагрузки проверьте, что правила создались:
|
4. После перезагрузки проверьте, что правила создались:
|
||||||
@@ -392,7 +393,11 @@ rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5
|
|||||||
Но лучше все же так не делать, а сажать на определенные внутренние адреса или интерфейсы.
|
Но лучше все же так не делать, а сажать на определенные внутренние адреса или интерфейсы.
|
||||||
|
|
||||||
|
|
||||||
### tpws для проходящего трафика
|
### tpws для проходящего трафика (старая схема не работает в новых версиях)
|
||||||
|
|
||||||
|
В этом варианте tpws обращается явно к редиректору pf и пытается от него получить оригинальный адрес назначения.
|
||||||
|
Как показывает практика, это не работает на новых версиях OpenBSD. Возвращается ошибка ioctl.
|
||||||
|
Последняя проверенная версия, где это работает, - 6.8 . Между 6.8 и 7.4 разработчики сломали этот механизм.
|
||||||
|
|
||||||
`/etc/pf.conf`:
|
`/etc/pf.conf`:
|
||||||
```
|
```
|
||||||
@@ -402,15 +407,35 @@ pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ pfctl -f /etc/pf.conf
|
$ pfctl -f /etc/pf.conf
|
||||||
$ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
$ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 --enable-pf
|
||||||
```
|
```
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> В PF не выходит делать rdr-to с той же системы, где работает proxy.
|
> В PF не выходит делать rdr-to с той же системы, где работает proxy.
|
||||||
> Вариант с route-to не сохраняет мета информацию. Адрес назначения теряется.
|
> Вариант с route-to не сохраняет мета информацию. Адрес назначения теряется.
|
||||||
> Поэтому этот вариант годится для squid, берущего адрес из протокола прикладного уровня, но не годится для tpws, полагающегося на метаданные ОС.
|
> Поэтому этот вариант годится для squid, берущего адрес из протокола прикладного уровня, но не годится для tpws, полагающегося на метаданные ОС.
|
||||||
> Поддержка rdr-to реализована через `/dev/pf`, поэтому прозрачный режим **требует root**.
|
> Поддержка rdr-to реализована через `/dev/pf`, поэтому прозрачный режим **требует root**.
|
||||||
|
|
||||||
|
### tpws для проходящего трафика (новые системы)
|
||||||
|
|
||||||
|
В новых версиях предлагается использовать divert-to вместо rdr-to.
|
||||||
|
Минимально проверенная версия, где это работает, 7.4. Может работать или не работать на более старых - исследование не проводилось.
|
||||||
|
|
||||||
|
`/etc/pf.conf`:
|
||||||
|
```
|
||||||
|
pass on em1 inet proto tcp to port {80,443} divert-to 127.0.0.1 port 989
|
||||||
|
pass on em1 inet6 proto tcp to port {80,443} divert-to ::1 port 989
|
||||||
|
```
|
||||||
|
|
||||||
|
tpws должен иметь бинд на точно такой адрес, который указан в правилах pf. `0.0.0.0` или `::` не работает.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ pfctl -f /etc/pf.conf
|
||||||
|
$ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Так же не понятно как делать divert с самой системы, где работает tpws.
|
||||||
|
|
||||||
### Запуск dvtws
|
### Запуск dvtws
|
||||||
|
|
||||||
@@ -424,7 +449,7 @@ pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no sta
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ pfctl -f /etc/pf.conf
|
$ pfctl -f /etc/pf.conf
|
||||||
$ ./dvtws --port=989 --dpi-desync=split2
|
$ ./dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Трафик только на таблицу zapret, за исключением таблицы nozapret
|
#### Трафик только на таблицу zapret, за исключением таблицы nozapret
|
||||||
@@ -456,7 +481,7 @@ pass out quick on em0 inet6 proto tcp to <zapret6-user> port {80,443} divert-p
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ pfctl -f /etc/pf.conf
|
$ pfctl -f /etc/pf.conf
|
||||||
$ ./dvtws --port=989 --dpi-desync=split2
|
$ ./dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+14
-1
@@ -56,21 +56,34 @@ sysctl net.inet6.ip6.forwarding=1
|
|||||||
|
|
||||||
OpenBSD PF :
|
OpenBSD PF :
|
||||||
|
|
||||||
|
(OLD OpenBSD versions)
|
||||||
|
|
||||||
; dont know how to rdr-to from local system. doesn't seem to work. only works for routed traffic.
|
; dont know how to rdr-to from local system. doesn't seem to work. only works for routed traffic.
|
||||||
|
|
||||||
/etc/pf.conf
|
/etc/pf.conf
|
||||||
pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988
|
pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988
|
||||||
pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988
|
pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988
|
||||||
pfctl -f /etc/pf.conf
|
pfctl -f /etc/pf.conf
|
||||||
|
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 --enable-pf
|
||||||
|
|
||||||
|
(NEW OpenBSD versions)
|
||||||
|
|
||||||
|
; dont know how to divert-to from local system
|
||||||
|
|
||||||
|
/etc/pf.conf
|
||||||
|
pass on em1 inet proto tcp to port {80,443} divert-to 127.0.0.1 port 989
|
||||||
|
pass on em1 inet6 proto tcp to port {80,443} divert-to ::1 port 989
|
||||||
|
pfctl -f /etc/pf.conf
|
||||||
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||||
|
|
||||||
|
|
||||||
; dvtws works both for routed and local
|
; dvtws works both for routed and local
|
||||||
|
|
||||||
pass in quick on em0 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state
|
pass in quick on em0 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state
|
||||||
pass in quick on em0 proto tcp from port {80,443} no state
|
pass in quick on em0 proto tcp from port {80,443} no state
|
||||||
pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state
|
pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state
|
||||||
pfctl -f /etc/pf.conf
|
pfctl -f /etc/pf.conf
|
||||||
./dvtws --port=989 --dpi-desync=split2
|
./dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
|
||||||
|
|
||||||
; dvtws with table limitations : to zapret,zapret6 but not to nozapret,nozapret6
|
; dvtws with table limitations : to zapret,zapret6 but not to nozapret,nozapret6
|
||||||
; reload tables : pfctl -f /etc/pf.conf
|
; reload tables : pfctl -f /etc/pf.conf
|
||||||
|
|||||||
@@ -363,3 +363,226 @@ nfqws,tpws: use alternate $ sign for $<config_file>
|
|||||||
repo: binaries removed from repo. git actions binaries build in releases.
|
repo: binaries removed from repo. git actions binaries build in releases.
|
||||||
uninstall_easy.sh: offer to remove dependencies in openwrt
|
uninstall_easy.sh: offer to remove dependencies in openwrt
|
||||||
install_easy.sh: allow to download lists in autohostlist filter mode
|
install_easy.sh: allow to download lists in autohostlist filter mode
|
||||||
|
|
||||||
|
v69:
|
||||||
|
|
||||||
|
nfqws, tpws: multisplit/multidisorder support.
|
||||||
|
nfqws: name change split->fakedsplit, disorder->fakeddisorder. compat : old names are synonyms
|
||||||
|
nfqws: --dpi-desync-split-http-req, --dpi-desync-split-tls deprecated. compat : these parameters add split point to multisplit.
|
||||||
|
nfqws: --dpi-desync=split2|disorder2 deprecated. compat: they are now synonyms for multisplit/multidisorder
|
||||||
|
nfqws: cancel seqovl if MTU is exceeded (linux only). cancel seqovl for disorder if seqovl>=first_part_size.
|
||||||
|
nfqws: fixed splits in multiple TLS segments.
|
||||||
|
tpws: --split-http-req,--split-tls deprecated. compat : these parameters add split point to multisplit.
|
||||||
|
tpws: --tlsrec now takes pos markers. compat : old names are converted to pos markers
|
||||||
|
tpws: --tlsrec-pos deprecated. compat : sets absolute pos marker
|
||||||
|
nfqws,tpws: chown autohostlist, autohostlist debug log and debug log files after options parse
|
||||||
|
nfqws,tpws: set EXEDIR env var to use in @config (won't work for stadalone winws without /bin/sh)
|
||||||
|
dvtws: set random/increasing ip_id value in generated packets
|
||||||
|
mdig: fixed parsing of DNS reply in windows (stdin is opened as text, not binary)
|
||||||
|
tpws: support compile for android NDK api level >= 21 (Android 5.0)
|
||||||
|
tpws: --fix-seg segmentation fixer
|
||||||
|
repo: build for android NDK api level 21 (Android 5.0)
|
||||||
|
install_easy: support for APK package manager in openwrt
|
||||||
|
blockcheck: removed ignore CA question
|
||||||
|
blockcheck: removed IGNORE_CA, CURL_VERBOSE
|
||||||
|
blockcheck: added CURL_OPT
|
||||||
|
blockcheck: new strategies support
|
||||||
|
blockcheck: test sequence rework
|
||||||
|
blockcheck: view all working strategies in summary
|
||||||
|
|
||||||
|
v69.1:
|
||||||
|
|
||||||
|
init.d: keenetic udp fix custom
|
||||||
|
tpws: fixed incorrect hostlist checks
|
||||||
|
|
||||||
|
v69.2:
|
||||||
|
|
||||||
|
nfqws,tpws: --skip
|
||||||
|
nfqws: --methodeol
|
||||||
|
init.d: do not use pgrep in sysv for busybox compat
|
||||||
|
|
||||||
|
v69.3
|
||||||
|
|
||||||
|
nfqws,tpws: fixed ipsets and hostlists
|
||||||
|
all progs: version numbers for github, build date/time for self built
|
||||||
|
repo: light release for openwrt and embedded systems
|
||||||
|
repo: sha256sum
|
||||||
|
|
||||||
|
v69.4
|
||||||
|
|
||||||
|
nfqws: fakedsplit/fakeddisorder fakes for both split segments
|
||||||
|
nfqws: --dpi-desync-fakedsplit-pattern
|
||||||
|
|
||||||
|
v69.5
|
||||||
|
|
||||||
|
nfqws,tpws: --dry-run
|
||||||
|
install_easy: check tpws and nfqws options validity
|
||||||
|
|
||||||
|
v69.6
|
||||||
|
|
||||||
|
nfqws: set NETLINK_NO_ENOBUFS to fix possible nfq recv errors
|
||||||
|
init.d: unify custom scripts for linux
|
||||||
|
init.d: new custom scripts : 20-fw-extra, 50-wg4all
|
||||||
|
|
||||||
|
v69.7
|
||||||
|
|
||||||
|
nfqws,tpws: --comment
|
||||||
|
nfqws: trash flood warning
|
||||||
|
winws: exclude empty outgoing ack packets in windivert filter
|
||||||
|
|
||||||
|
v69.8
|
||||||
|
|
||||||
|
winws: accept empty outgoing RST and FIN packets for conntrack needs
|
||||||
|
repo: lexra build
|
||||||
|
|
||||||
|
v69.9
|
||||||
|
|
||||||
|
init.d: exclude ipban from tpws redirection
|
||||||
|
macos: fix install_easy
|
||||||
|
macos: fix national decimal separator in sleep
|
||||||
|
ipset: scripts maintenance
|
||||||
|
|
||||||
|
v70
|
||||||
|
|
||||||
|
blockcheck: override all dialog questions and enable batch mode
|
||||||
|
blockcheck: parallel attempts
|
||||||
|
nfqws: weaken wireguard initiation recognition. use len=148 and data[0]=1 signature
|
||||||
|
nfqws: apply split+seqovl only to the first reasm fragment
|
||||||
|
install_easy: dnf packager support
|
||||||
|
nfqws,tpws: hostlist/ipset track not only file mod time but also file size
|
||||||
|
nfqws,tpws,ipset: return lists reload on HUP
|
||||||
|
nfqws,blockcheck: --dpi-desync-fake-tls-mod
|
||||||
|
|
||||||
|
v70.1
|
||||||
|
|
||||||
|
nfqws: --dpi-desync-fake-tls-mod=dupsid
|
||||||
|
nfqws,tpws: test accessibility of list files after privs drop
|
||||||
|
nfqws,tpws: --version
|
||||||
|
|
||||||
|
v70.4
|
||||||
|
|
||||||
|
nfqws,tpws: ^ prefix in hostlist to disable subdomain matches
|
||||||
|
nfqws,tpws: optional systemd notify support. compile using 'make systemd'
|
||||||
|
nfqws,tpws: systemd instance templates for nfqws and tpws
|
||||||
|
nfqws,tpws: separate droproot from dropcaps
|
||||||
|
tpws: detect WSL 1 and warn about non-working options
|
||||||
|
|
||||||
|
v70.5
|
||||||
|
|
||||||
|
nfqws: multiple --dpi-desync-fake-xxx
|
||||||
|
nfqws: support of inter-packet fragmented QUIC CRYPTO
|
||||||
|
|
||||||
|
v70.6
|
||||||
|
|
||||||
|
nfqws: detect Discord Voice IP discovery packets
|
||||||
|
nfqws: detect STUN message packets
|
||||||
|
nfqws: change SNI to specified value tls mod : --dpi-desync-fake-tls-mod sni=<sni>
|
||||||
|
nfqws: update default TLS ClientHello fake. firefox 136.0.4 finger, no kyber, SNI=microsoft.com
|
||||||
|
nfqws: multiple mods for multiple TLS fakes
|
||||||
|
init.d: remove 50-discord
|
||||||
|
blockcheck: use tpws --fix-seg on linux for multiple splits
|
||||||
|
|
||||||
|
v71
|
||||||
|
|
||||||
|
nfqws,tpws: debug tls version, alpn, ech
|
||||||
|
nfqws: --dpi-desync-fake-tls=! means default tls fake
|
||||||
|
nfqws: --dup*
|
||||||
|
nfqws: --orig*
|
||||||
|
nfqws: ipcache of hop count and host names
|
||||||
|
nfqws: --ctrack-disable
|
||||||
|
nfqws: --synack-split
|
||||||
|
nfqws: --autottl=- or --autottl=0:0-0 disable autottl. previous "0" does not work anymore.
|
||||||
|
tpws: ipcache of host names
|
||||||
|
nfqws,tpws: set 1024 repeat limit to fakes and dups
|
||||||
|
nfqws,tpws: do more before daemonize
|
||||||
|
nfqws,tpws: accept multiple gids in --gid
|
||||||
|
nfqws,tpws: display "android" in version string if built for android
|
||||||
|
init.d: remove --ipset parameter prohibition
|
||||||
|
init.d, blockcheck: drop time exceeded icmp for nfqws-related connections
|
||||||
|
blockcheck: some dup and orig-ttl mods
|
||||||
|
blockcheck: PKTWS_EXTRA_PRE
|
||||||
|
blockcheck: report test function and domain every test
|
||||||
|
|
||||||
|
v71.1
|
||||||
|
|
||||||
|
nfqws,tpws: much faster ipset implementation. move from hash to avl tree
|
||||||
|
nfqws,tpws: check list files accessibility with dropped privs in --dry-run mode
|
||||||
|
nfqws,tpws: --debug=android for NDK builds
|
||||||
|
nfqws,tpws: use initgroups instead of setgroups if --user specified
|
||||||
|
nfqws: --filter-ssid (linux-only)
|
||||||
|
install_easy: stop if running embedded release on traditional linux system (some files missing)
|
||||||
|
install_bin: add "read elf" arch detection method
|
||||||
|
binaries: renamed arch dirs in binaries
|
||||||
|
|
||||||
|
v71.1.1
|
||||||
|
|
||||||
|
nfqws: use wireless ext in case nl80211 does not return SSID
|
||||||
|
|
||||||
|
v71.2
|
||||||
|
|
||||||
|
nfqws: apply udp desync to replayed packets with non-zero reasm offset (except fake)
|
||||||
|
blockcheck: display curl version and kernel version
|
||||||
|
install_bin: stop if no binaries found. display help text.
|
||||||
|
winws: increase buffers for port filter
|
||||||
|
tpws: tpws no more opens /dev/pf in OpenBSD by default. requires --enable-pf like in FreeBSD. this is migration from rdr-to to divert-to redirection scheme.
|
||||||
|
install_easy: warn if --ipset parameter is specified
|
||||||
|
|
||||||
|
v71.3
|
||||||
|
|
||||||
|
init.d: FILTER_MARK
|
||||||
|
nfqws: ts fooling
|
||||||
|
blockcheck: test ts fooling
|
||||||
|
blockcheck: auto enable tcp timestamps in windows
|
||||||
|
tpws,nfqws: special handling of IP-like hostnames. strip :port from hostname:port
|
||||||
|
|
||||||
|
v71.4
|
||||||
|
|
||||||
|
nfqws,tpws: fix possible crashes or high memory usage if hostlist has duplicate hostnames
|
||||||
|
init.d: custom scripts 50-discord-media, 50-stun4all
|
||||||
|
init.d: windivert filters for discord media, stun, wireguard
|
||||||
|
readme: hardware problems description
|
||||||
|
|
||||||
|
v72
|
||||||
|
|
||||||
|
winws: --wf-raw-part
|
||||||
|
nfqws: --dpi-desync=hostfakesplit
|
||||||
|
nfqws: --dpi-desync-fake-tcp-mod=seq
|
||||||
|
nfqws: --dpi-desync-fake-tls=!+offset , --dpi-desync-fake-xxx=[+offset]@filename
|
||||||
|
nfqws: --dpi-desync-fakedsplit-mod=altorder for fakedsplit/fakeddisorder
|
||||||
|
nfqws: --dpi-desync-hostfakesplit-mod=altorder
|
||||||
|
nfqws: fakedsplit/fakeddisorder normalize fake split pattern offset to reasm offset
|
||||||
|
nfqws: optimize ipv4 ip_id. apply ip_id on all OS the same way.
|
||||||
|
blockcheck: print PRETTY_NAME and some OPENWRT_xxx from /etc/os-release
|
||||||
|
blockcheck: new strategies
|
||||||
|
blockcheck: curl test simulation : SIMULATE=1
|
||||||
|
|
||||||
|
v72.1
|
||||||
|
|
||||||
|
nfqws: --ip-id=seq|seqgroup|rnd|zero
|
||||||
|
blockcheck: MIN_AUTOTTL_DELTA,MAX_AUTOTTL_DELTA
|
||||||
|
init.d: 50-quic4all custom
|
||||||
|
|
||||||
|
72.2
|
||||||
|
|
||||||
|
nfqws: --wssize-forced-cutoff
|
||||||
|
nfqws: --orig-tcp-flags, --dup-tcp-flags, --dpi-desync-tcp-flags
|
||||||
|
nfqws: --dup-ip-id
|
||||||
|
|
||||||
|
73.3
|
||||||
|
|
||||||
|
blockcheck: support URIs
|
||||||
|
blockcheck: CURL_HTTPS_GET=1 suppresses -I curl option for https (HEAD -> GET)
|
||||||
|
|
||||||
|
73.4
|
||||||
|
|
||||||
|
blockcheck: fix broken dns cache
|
||||||
|
|
||||||
|
73.5
|
||||||
|
|
||||||
|
nfqws: fix broken l7proto profile rediscovery
|
||||||
|
nfqws: backport from nfqws2 nl80211 ssid discovery fix for newer kernels
|
||||||
|
|
||||||
|
73.6
|
||||||
|
|
||||||
|
ipset: remove zapret-info based scripts because it's gone
|
||||||
|
blockcheck: fix tpws test regression
|
||||||
|
|||||||
@@ -1,21 +1,57 @@
|
|||||||
How to compile native programs for use in openwrt
|
How to compile native programs for use in openwrt
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
|
|
||||||
1) Download latest SDK for your platform from https://downloads.openwrt.org
|
1) Install required packages to the host system :
|
||||||
|
|
||||||
curl -o - https://downloads.openwrt.org/releases/23.05.5/targets/x86/64/openwrt-sdk-23.05.5-x86-64_gcc-12.3.0_musl.Linux-x86_64.tar.xz | tar -Jxvf -
|
debian,ubuntu : apt install build-essential patch libncurses-dev python3-distutils unzip gawk wget git
|
||||||
cd openwrt-sdk-23.05.5-x86-64_gcc-12.3.0_musl.Linux-x86_64
|
fedora: dnf install make patch gcc g++ ncurses-devel git perl
|
||||||
|
|
||||||
2) ./scripts/feeds update -a
|
Other packages may be required on your distribution. Look for the errors.
|
||||||
./scripts/feeds install -a
|
|
||||||
|
2) Download latest SDK for your target platform from https://downloads.openwrt.org
|
||||||
3) cp -R /opt/zapret/docs/compile/openwrt/. .
|
|
||||||
cp -R /opt/zapret/tpws package/zapret/tpws
|
examples :
|
||||||
cp -R /opt/zapret/nfq package/zapret/nfqws
|
|
||||||
cp -R /opt/zapret/mdig package/zapret/mdig
|
curl -o - https://downloads.openwrt.org/releases/23.05.5/targets/x86/64/openwrt-sdk-23.05.5-x86-64_gcc-12.3.0_musl.Linux-x86_64.tar.xz | tar -Jxv
|
||||||
cp -R /opt/zapret/ip2net package/zapret/ip2net
|
cd openwrt-sdk-23.05.5-x86-64_gcc-12.3.0_musl.Linux-x86_64
|
||||||
|
|
||||||
4) make package/{tpws,nfqws,mdig,ip2net}/compile
|
curl -o - https://downloads.openwrt.org/snapshots/targets/x86/64/openwrt-sdk-x86-64_gcc-13.3.0_musl.Linux-x86_64.tar.zst | tar --zstd -xv
|
||||||
|
cd openwrt-sdk-x86-64_gcc-13.3.0_musl.Linux-x86_64
|
||||||
5) find bin -name tpws*.ipk
|
|
||||||
#take your tpws*.ipk , nfqws*.ipk , ip2net*.ipk, mdig*.ipk from there
|
3) Install required libs
|
||||||
|
|
||||||
|
./scripts/feeds update base packages
|
||||||
|
./scripts/feeds install libnetfilter-queue zlib libcap
|
||||||
|
|
||||||
|
4) Prepare openwrt package definitions
|
||||||
|
|
||||||
|
cp -R /opt/zapret/docs/compile/openwrt/. .
|
||||||
|
cp -R /opt/zapret/tpws package/zapret/tpws
|
||||||
|
cp -R /opt/zapret/nfq package/zapret/nfqws
|
||||||
|
cp -R /opt/zapret/mdig package/zapret/mdig
|
||||||
|
cp -R /opt/zapret/ip2net package/zapret/ip2net
|
||||||
|
rm -f package/zapret/tpws/tpws/tpws package/zapret/nfqws/nfq/nfqws package/zapret/mdig/mdig/mdig package/zapret/ip2net/ip2net/ip2net
|
||||||
|
|
||||||
|
5) Prepare .config
|
||||||
|
|
||||||
|
make defconfig
|
||||||
|
|
||||||
|
If you only need bins without packages comment 'CONFIG_AUTOREMOVE=y' line in .config
|
||||||
|
|
||||||
|
6) Compile
|
||||||
|
|
||||||
|
dynamic build : make package/{tpws,nfqws,mdig,ip2net}/compile
|
||||||
|
static build : make CFLAGS=-static package/{tpws,nfqws,mdig,ip2net}/compile
|
||||||
|
|
||||||
|
7) Get result
|
||||||
|
|
||||||
|
executables only : build_dir/target/<progname>
|
||||||
|
ipk or apk packages : bin/packages/*/base
|
||||||
|
|
||||||
|
8) Installing to openwrt to use with zapret
|
||||||
|
|
||||||
|
zapret with or without binaries should be already installed in /opt/zapret.
|
||||||
|
Install ipk's or apk's with all compiled progs using opkg or apk.
|
||||||
|
Bins are placed to /opt/zapret/binaries/my.
|
||||||
|
Or copy binaries there manually and set chmod 755 to them.
|
||||||
|
Run install_bin.sh or install_easy.sh. They will use bins in 'my' folder.
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
debian,ubuntu :
|
||||||
|
|
||||||
|
apt install make gcc zlib1g-dev libcap-dev libnetfilter-queue-dev libmnl-dev libsystemd-dev
|
||||||
|
make -C /opt/zapret systemd
|
||||||
|
|
||||||
|
FreeBSD :
|
||||||
|
|
||||||
|
make -C /opt/zapret
|
||||||
|
|
||||||
|
OpenBSD :
|
||||||
|
|
||||||
|
make -C /opt/zapret bsd
|
||||||
|
|
||||||
|
MacOS :
|
||||||
|
|
||||||
|
make -C /opt/zapret mac
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
Windows x64
|
||||||
|
|
||||||
|
1) Download latest cygwin for windows 7
|
||||||
|
|
||||||
|
curl -O https://www.cygwin.com/setup-x86_64.exe
|
||||||
|
setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215
|
||||||
|
|
||||||
|
2) During setup install packages : make gcc-core zlib-devel
|
||||||
|
|
||||||
|
3) Run Cygwin.bat
|
||||||
|
|
||||||
|
4) cd to %ZAPRET_BASE%/nfq
|
||||||
|
|
||||||
|
cd C:/Users/user/Downloads/zapret/nfq
|
||||||
|
|
||||||
|
5) Compile
|
||||||
|
|
||||||
|
make cygwin64
|
||||||
|
|
||||||
|
use winws.exe
|
||||||
|
|
||||||
|
6) Take windivert.dll and windivert64.sys here : https://reqrypt.org/download
|
||||||
|
Choose version 2.2.2 for Windows 10 and 2.2.0 for Windows 7.
|
||||||
|
|
||||||
|
7) Copy cygwin1.dll, winws.exe, windivert.dll and windivert64.sys to one folder.
|
||||||
|
|
||||||
|
8) Run winws.exe from cmd.exe running as administrator.
|
||||||
|
winws will not run from cygwin shell with cygwin1.dll copy in it's folder.
|
||||||
|
winws will not run without cygwin1.dll outside of cygwin shell.
|
||||||
@@ -24,8 +24,8 @@ define Build/Compile
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/ip2net/install
|
define Package/ip2net/install
|
||||||
$(INSTALL_DIR) $(1)/opt/zapret/ip2net
|
$(INSTALL_DIR) $(1)/opt/zapret/binaries/my
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ip2net $(1)/opt/zapret/ip2net
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ip2net $(1)/opt/zapret/binaries/my
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,ip2net))
|
$(eval $(call BuildPackage,ip2net))
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Copy "ip2net" folder here !
|
Copy "ip2net" folder here !
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ define Build/Compile
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/mdig/install
|
define Package/mdig/install
|
||||||
$(INSTALL_DIR) $(1)/opt/zapret/mdig
|
$(INSTALL_DIR) $(1)/opt/zapret/binaries/my
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/mdig $(1)/opt/zapret/mdig
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/mdig $(1)/opt/zapret/binaries/my
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,mdig))
|
$(eval $(call BuildPackage,mdig))
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Copy "mdig" folder here !
|
Copy "mdig" folder here !
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ define Package/nfqws
|
|||||||
CATEGORY:=Network
|
CATEGORY:=Network
|
||||||
TITLE:=nfqws
|
TITLE:=nfqws
|
||||||
SUBMENU:=Zapret
|
SUBMENU:=Zapret
|
||||||
DEPENDS:=+libnetfilter-queue +libcap +zlib
|
DEPENDS:=+libnetfilter-queue +lmnl +libcap +zlib
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Build/Prepare
|
define Build/Prepare
|
||||||
@@ -25,8 +25,8 @@ define Build/Compile
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/nfqws/install
|
define Package/nfqws/install
|
||||||
$(INSTALL_DIR) $(1)/opt/zapret/nfq
|
$(INSTALL_DIR) $(1)/opt/zapret/binaries/my
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/nfqws $(1)/opt/zapret/nfq
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/nfqws $(1)/opt/zapret/binaries/my
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,nfqws))
|
$(eval $(call BuildPackage,nfqws))
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Copy "nfq" folder here !
|
Copy "nfq" folder here !
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ define Build/Compile
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/tpws/install
|
define Package/tpws/install
|
||||||
$(INSTALL_DIR) $(1)/opt/zapret/tpws
|
$(INSTALL_DIR) $(1)/opt/zapret/binaries/my
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/tpws $(1)/opt/zapret/tpws
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/tpws $(1)/opt/zapret/binaries/my
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,tpws))
|
$(eval $(call BuildPackage,tpws))
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Copy "tpws" folder here !
|
Copy "tpws" folder here !
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ iptables -t mangle -I POSTROUTING -p udp --dport 443 -m mark ! --mark 0x40000000
|
|||||||
# auto hostlist with avoiding wrong ACK numbers in RST,ACK packets sent by russian DPI
|
# auto hostlist with avoiding wrong ACK numbers in RST,ACK packets sent by russian DPI
|
||||||
sysctl net.netfilter.nf_conntrack_tcp_be_liberal=1
|
sysctl net.netfilter.nf_conntrack_tcp_be_liberal=1
|
||||||
iptables -t mangle -I POSTROUTING -p tcp -m multiport --dports 80,443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:12 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
iptables -t mangle -I POSTROUTING -p tcp -m multiport --dports 80,443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:12 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
iptables -t mangle -I PREROUTING -p tcp -m multiport --sports 80,443 -m connbytes --connbytes-dir=reply --connbytes-mode=packets --connbytes 1:6 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
iptables -t mangle -I PREROUTING -p tcp -m multiport --sports 80,443 -m connbytes --connbytes-dir=reply --connbytes-mode=packets --connbytes 1:3 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
|
||||||
|
|
||||||
For TPROXY :
|
For TPROXY :
|
||||||
|
|||||||
+2
-2
@@ -19,8 +19,8 @@ For dpi desync attack :
|
|||||||
nft delete table inet ztest
|
nft delete table inet ztest
|
||||||
nft create table inet ztest
|
nft create table inet ztest
|
||||||
nft add chain inet ztest post "{type filter hook postrouting priority mangle;}"
|
nft add chain inet ztest post "{type filter hook postrouting priority mangle;}"
|
||||||
nft add rule inet ztest post meta mark and 0x40000000 == 0 tcp dport "{80,443}" ct original packets 1-12 queue num 200 bypass
|
nft add rule inet ztest post meta mark and 0x40000000 == 0 tcp dport "{80,443}" ct original packets 1-6 queue num 200 bypass
|
||||||
nft add rule inet ztest post meta mark and 0x40000000 == 0 udp dport 443 ct original packets 1-12 queue num 200 bypass
|
nft add rule inet ztest post meta mark and 0x40000000 == 0 udp dport 443 ct original packets 1-6 queue num 200 bypass
|
||||||
|
|
||||||
# auto hostlist with avoiding wrong ACK numbers in RST,ACK packets sent by russian DPI
|
# auto hostlist with avoiding wrong ACK numbers in RST,ACK packets sent by russian DPI
|
||||||
sysctl net.netfilter.nf_conntrack_tcp_be_liberal=1
|
sysctl net.netfilter.nf_conntrack_tcp_be_liberal=1
|
||||||
|
|||||||
+51
-28
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> Не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как
|
> Не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как
|
||||||
> запустить", ... То есть все , что касается базовых навыков обращения с ОС
|
> запустить" и т.п. То есть все, что касается базовых навыков обращения с ОС
|
||||||
> linux. Эти вопросы будут закрывать сразу. Если у вас подобные вопросы
|
> Linux. Эти вопросы будут закрывать сразу. Если у вас подобные вопросы
|
||||||
> возникают, рекомендую не использовать данный софт или искать помощь где-то в
|
> возникают, рекомендую не использовать данный софт или искать помощь где-то в
|
||||||
> другом месте. То же самое могу сказать тем, кто хочет нажать 1 кнопку, чтобы
|
> другом месте. То же самое могу сказать тем, кто хочет нажать 1 кнопку, чтобы
|
||||||
> все заработало, и совсем не хочет читать и изучать. Увы, такое не подвезли и
|
> все заработало, и совсем не хочет читать и изучать. Увы, такое не подвезли и
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
в простыню [readme.md](readme.md).
|
в простыню [readme.md](readme.md).
|
||||||
|
|
||||||
Обход DPI является хакерской методикой. Под этим словом понимается метод,
|
Обход DPI является хакерской методикой. Под этим словом понимается метод,
|
||||||
которому сопротивляется окружающая среда, которому автоматически не
|
которому оказывается активное противодействие и поэтому автоматически не
|
||||||
гарантирована работоспособность в любых условиях и на любых ресурсах, требуется
|
гарантирована работоспособность в любых условиях и на любых ресурсах, требуется
|
||||||
настройка под специфические условия у вашего провайдера. Условия могут меняться
|
настройка под специфические условия у вашего провайдера. Условия могут меняться
|
||||||
со временем, и методика может начинать или переставать работать, может
|
со временем, и методика может начинать или переставать работать, может
|
||||||
@@ -50,6 +50,20 @@
|
|||||||
> образ `squashfs` с помощью `image builder` и перешить этим вариантом роутер.
|
> образ `squashfs` с помощью `image builder` и перешить этим вариантом роутер.
|
||||||
|
|
||||||
1. Скачайте последний [tar.gz релиз](https://github.com/bol-van/zapret/releases) в /tmp, распакуйте его, затем удалите архив.
|
1. Скачайте последний [tar.gz релиз](https://github.com/bol-van/zapret/releases) в /tmp, распакуйте его, затем удалите архив.
|
||||||
|
Для openwrt и прошивок используйте вариант `openwrt-embedded`.
|
||||||
|
Для экономия места в /tmp можно качать через curl в stdout и сразу распаковывать.
|
||||||
|
Пример под openwrt для версии zapret 71.4 (для других URL отличается) :
|
||||||
|
```
|
||||||
|
$ curl -Lo - https://github.com/bol-van/zapret/releases/download/v71.4/zapret-v71.4-openwrt-embedded.tar.gz | tar -zx
|
||||||
|
$ wget -O - https://github.com/bol-van/zapret/releases/download/v71.4/zapret-v71.4-openwrt-embedded.tar.gz | tar -zx
|
||||||
|
```
|
||||||
|
Пример под традиционный linux для версии zapret 71.4 (для других URL отличается) :
|
||||||
|
```
|
||||||
|
$ curl -Lo - https://github.com/bol-van/zapret/releases/download/v71.4/zapret-v71.4.tar.gz | tar -zx
|
||||||
|
$ wget -O - https://github.com/bol-van/zapret/releases/download/v71.4/zapret-v71.4.tar.gz | tar -zx
|
||||||
|
```
|
||||||
|
curl должен быть предварительно установлен. Но он в любом случае понадобится далее.
|
||||||
|
Вариант с wget будет работать только если установленный wget поддерживает https.
|
||||||
|
|
||||||
2. Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и
|
2. Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и
|
||||||
сам zapret. Гарантированно уберет zapret скрипт `uninstall_easy.sh`.
|
сам zapret. Гарантированно уберет zapret скрипт `uninstall_easy.sh`.
|
||||||
@@ -87,14 +101,15 @@
|
|||||||
>
|
>
|
||||||
> Проверить работает ли этот вариант можно так:
|
> Проверить работает ли этот вариант можно так:
|
||||||
> ```sh
|
> ```sh
|
||||||
> $ dig -p 53 @77.88.8.88 rutracker.org dig -p 1253 @77.88.8.88 rutracker.org
|
> $ dig -p 53 @77.88.8.88 rutracker.org
|
||||||
|
> $ dig -p 1253 @77.88.8.88 rutracker.org
|
||||||
> ```
|
> ```
|
||||||
>
|
>
|
||||||
> Если DNS действительно подменяется, и ответ на эти 2 команды разный,
|
> Если DNS действительно подменяется, и ответ на эти 2 команды разный,
|
||||||
> значит метод вероятно работает.
|
> значит метод вероятно работает.
|
||||||
>
|
>
|
||||||
> В openwrt DNS на нестандартном порту можно прописать в `/etc/config/dhcp`
|
> В openwrt DNS на нестандартном порту можно прописать в `/etc/config/dhcp`
|
||||||
> таким способом :
|
> таким способом:
|
||||||
>
|
>
|
||||||
> ```
|
> ```
|
||||||
> config dnsmasq
|
> config dnsmasq
|
||||||
@@ -126,10 +141,14 @@
|
|||||||
или `tpws` и запомнить найденные стратегии для дальнейшего применения.
|
или `tpws` и запомнить найденные стратегии для дальнейшего применения.
|
||||||
|
|
||||||
Следует понимать, что скрипт проверяет доступность только конкретного
|
Следует понимать, что скрипт проверяет доступность только конкретного
|
||||||
домена, который вы вводите в начале. Вероятно, все остальные домены
|
домена, который вы вводите в начале, конкретной программой curl.
|
||||||
блокированы подобным образом, **но не факт**. В большинстве случаев можно
|
У разных клиентов есть свой фингерпринт. У броузеров один, у curl другой.
|
||||||
объединить несколько стратегий в одну универсальную, и это **крайне
|
Может применяться или не применяться многопакетный TLS с постквантовой криптографией (kyber).
|
||||||
желательно**. Необходимо понимать как работают стратегии. zapret **не может
|
От этого может зависеть работоспособность стратегий.
|
||||||
|
Обычно остальные домены блокированы подобным образом, **но не факт**.
|
||||||
|
Бывают специальные блокировки. Некоторые параметры требуют тюнинга под "общий знаменатель".
|
||||||
|
В большинстве случаев можно объединить несколько стратегий в одну универсальную, и это **крайне
|
||||||
|
желательно**, но это требует понимания как работают стратегии. zapret **не может
|
||||||
пробить блокировку по IP адресу**. Для проверки нескольких доменов вводите
|
пробить блокировку по IP адресу**. Для проверки нескольких доменов вводите
|
||||||
их через пробел.
|
их через пробел.
|
||||||
|
|
||||||
@@ -140,28 +159,16 @@
|
|||||||
> направления (IP сервера). скрипт не всегда может выдать вам в итогах
|
> направления (IP сервера). скрипт не всегда может выдать вам в итогах
|
||||||
> оптимальную стратегию, которую надо просто переписать в настройки. В
|
> оптимальную стратегию, которую надо просто переписать в настройки. В
|
||||||
> некоторых случаях надо реально думать что происходит, анализируя результат
|
> некоторых случаях надо реально думать что происходит, анализируя результат
|
||||||
> на разных стратегиях. Если вы применяете большой TTL, чтобы достать до
|
> на разных стратегиях.
|
||||||
> магистрала, то не лишним будет добавить дополнительный ограничитель
|
|
||||||
> `--dpi-desync-fooling`, чтобы не сломать сайты на более коротких
|
|
||||||
> дистанциях. `md5sig` наиболее совместим, но работает **только** на linux
|
|
||||||
> серверах. `badseq` может работать только на https и не работать на http.
|
|
||||||
> Чтобы выяснить какие дополнительные ограничители работают, смотрите
|
|
||||||
> результат теста аналогичных стратегий без TTL с каждым из этих
|
|
||||||
> ограничителей.
|
|
||||||
>
|
|
||||||
> При использовании `autottl` следует протестировать как можно больше разных
|
|
||||||
> доменов. Эта техника может на одних провайдерах работать стабильно, на
|
|
||||||
> других потребуется выяснить при каких параметрах она стабильна, на третьих
|
|
||||||
> полный хаос, и проще отказаться.
|
|
||||||
>
|
>
|
||||||
> Далее, имея понимание что работает на http, https, quic нужно
|
> Далее, имея понимание что работает на http, https, quic нужно
|
||||||
> сконструировать параметры запуска `tpws` и/или `nfqws` с использованием
|
> сконструировать параметры запуска `tpws` и/или `nfqws` с использованием
|
||||||
> мультистратегии. Как работают мультистратегии описано в readme.txt.
|
> мультистратегии. Как работают мультистратегии описано в [readme.md](./readme.md#множественные-стратегии).
|
||||||
>
|
>
|
||||||
> Если кратко, то обычно параметры конструируются так:
|
> Если кратко, то обычно параметры конструируются так:
|
||||||
> ```sh
|
> ```sh
|
||||||
> "--filter-udp=443 'параметры для quic' <HOSTLIST_NOAUTO> --new
|
> "--filter-udp=443 'параметры для quic' <HOSTLIST_NOAUTO> --new
|
||||||
> --filter-tcp=80,443 'обьединенные параметры для http и https' <HOSTLIST>"
|
> --filter-tcp=80,443 'объединенные параметры для http и https' <HOSTLIST>"
|
||||||
> ```
|
> ```
|
||||||
>
|
>
|
||||||
> Или так:
|
> Или так:
|
||||||
@@ -191,7 +198,7 @@
|
|||||||
> "--filter-l3=ipv4 --filter-udp=443 lпараметры для quic ipv4' <HOSTLIST_NOAUTO> --new
|
> "--filter-l3=ipv4 --filter-udp=443 lпараметры для quic ipv4' <HOSTLIST_NOAUTO> --new
|
||||||
> --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' <HOSTLIST> --new
|
> --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' <HOSTLIST> --new
|
||||||
> --filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' <HOSTLIST> --new
|
> --filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' <HOSTLIST> --new
|
||||||
> --filter-l3=ipv6 --filter-udp=443 "параметры для quic ipv6" <HOSTLIST_NOAUTO> --new
|
> --filter-l3=ipv6 --filter-udp=443 'параметры для quic ipv6' <HOSTLIST_NOAUTO> --new
|
||||||
> --filter-l3=ipv6 --filter-tcp=80 'параметры для http ipv6' <HOSTLIST> --new
|
> --filter-l3=ipv6 --filter-tcp=80 'параметры для http ipv6' <HOSTLIST> --new
|
||||||
> --filter-l3=ipv6 --filter-tcp=443 'параметры для https ipv6' <HOSTLIST>"
|
> --filter-l3=ipv6 --filter-tcp=443 'параметры для https ipv6' <HOSTLIST>"
|
||||||
> ```
|
> ```
|
||||||
@@ -199,8 +206,8 @@
|
|||||||
> Но здесь совсем "копи-пастный" вариант. Чем больше вы объедините стратегий и
|
> Но здесь совсем "копи-пастный" вариант. Чем больше вы объедините стратегий и
|
||||||
> сократите их общее количество, тем будет лучше.
|
> сократите их общее количество, тем будет лучше.
|
||||||
>
|
>
|
||||||
> Если вам не нужно дурение отдельных протоколов, лучше всего будет их
|
> Если вам не нужно дурение отдельных протоколов, лучше всего будет убрать
|
||||||
> убрать из системы перехвата трафика через параметры `TPWS_PORTS`,
|
> лишние порты из системы перехвата трафика через параметры `TPWS_PORTS`,
|
||||||
> `NFQWS_PORTS_TCP`, `NFQWS_PORTS_UDP` и убрать соответствующие им профили
|
> `NFQWS_PORTS_TCP`, `NFQWS_PORTS_UDP` и убрать соответствующие им профили
|
||||||
> мультистратегии.
|
> мультистратегии.
|
||||||
>
|
>
|
||||||
@@ -213,7 +220,7 @@
|
|||||||
> Если используются методы нулевой фазы десинхронизации (`--mss`,
|
> Если используются методы нулевой фазы десинхронизации (`--mss`,
|
||||||
> `--wssize`, `--dpi-desync=syndata`) и режим фильтрации `hostlist`, то все
|
> `--wssize`, `--dpi-desync=syndata`) и режим фильтрации `hostlist`, то все
|
||||||
> параметры, относящиеся к этим методам, следует помещать в отдельные
|
> параметры, относящиеся к этим методам, следует помещать в отдельные
|
||||||
> профили мульистратегии, которые получат управление до определения имени
|
> профили мультистратегии, которые получат управление до определения имени
|
||||||
> хоста. Необходимо понимать алгоритм работы мультистратегий. Самым надежным
|
> хоста. Необходимо понимать алгоритм работы мультистратегий. Самым надежным
|
||||||
> вариантом будет дублирование этих параметров на 2 профиля. Какой-нибудь
|
> вариантом будет дублирование этих параметров на 2 профиля. Какой-нибудь
|
||||||
> сработает в зависимости от параметра `MODE_FILTER`.
|
> сработает в зависимости от параметра `MODE_FILTER`.
|
||||||
@@ -227,6 +234,15 @@
|
|||||||
> В этом примере `wssize` будет применяться всегда к порту tcp `443` вне
|
> В этом примере `wssize` будет применяться всегда к порту tcp `443` вне
|
||||||
> зависимости от параметра `MODE_FILTER`. Хостлист будет игнорироваться,
|
> зависимости от параметра `MODE_FILTER`. Хостлист будет игнорироваться,
|
||||||
> если таковой имеется. К http применять `wssize` вредно и бессмысленно.
|
> если таковой имеется. К http применять `wssize` вредно и бессмысленно.
|
||||||
|
>
|
||||||
|
> Иногда требуется дописать к стратегиям свои собственные параметры.
|
||||||
|
> Например, нужно изменить количество повторов фейков или задать свой фейк.
|
||||||
|
> Это делается через шелл-переменные `PKTWS_EXTRA`, `TPWS_EXTRA`.
|
||||||
|
>
|
||||||
|
> ```PKTWS_EXTRA="--dpi-desync-repeats=10 --dpi-desync-fake-tls=/tmp/tls.bin" ./blockcheck.sh```
|
||||||
|
>
|
||||||
|
> Перебор всех комбинаций может привести к ожиданию неделями, поэтому выбран разумный
|
||||||
|
> костяк проверки, на который вы можете навешивать свои кустомизации.
|
||||||
|
|
||||||
7. Запустите скрипт облегченной установки - `install_easy.sh` Выберите `nfqws`
|
7. Запустите скрипт облегченной установки - `install_easy.sh` Выберите `nfqws`
|
||||||
и/или `tpws`, затем согласитесь на редактирование параметров. Откроется
|
и/или `tpws`, затем согласитесь на редактирование параметров. Откроется
|
||||||
@@ -235,6 +251,13 @@
|
|||||||
8. На все остальные вопросы `install_easy.sh` отвечайте согласно выводимой
|
8. На все остальные вопросы `install_easy.sh` отвечайте согласно выводимой
|
||||||
аннотации.
|
аннотации.
|
||||||
|
|
||||||
|
9. Удалите директорию из /tmp, откуда производилась установка.
|
||||||
|
|
||||||
|
## Полное удаление
|
||||||
|
|
||||||
|
1. Прогоните `/opt/zapret/uninstall_easy.sh`.
|
||||||
|
2. Cогласитесь на удаление зависимостей в openwrt.
|
||||||
|
3. Удалите каталог `/opt/zapret`.
|
||||||
|
|
||||||
## Итог
|
## Итог
|
||||||
Это минимальная инструкция, чтобы быстро сориентироваться с чего начать.
|
Это минимальная инструкция, чтобы быстро сориентироваться с чего начать.
|
||||||
|
|||||||
+62
-65
@@ -11,8 +11,8 @@
|
|||||||
|
|
||||||
## Немного разъяснений
|
## Немного разъяснений
|
||||||
|
|
||||||
Обход DPI является хакерской методикой. Под этим словом понимается метод, которому сопротивляется окружающая среда,
|
Обход DPI является хакерской методикой. Под этим словом понимается метод, которому оказывается активное противодействие и поэтому
|
||||||
которому автоматически не гарантирована работоспособность в любых условиях и на любых ресурсах,
|
автоматически не гарантирована работоспособность в любых условиях и на любых ресурсах,
|
||||||
требуется настройка под специфические условия у вашего провайдера. Условия могут меняться со временем,
|
требуется настройка под специфические условия у вашего провайдера. Условия могут меняться со временем,
|
||||||
и методика может начинать или переставать работать, может потребоваться повторный анализ ситуации.
|
и методика может начинать или переставать работать, может потребоваться повторный анализ ситуации.
|
||||||
Могут обнаруживаться отдельные ресурсы, которые заблокированы иначе, и которые не работают или перестали работать.
|
Могут обнаруживаться отдельные ресурсы, которые заблокированы иначе, и которые не работают или перестали работать.
|
||||||
@@ -30,31 +30,25 @@
|
|||||||
|
|
||||||
Будем считать, что у вас есть windows 7 или выше. Задача - обойти блокировки с самой системы.
|
Будем считать, что у вас есть windows 7 или выше. Задача - обойти блокировки с самой системы.
|
||||||
|
|
||||||
> [!NOTE]
|
## Я ЧТО-ТО ДЕЛАЛ, НЕ ПОМОГЛО, КАК ТЕПЕРЬ ЭТО УДАЛИТЬ
|
||||||
> Есть решение самое простое, а есть "как положено".
|
|
||||||
|
|
||||||
## САМОЕ ПРОСТОЕ РЕШЕНИЕ
|
Если вы не устанавливали zapret как службу или запланированную задачу (а это требует редактирования cmd файлов),
|
||||||
|
достаточно закрыть окно с winws и запустить windivert_delete.cmd.
|
||||||
|
Альтернатива - перезагрузить компьютер.
|
||||||
|
После чего можно удалить папку с zapret. На этом деинсталляция закончена.
|
||||||
|
Если же вы устанавливали zapret как службу, то вы наверняка знаете как ее удалить.
|
||||||
|
|
||||||
_"Совсем ничего не могу, все очень сложно, дайте мне таблетку."_ ©Простой пользователь
|
Если вдруг среди того, на что вы нажимали, есть слова "general", "alt", ".bat", "автозапуск", или же есть файлы, которые отсутствуют
|
||||||
|
в оригинальных репозиториях, то это сборка. Вы не получите ответа как ее удалить от разработчика zapret.
|
||||||
|
Спрашивайте самих сборщиков. Разработчик не предоставляет простого решения, этим занимаются сборщики, но они и сами отвечают за свои продукты.
|
||||||
|
|
||||||
1) Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip.
|
## Настройка
|
||||||
2) Запустите `zapret-winws/preset_russia.cmd` от имени администратора. Возможно, заведется сразу.
|
|
||||||
|
|
||||||
> То же самое с ограничителем по автоматически создаваемому хост-листу `preset_russia_autohostlist.cmd`.
|
1. Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip.
|
||||||
> Что такое `autohostlist` - читайте [readme.md](./readme.md). Проще говоря, мы обходим только то, что долго и упорно не хочет открываться.
|
|
||||||
> Сначала не будет, но надо пытаться много раз, и тогда сработает, а дальше будет всегда срабатывать.
|
|
||||||
> Остальное не будет ломаться. Использовать только, если первый вариант тоже работает.
|
|
||||||
|
|
||||||
Не помогла _"таблетка"_ ? Это вовсе не значит, что ничего не получится. Но придется делать по нормальному.
|
2. Если у вас Windows 7 x64, однократно запустите `win7/install_win7.cmd`. Батник заменит файлы windivert на совместимую с Windows 7 версию.
|
||||||
|
|
||||||
## РЕШЕНИЕ "КАК ПОЛОЖЕНО"
|
> Для 32-битных систем Windows нет готового полного варианта.
|
||||||
|
|
||||||
1) Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip.
|
|
||||||
|
|
||||||
2) Если у вас Windows 7 x64, читайте [docs/windows.md](./windows.md). Без описанной там подготовки может не работать.
|
|
||||||
|
|
||||||
> [!WARNING]
|
|
||||||
> Для 32-битных систем Windows нет готового полного варианта.
|
|
||||||
|
|
||||||
> На windows 11 arm64 выполните `arm64/install_arm64.cmd` от имени администратора и перезагрузите компьютер.
|
> На windows 11 arm64 выполните `arm64/install_arm64.cmd` от имени администратора и перезагрузите компьютер.
|
||||||
> Читайте [docs/windows.md](./windows.md)
|
> Читайте [docs/windows.md](./windows.md)
|
||||||
@@ -64,15 +58,15 @@ _"Совсем ничего не могу, все очень сложно, да
|
|||||||
> более-менее научились с ним дружить.
|
> более-менее научились с ним дружить.
|
||||||
> Если проблема имеет место , используйте исключения. Если не помогает - отключайте антивирус совсем.
|
> Если проблема имеет место , используйте исключения. Если не помогает - отключайте антивирус совсем.
|
||||||
|
|
||||||
3) Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и сам zapret.
|
3. Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и сам zapret.
|
||||||
|
|
||||||
4) Если вы работаете в виртуальной машине, необходимо использовать соединение с сетью в режиме bridge. nat не подходит
|
4. Если вы работаете в виртуальной машине, необходимо использовать соединение с сетью в режиме bridge. nat не подходит
|
||||||
|
|
||||||
5) Запустите `blockcheck\blockcheck.cmd`. blockcheck в начале проверяет **DNS**.
|
5. Запустите `blockcheck\blockcheck.cmd`. blockcheck в начале проверяет **DNS**.
|
||||||
Если выводятся сообщения о подмене адресов, то нужно будет решить проблему с **DNS**.
|
Если выводятся сообщения о подмене адресов, то нужно будет решить проблему с **DNS**.
|
||||||
blockcheck перейдет в этом случае на **DoH** _(DNS over HTTPS)_ и будет пытаться получить и использовать реальные IP адреса.
|
blockcheck перейдет в этом случае на **DoH** _(DNS over HTTPS)_ и будет пытаться получить и использовать реальные IP адреса.
|
||||||
Но если вы не настроите решение этой проблемы, обход будет работать только для тех программ,
|
Но если вы не настроите решение этой проблемы, обход будет работать только для тех программ,
|
||||||
которые сами реализуют механизмы SecureDNS. Для других программ обход работать не будет.
|
которые сами реализуют механизмы SecureDNS. Для других программ обход работать не будет.
|
||||||
|
|
||||||
> Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов
|
> Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов
|
||||||
> от провайдера на публичные (`1.1.1.1`, `8.8.8.8`), либо в случае перехвата провайдером обращений
|
> от провайдера на публичные (`1.1.1.1`, `8.8.8.8`), либо в случае перехвата провайдером обращений
|
||||||
@@ -84,38 +78,32 @@ blockcheck перейдет в этом случае на **DoH** _(DNS over HTT
|
|||||||
>
|
>
|
||||||
> Тут все разжевано как и где это включается : https://hackware.ru/?p=13707
|
> Тут все разжевано как и где это включается : https://hackware.ru/?p=13707
|
||||||
|
|
||||||
6) blockcheck позволяет выявить рабочую стратегию обхода блокировок.
|
6. blockcheck позволяет выявить рабочую стратегию обхода блокировок.
|
||||||
Лог скрипта будет сохранен в `blockcheck\blockcheck.log`.
|
Лог скрипта будет сохранен в `blockcheck\blockcheck.log`.
|
||||||
Запомните/перепишите найденные стратегии.
|
Запомните/перепишите найденные стратегии.
|
||||||
|
|
||||||
> [!WARNING]
|
Следует понимать, что скрипт проверяет доступность только конкретного
|
||||||
> Следует понимать, что blockcheck проверяет доступность только конкретного домена, который вы вводите в начале.
|
домена, который вы вводите в начале, конкретной программой curl.
|
||||||
> Вероятно, все остальные домены блокированы подобным образом, но не факт.
|
У разных клиентов есть свой фингерпринт. У броузеров один, у curl другой.
|
||||||
|
Может применяться или не применяться многопакетный TLS с постквантовой криптографией (kyber).
|
||||||
|
От этого может зависеть работоспособность стратегий.
|
||||||
|
Обычно остальные домены блокированы подобным образом, **но не факт**.
|
||||||
|
Бывают специальные блокировки. Некоторые параметры требуют тюнинга под "общий знаменатель".
|
||||||
|
В большинстве случаев можно объединить несколько стратегий в одну универсальную, и это **крайне
|
||||||
|
желательно**, но это требует понимания как работают стратегии. zapret **не может
|
||||||
|
пробить блокировку по IP адресу**. Для проверки нескольких доменов вводите их через пробел.
|
||||||
|
|
||||||
> [!TIP]
|
> Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у
|
||||||
> В большинстве случаев можно обьединить несколько стратегий в одну универсальную, и это крайне желательно.
|
> вас может быть несколько маршрутов с различной длиной по ХОПам, с DPI на
|
||||||
|
> разных хопах. Приходится преодолевать целый зоопарк DPI, которые еще и
|
||||||
> Необходимо понимать [как работают стратегии](./readme.md/#nfqws).
|
> включаются в работу хаотичным образом или образом, зависящим от
|
||||||
> zapret не может пробить блокировку по IP адресу. Для проверки нескольких доменов вводите их через пробел.
|
> направления (IP сервера). скрипт не всегда может выдать вам в итогах
|
||||||
>
|
> оптимальную стратегию, которую надо просто переписать в настройки. В
|
||||||
> Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у вас может быть несколько маршрутов
|
> некоторых случаях надо реально думать что происходит, анализируя результат
|
||||||
> с различной длиной по ХОПам, с DPI на разных хопах. Приходится преодолевать целый зоопарк DPI,
|
> на разных стратегиях.
|
||||||
> которые еще и включаются в работу хаотичным образом или образом, зависящим от направления (IP сервера).
|
|
||||||
> blockcheck не всегда может выдать вам в итогах оптимальную стратегию, которую надо просто переписать в настройки.
|
|
||||||
> В некоторых случаях надо реально думать что происходит, анализируя результат на разных стратегиях.
|
|
||||||
> Если вы применяете большой TTL, чтобы достать до магистрала, то не лишним будет добавить дополнительный ограничитель
|
|
||||||
> `--dpi-desync-fooling`, чтобы не сломать сайты на более коротких дистанциях.
|
|
||||||
> _md5sig_ наиболее совместим, но работатет только на linux серверах.
|
|
||||||
> badseq может работать только на https и не работать на http.
|
|
||||||
> Чтобы выяснить какие дополнительные ограничители работают, смотрите результат теста аналогичных стратегий без TTL
|
|
||||||
> с каждым из этих ограничителей.
|
|
||||||
>
|
|
||||||
> При использовании autottl следует протестировать как можно больше разных доменов. Эта техника
|
|
||||||
> может на одних провайдерах работать стабильно, на других потребуется выяснить при каких параметрах
|
|
||||||
> она стабильна, на третьих полный хаос, и проще отказаться.
|
|
||||||
>
|
>
|
||||||
> Далее, имея понимание что работает на http, https, quic, нужно сконструировать параметры запуска winws
|
> Далее, имея понимание что работает на http, https, quic, нужно сконструировать параметры запуска winws
|
||||||
> с использованием мультистратегии. Как работают мультистратегии описано в [readme.md](./readme.md).
|
> с использованием мультистратегии. Как работают мультистратегии описано в [readme.md](./readme.md#множественные-стратегии).
|
||||||
>
|
>
|
||||||
> Прежде всего вам нужно собрать фильтр перехватываемого трафика. Это делается через параметры
|
> Прежде всего вам нужно собрать фильтр перехватываемого трафика. Это делается через параметры
|
||||||
> `--wf-l3`, `--wf-tcp`, `--wf-udp`.
|
> `--wf-l3`, `--wf-tcp`, `--wf-udp`.
|
||||||
@@ -175,12 +163,21 @@ blockcheck перейдет в этом случае на **DoH** _(DNS over HTT
|
|||||||
>
|
>
|
||||||
> В этих примерах wssize будет применяться всегда к порту tcp 443, а хостлист будет игнорироваться.
|
> В этих примерах wssize будет применяться всегда к порту tcp 443, а хостлист будет игнорироваться.
|
||||||
> К http применять wssize вредно и бессмысленно.
|
> К http применять wssize вредно и бессмысленно.
|
||||||
|
>
|
||||||
|
> Иногда требуется дописать к стратегиям свои собственные параметры.
|
||||||
|
> Например, нужно изменить количество повторов фейков или задать свой фейк.
|
||||||
|
> Это делается через шелл-переменные `PKTWS_EXTRA`, `TPWS_EXTRA`. Пользуйтесь шеллом `cygwin/cygwin-admin.cmd`.
|
||||||
|
>
|
||||||
|
> ```PKTWS_EXTRA="--dpi-desync-repeats=10 --dpi-desync-fake-tls=/tmp/tls.bin" blockcheck```
|
||||||
|
>
|
||||||
|
> Перебор всех комбинаций может привести к ожиданию неделями, поэтому выбран разумный
|
||||||
|
> костяк проверки, на который вы можете навешивать свои кустомизации.
|
||||||
|
|
||||||
7) Протестируйте найденные стратегии на winws. Winws следует брать из zapret-winws.
|
7. Протестируйте найденные стратегии на winws. Winws следует брать из zapret-winws.
|
||||||
Для этого откройте командную строку windows от имени администратора в директории zapret-winws.
|
Для этого откройте командную строку windows от имени администратора в директории zapret-winws.
|
||||||
Проще всего это сделать через `_CMD_ADMIN.cmd`. Он сам поднимет права и зайдет в нужную директорию.
|
Проще всего это сделать через `_CMD_ADMIN.cmd`. Он сам поднимет права и зайдет в нужную директорию.
|
||||||
|
|
||||||
8) Обеспечьте удобную загрузку обхода блокировок.
|
8. Обеспечьте удобную загрузку обхода блокировок.
|
||||||
|
|
||||||
> Есть 2 варианта. Ручной запуск через ярлык или автоматический при старте системы, вне контекста текущего пользователя.
|
> Есть 2 варианта. Ручной запуск через ярлык или автоматический при старте системы, вне контекста текущего пользователя.
|
||||||
> Последний вариант разделяется на запуск через планировщик задач и через службы windows.
|
> Последний вариант разделяется на запуск через планировщик задач и через службы windows.
|
||||||
@@ -195,11 +192,11 @@ blockcheck перейдет в этом случае на **DoH** _(DNS over HTT
|
|||||||
>
|
>
|
||||||
> Аналогично настраиваются и службы windows. Смотрите `service_*.cmd`
|
> Аналогично настраиваются и службы windows. Смотрите `service_*.cmd`
|
||||||
|
|
||||||
9) Если ломаются отдельные незаблокированные ресурсы, нужно пользоваться ограничивающим
|
9. Если ломаются отдельные незаблокированные ресурсы, нужно пользоваться ограничивающим
|
||||||
ipset или хост листом. Читайте основной талмуд [readme.md](./readme.md) ради подробностей.
|
ipset или хост листом. Читайте основной талмуд [readme.md](./readme.md) ради подробностей.
|
||||||
Но еще лучше будет подбирать такие стратегии, которые ломают минимум.
|
Но еще лучше будет подбирать такие стратегии, которые ломают минимум.
|
||||||
Есть стратегии довольно безобидные, а есть сильно ломающие, которые подходят только для точечного пробития отдельных ресурсов,
|
Есть стратегии довольно безобидные, а есть сильно ломающие, которые подходят только для точечного пробития отдельных ресурсов,
|
||||||
когда ничего лучше нет. Хорошая стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков - ttl, fooling.
|
когда ничего лучше нет. Хорошая стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков - ttl, fooling.
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея.
|
> Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея.
|
||||||
|
|||||||
+774
-427
File diff suppressed because it is too large
Load Diff
+1244
-710
File diff suppressed because it is too large
Load Diff
+4
-6
@@ -24,17 +24,15 @@ Tor поддерживает "из коробки" режим transparent proxy.
|
|||||||
Устанавливать их нужно с опцией opkg --force-overwrite, поскольку они перепишут ssh клиент от dropbear.
|
Устанавливать их нужно с опцией opkg --force-overwrite, поскольку они перепишут ssh клиент от dropbear.
|
||||||
После установки пакетов расслабим неоправданно жестокие права : chmod 755 /etc/ssh.
|
После установки пакетов расслабим неоправданно жестокие права : chmod 755 /etc/ssh.
|
||||||
Следует создать пользователя, под которым будем крутить ssh client. Допустим, это будет 'proxy'.
|
Следует создать пользователя, под которым будем крутить ssh client. Допустим, это будет 'proxy'.
|
||||||
Сначала установить пакет shadow-useradd.
|
Сначала установить пакеты shadow-useradd и shadow-su.
|
||||||
------------------
|
------------------
|
||||||
useradd -d /home/proxy proxy
|
useradd -s /bin/false -d /home/proxy proxy
|
||||||
mkdir -p /home/proxy
|
mkdir -p /home/proxy
|
||||||
chown proxy:proxy /home/proxy
|
chown proxy:proxy /home/proxy
|
||||||
------------------
|
------------------
|
||||||
Openssh ловит разные глюки, если у него нет доступа к /dev/tty.
|
Сгенерируем ключ RSA для доступа к ssh серверу.
|
||||||
Добавим в /etc/rc.local строчку : "chmod 666 /dev/tty"
|
|
||||||
Сгенерируем для него ключ RSA для доступа к ssh серверу.
|
|
||||||
------------------
|
------------------
|
||||||
su proxy
|
su -s /bin/ash proxy
|
||||||
cd
|
cd
|
||||||
mkdir -m 700 .ssh
|
mkdir -m 700 .ssh
|
||||||
cd .ssh
|
cd .ssh
|
||||||
|
|||||||
+33
-19
@@ -7,7 +7,7 @@ tpws is static binary. It doesn't need a distribution.
|
|||||||
|
|
||||||
Install `WSL` : `dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all`
|
Install `WSL` : `dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all`
|
||||||
|
|
||||||
Copy `binaries/x86_64/tpws_wsl.tgz` to the target system.
|
From release copy `binaries/linux-x86_64/tpws_wsl.tgz` to the target system.
|
||||||
Run : `wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz`
|
Run : `wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz`
|
||||||
|
|
||||||
Run tpws : `wsl -d tpws --exec /tpws --uid=1 --no-resolve --socks --bind-addr=127.0.0.1 --port=1080 <fooling_options>`
|
Run tpws : `wsl -d tpws --exec /tpws --uid=1 --no-resolve --socks --bind-addr=127.0.0.1 --port=1080 <fooling_options>`
|
||||||
@@ -16,7 +16,7 @@ Configure socks as `127.0.0.1:1080` in a browser or another program.
|
|||||||
|
|
||||||
Cleanup : `wsl --unregister tpws`
|
Cleanup : `wsl --unregister tpws`
|
||||||
|
|
||||||
Tested in windows 10 build 19041 (20.04).
|
Tested in windows 10 build 19041 (20.04) with WSL1.
|
||||||
|
|
||||||
`--oob` , `--mss` and `--disorder` do not work.
|
`--oob` , `--mss` and `--disorder` do not work.
|
||||||
RST detection in autohostlist scheme may not work.
|
RST detection in autohostlist scheme may not work.
|
||||||
@@ -47,7 +47,9 @@ Task of `iptables` is done inside `winws` through `windivert` filters. `Windiver
|
|||||||
--wf-l3=ipv4|ipv6 ; L3 protocol filter. multiple comma separated values allowed.
|
--wf-l3=ipv4|ipv6 ; L3 protocol filter. multiple comma separated values allowed.
|
||||||
--wf-tcp=[~]port1[-port2] ; TCP port filter. ~ means negation. multiple comma separated values allowed.
|
--wf-tcp=[~]port1[-port2] ; TCP port filter. ~ means negation. multiple comma separated values allowed.
|
||||||
--wf-udp=[~]port1[-port2] ; UDP port filter. ~ means negation. multiple comma separated values allowed.
|
--wf-udp=[~]port1[-port2] ; UDP port filter. ~ means negation. multiple comma separated values allowed.
|
||||||
--wf-raw=<filter>|@<filename> ; raw windivert filter string or filename
|
--wf-raw-part=<filter>|@<filename> ; partial raw windivert filter string or filename
|
||||||
|
--wf-filter-lan=0|1 ; add excluding filter for non-global IP (default : 1)
|
||||||
|
--wf-raw=<filter>|@<filename> ; full raw windivert filter string or filename. replaces --wf-tcp,--wf-udp,--wf-raw-part
|
||||||
--wf-save=<filename> ; save windivert filter string to a file and exit
|
--wf-save=<filename> ; save windivert filter string to a file and exit
|
||||||
--ssid-filter=ssid1[,ssid2,ssid3,...] ; enable winws only if any of specified wifi SSIDs connected
|
--ssid-filter=ssid1[,ssid2,ssid3,...] ; enable winws only if any of specified wifi SSIDs connected
|
||||||
--nlm-filter=net1[,net2,net3,...] ; enable winws only if any of specified NLM network is connected. names and GUIDs are accepted.
|
--nlm-filter=net1[,net2,net3,...] ; enable winws only if any of specified NLM network is connected. names and GUIDs are accepted.
|
||||||
@@ -60,6 +62,12 @@ Interface indexes can be discovered using this command : `netsh int ip show int`
|
|||||||
|
|
||||||
If you can't find index this way use `winws --debug` to see index there. Subinterface index is almost always 0 and you can omit it.
|
If you can't find index this way use `winws --debug` to see index there. Subinterface index is almost always 0 and you can omit it.
|
||||||
|
|
||||||
|
`--wf-raw-part` specifies partial windivert filter. Multiple filter parts are supported. They can also be combined with `--wf-tcp`,`--wf-udp`.
|
||||||
|
|
||||||
|
`--wf-raw` specifies full windivert filter that replaces `--wf-tcp`,`--wf-udp`,`--wf-raw-part`.
|
||||||
|
|
||||||
|
Kernel filtering with windivert language is much more effective than passing massive amount of traffic to winws. Use it if possible to save CPU resources.
|
||||||
|
|
||||||
Multiple `winws` processes are allowed. However, it's discouraged to intersect their filters.
|
Multiple `winws` processes are allowed. However, it's discouraged to intersect their filters.
|
||||||
|
|
||||||
`--ssid-filter` allows to enable `winws` only if specified wifi networks are connected. `winws` auto detects SSID appearance and disappearance.
|
`--ssid-filter` allows to enable `winws` only if specified wifi networks are connected. `winws` auto detects SSID appearance and disappearance.
|
||||||
@@ -83,7 +91,7 @@ You must choose to install `curl`. To compile from sources install `gcc-core`,`m
|
|||||||
Make from directory `nfq` using `make cygwin64` or `make cygwin32` for 64 and 32 bit versions.
|
Make from directory `nfq` using `make cygwin64` or `make cygwin32` for 64 and 32 bit versions.
|
||||||
|
|
||||||
`winws` requires `cygwin1.dll`, `windivert.dll`, `windivert64.sys` or `windivert32.sys`.
|
`winws` requires `cygwin1.dll`, `windivert.dll`, `windivert64.sys` or `windivert32.sys`.
|
||||||
You can take them from `binaries/win64` or `binaries/win32`.
|
You can take them from `binaries/windows-x86_64` or `binaries/windows-x86`.
|
||||||
|
|
||||||
There's no `arm64` signed `windivert` driver and no `cygwin`.
|
There's no `arm64` signed `windivert` driver and no `cygwin`.
|
||||||
But it's possible to use unsigned driver version in test mode and user mode components with x64 emulation.
|
But it's possible to use unsigned driver version in test mode and user mode components with x64 emulation.
|
||||||
@@ -101,10 +109,11 @@ There are several options :
|
|||||||
Replace these 2 files in every location they are present.
|
Replace these 2 files in every location they are present.
|
||||||
In `zapret-win-bundle` they are in `zapret-winws` и `blockcheck/zapret/nfq` folders.
|
In `zapret-win-bundle` they are in `zapret-winws` и `blockcheck/zapret/nfq` folders.
|
||||||
However this option still requires 10+ year old patch that enables SHA256 signatures.
|
However this option still requires 10+ year old patch that enables SHA256 signatures.
|
||||||
|
If you're using win bundle you can simply run `win7\install_win7.cmd`
|
||||||
|
|
||||||
2. [Hack ESU](https://hackandpwn.com/windows-7-esu-patching)
|
3. [Hack ESU](https://hackandpwn.com/windows-7-esu-patching)
|
||||||
|
|
||||||
3. Use `UpdatePack7R2` from simplix : https://blog.simplix.info
|
4. Use `UpdatePack7R2` from simplix : https://blog.simplix.info
|
||||||
If you are in Russia or Belarus temporary change region in Control Panel.
|
If you are in Russia or Belarus temporary change region in Control Panel.
|
||||||
|
|
||||||
### blockcheck
|
### blockcheck
|
||||||
@@ -127,19 +136,6 @@ If you want to run `winws` from `cygwin` delete, rename or move `cygwin1.dll`.
|
|||||||
|
|
||||||
To simplify things it's advised to use `zapret-win-bundle`.
|
To simplify things it's advised to use `zapret-win-bundle`.
|
||||||
|
|
||||||
### auto start
|
|
||||||
|
|
||||||
To start `winws` with windows use windows task scheduler. There are `task_*.cmd` batch files in `binaries/win64/zapret-winws`.
|
|
||||||
They create, remove, start and stop scheduled task `winws1`. They must be run as administrator.
|
|
||||||
|
|
||||||
Edit `task_create.cmd` and write your `winws` parameters to `%WINWS1%` variable. If you need multiple `winws` instances
|
|
||||||
clone the code in all cmd files to support multiple tasks `winws1,winws2,winws3,...`.
|
|
||||||
|
|
||||||
Tasks can also be controlled from GUI `taskschd.msc`.
|
|
||||||
|
|
||||||
Also you can use windows services the same way with `service_*.cmd`.
|
|
||||||
|
|
||||||
|
|
||||||
### zapret-win-bundle
|
### zapret-win-bundle
|
||||||
|
|
||||||
To make your life easier there's ready to use [bundle](https://github.com/bol-van/zapret-win-bundle) with `cygwin`,`blockcheck` and `winws`.
|
To make your life easier there's ready to use [bundle](https://github.com/bol-van/zapret-win-bundle) with `cygwin`,`blockcheck` and `winws`.
|
||||||
@@ -165,3 +161,21 @@ unix2dos winws.log
|
|||||||
`winws.log` will be in `cygwin/home/<username>`. `unix2dos` helps with `windows 7` notepad. It's not necessary in `Windows 10` and later.
|
`winws.log` will be in `cygwin/home/<username>`. `unix2dos` helps with `windows 7` notepad. It's not necessary in `Windows 10` and later.
|
||||||
|
|
||||||
Because 32-bit systems are rare nowadays `zapret-win-bundle` exists only for `Windows x64/arm64`.
|
Because 32-bit systems are rare nowadays `zapret-win-bundle` exists only for `Windows x64/arm64`.
|
||||||
|
|
||||||
|
### auto start
|
||||||
|
|
||||||
|
To start `winws` with windows use windows task scheduler. There are `task_*.cmd` batch files in `binaries/windows-x86-64/zapret-winws`.
|
||||||
|
They create, remove, start and stop scheduled task `winws1`. They must be run as administrator.
|
||||||
|
|
||||||
|
Edit `task_create.cmd` and write your `winws` parameters to `%WINWS1%` variable. If you need multiple `winws` instances
|
||||||
|
clone the code in all cmd files to support multiple tasks `winws1,winws2,winws3,...`.
|
||||||
|
|
||||||
|
Tasks can also be controlled from GUI `taskschd.msc`.
|
||||||
|
|
||||||
|
Also you can use windows services the same way with `service_*.cmd`.
|
||||||
|
|
||||||
|
### Windows Server
|
||||||
|
|
||||||
|
winws is linked against wlanapi.dll which is absent by default.
|
||||||
|
To solve this problem run power shell as administrator and execute command `Install-WindowsFeature -Name Wireless-Networking`.
|
||||||
|
Then reboot the system.
|
||||||
|
|||||||
+56
-33
@@ -12,7 +12,7 @@ tpws в режиме socks можно запускать под более-ме
|
|||||||
Установить WSL :
|
Установить WSL :
|
||||||
`dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all`
|
`dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all`
|
||||||
|
|
||||||
Скопировать на целевую систему `binaries/x86_64/tpws_wsl.tgz`.
|
Из релиза скопировать на целевую систему `binaries/linux-x86_64/tpws_wsl.tgz`.
|
||||||
|
|
||||||
Выполнить :
|
Выполнить :
|
||||||
`wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz`
|
`wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz`
|
||||||
@@ -24,8 +24,12 @@ tpws в режиме socks можно запускать под более-ме
|
|||||||
|
|
||||||
Удаление : `wsl --unregister tpws`
|
Удаление : `wsl --unregister tpws`
|
||||||
|
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Проверено на windows 10 build 19041 (20.04).
|
> Проверено на windows 10 build 19041 (20.04) под WSL1. На WSL2 эти команды могут не сработать.
|
||||||
|
Если у вас есть WSL2, значит у вас есть работающая виртуалка с linux.
|
||||||
|
Если вы умеете с ней обращаться, tpws на ней запустить возможно без всяких проблем.
|
||||||
|
|
||||||
|
|
||||||
Возможные проблемы:
|
Возможные проблемы:
|
||||||
- Не работают функции `--oob` и `--mss` из-за ограничений реализации WSL.
|
- Не работают функции `--oob` и `--mss` из-за ограничений реализации WSL.
|
||||||
@@ -44,7 +48,7 @@ tpws в режиме socks можно запускать под более-ме
|
|||||||
|
|
||||||
Это вариант пакетного фильтра nfqws для Windows, построенный на базе windivert.
|
Это вариант пакетного фильтра nfqws для Windows, построенный на базе windivert.
|
||||||
Все функции работоспособны, однако функционал ipset в ядре отсутствует. Он реализован в user mode. Фильтры по большому количеству IP адресов невозможны.
|
Все функции работоспособны, однако функционал ipset в ядре отсутствует. Он реализован в user mode. Фильтры по большому количеству IP адресов невозможны.
|
||||||
Работа с проходящим трафиком, например в случае "расшаривания" соединения, не проверялась и не гарантируется.
|
Работа с проходящим трафиком, например в случае "расшаривания" соединения, невозможна.
|
||||||
Для работы с windivert требуются права администратора.
|
Для работы с windivert требуются права администратора.
|
||||||
Специфические для unix параметры, такие как `--uid`, `--user` и тд, исключены. Все остальные параметры аналогичны nfqws и dvtws.
|
Специфические для unix параметры, такие как `--uid`, `--user` и тд, исключены. Все остальные параметры аналогичны nfqws и dvtws.
|
||||||
|
|
||||||
@@ -63,15 +67,17 @@ secure boot могут быть проблемы из-за подписи дра
|
|||||||
Чтобы не писать сложные фильтры вручную, предусмотрены различные упрощенные варианты автоматического построения фильтров.
|
Чтобы не писать сложные фильтры вручную, предусмотрены различные упрощенные варианты автоматического построения фильтров.
|
||||||
|
|
||||||
```
|
```
|
||||||
--wf-iface=<int>[.<int>] ; числовые индексы интерфейса и суб-интерфейса
|
--wf-iface=<int>[.<int>] ; числовые индексы интерфейса и суб-интерфейса
|
||||||
--wf-l3=ipv4|ipv6 ; фильтр L3 протоколов. по умолчанию включены ipv4 и ipv6.
|
--wf-l3=ipv4|ipv6 ; фильтр L3 протоколов. по умолчанию включены ipv4 и ipv6.
|
||||||
--wf-tcp=[~]port1[-port2] ; фильтр портов для tcp. ~ означает отрицание
|
--wf-tcp=[~]port1[-port2] ; фильтр портов для tcp. ~ означает отрицание
|
||||||
--wf-udp=[~]port1[-port2] ; фильтр портов для udp. ~ означает отрицание
|
--wf-udp=[~]port1[-port2] ; фильтр портов для udp. ~ означает отрицание
|
||||||
--wf-raw=<filter>|@<filename> ; задать напрямую фильтр windivert из параметра или из файла. имени файла предшествует символ @.
|
--wf-raw-part=<filter>|@<filename> ; частичный windivert фильтр из параметра или из файла. имени файла предшествует символ @. может быть множество частей. сочетается с --wf-tcp,--wf-udp.
|
||||||
--wf-save=<filename> ; сохранить сконструированный фильтр windivert в файл для последующей правки вручную
|
--wf-filter-lan=0|1 ; отфильтровывать адреса назначения, не являющиеся глобальными inet адресами ipv4 или ipv6. по умолчанию - 1.
|
||||||
|
--wf-raw=<filter>|@<filename> ; полный windivert фильтр из параметра или из файла. имени файла предшествует символ @. замещает --wf-raw-part,--wf-tcp,--wf-udp.
|
||||||
|
--wf-save=<filename> ; сохранить сконструированный фильтр windivert в файл для последующей правки вручную
|
||||||
--ssid-filter=ssid1[,ssid2,ssid3,...] ; включать winws только когда подключена любая из указанных wifi сетей
|
--ssid-filter=ssid1[,ssid2,ssid3,...] ; включать winws только когда подключена любая из указанных wifi сетей
|
||||||
--nlm-filter=net1[,net2,net3,...] ; включать winws только когда подключена любая из указанных сетей NLM
|
--nlm-filter=net1[,net2,net3,...] ; включать winws только когда подключена любая из указанных сетей NLM
|
||||||
--nlm-list[=all] ; вывести список сетей NLM. по умолчанию только подключенных, all - всех.
|
--nlm-list[=all] ; вывести список сетей NLM. по умолчанию только подключенных, all - всех.
|
||||||
```
|
```
|
||||||
|
|
||||||
Параметры `--wf-l3`, `--wf-tcp`, `--wf-udp` могут брать несколько значений через запятую.
|
Параметры `--wf-l3`, `--wf-tcp`, `--wf-udp` могут брать несколько значений через запятую.
|
||||||
@@ -80,11 +86,19 @@ secure boot могут быть проблемы из-за подписи дра
|
|||||||
Некоторых типы соединений там не увидеть. В этом случае запускайте **winws** с параметром `--debug` и смотрите IfIdx там.
|
Некоторых типы соединений там не увидеть. В этом случае запускайте **winws** с параметром `--debug` и смотрите IfIdx там.
|
||||||
SubInterface используется windivert, но практически всегда **0**, его можно не указывать. Вероятно, он нужен в редких случаях.
|
SubInterface используется windivert, но практически всегда **0**, его можно не указывать. Вероятно, он нужен в редких случаях.
|
||||||
|
|
||||||
Конструктор фильтров автоматически включает входящие tcp пакеты с tcp synack и tcp rst для корректной работы функций
|
Конструктор стандартных фильтров автоматически включает входящие tcp пакеты с tcp synack и tcp rst для корректной работы функций
|
||||||
autottl и autohostlist. При включении autohostlist так же перенаправляются пакеты данных с http redirect с кодами 302 и 307.
|
autottl и autohostlist. При включении autohostlist так же перенаправляются пакеты данных с http redirect с кодами 302 и 307.
|
||||||
Всегда добавляется фильтр на исключение не-интернет адресов ipv4 и ipv6.
|
Если не указаное иное, добавляется фильтр на исключение не-интернет адресов ipv4 и ipv6.
|
||||||
Для сложных нестандартных сценариев могут потребоваться свои фильтры. Логично будет начать со стандартного шаблона,
|
Для сложных нестандартных сценариев могут потребоваться свои фильтры. Полный фильтр --wf-raw замещает все остальное.
|
||||||
сохраненного через `--wf-save`. Нужно править файл и подсовывать его в параметре `--wf-raw`. Максимальный размер фильтра - **8 Kb**.
|
Частичные фильтры `--wf-raw-part` совместимы друг с другом и `--wf-tcp` и `--wf-udp`. Они позволяют исключить написание
|
||||||
|
громоздких полных фильтров, сосредоточившись лишь на добавлении какого-то особенного пейлоада.
|
||||||
|
`--wf-save` позволяет записать итоговый windivert фильтр в файл. Максимальный размер фильтра - **16 Kb**.
|
||||||
|
|
||||||
|
Фильтрация windivert производится в ядре. Это несравнимо легче по ресурсам, чем перенаправлять пакеты в пространство user mode,
|
||||||
|
чтобы winws принимал решение. Поэтому пользуйтесь по максимуму возможностями windivert.
|
||||||
|
Например, если вам нужно дурить wireguard на все порты, вам придется перенаправить все порты на winws. Или же написать windivert фильтр, который отсечет wireguard по содержимому пакета.
|
||||||
|
Разница в нагрузке на процессор колоссальна. В первом случае - до 100% одного ядра cpu в зависимости от обьема исходящего udp трафика (привет, торрент и uTP), во втором - близко к 0.
|
||||||
|
Кроме нагрузки на процессор еще можете порезать себе скорость, тк одно ядро не будет справляться с обработкой вашего гигабитного интернета. А на старых ноутах еще и получите самолетный вой системы охлаждения, приводящий к ее износу.
|
||||||
|
|
||||||
Можно запускать несколько процессов **winws** с разными стратегиями. Однако, не следует делать пересекающиеся фильтры.
|
Можно запускать несколько процессов **winws** с разными стратегиями. Однако, не следует делать пересекающиеся фильтры.
|
||||||
|
|
||||||
@@ -125,7 +139,7 @@ network locations в win10/11. Кое-что есть в **powershell**.
|
|||||||
|
|
||||||
Существует неочевидный момент, каcаемый запуска **winws** из cygwin shell\`а. Если в директории, где находится winws, находится
|
Существует неочевидный момент, каcаемый запуска **winws** из cygwin shell\`а. Если в директории, где находится winws, находится
|
||||||
копия `cygwin1.dll`, **winws** не запустится.
|
копия `cygwin1.dll`, **winws** не запустится.
|
||||||
Если нужен запуск под cygwin, то следует удалить или переместить `cygwin1.dll` из `binaries/win64`. Это нужно для работы blockcheck.
|
Если нужен запуск под cygwin, то следует удалить или переместить `cygwin1.dll` из `binaries/windows-x86_64`. Это нужно для работы blockcheck.
|
||||||
Из cygwin шелла можно посылать winws сигналы через `kill` точно так же, как в `*nix`.
|
Из cygwin шелла можно посылать winws сигналы через `kill` точно так же, как в `*nix`.
|
||||||
|
|
||||||
Как получить совместимый с windows 7 и winws cygwin :
|
Как получить совместимый с windows 7 и winws cygwin :
|
||||||
@@ -159,6 +173,7 @@ _windivert 2.2.2-A_, который идет в поставке zapret.
|
|||||||
и заменить эти 2 файла.
|
и заменить эти 2 файла.
|
||||||
В [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle) есть отдельных 2 места, где находится **winws** : [_zapret-winws_](https://github.com/bol-van/zapret-win-bundle/tree/master/zapret-winws) и [_blockcheck/zapret/nfq_](https://github.com/bol-van/zapret-win-bundle/tree/master/blockcheck).
|
В [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle) есть отдельных 2 места, где находится **winws** : [_zapret-winws_](https://github.com/bol-van/zapret-win-bundle/tree/master/zapret-winws) и [_blockcheck/zapret/nfq_](https://github.com/bol-van/zapret-win-bundle/tree/master/blockcheck).
|
||||||
Надо менять в обоих местах.
|
Надо менять в обоих местах.
|
||||||
|
Альтернативный вариант при использовании win bundle - запустить `win7\install_win7.cmd`
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Этот вариант проверен и должен работать. Тем не менее патч 10 летней давности, который включает SHA256 сигнатуры, все еще необходим.
|
> Этот вариант проверен и должен работать. Тем не менее патч 10 летней давности, который включает SHA256 сигнатуры, все еще необходим.
|
||||||
@@ -168,7 +183,9 @@ https://hackandpwn.com/windows-7-esu-patching/
|
|||||||
http://www.bifido.net/tweaks-and-scripts/8-extended-security-updates-installer.html
|
http://www.bifido.net/tweaks-and-scripts/8-extended-security-updates-installer.html
|
||||||
и обновить систему
|
и обновить систему
|
||||||
|
|
||||||
3) Использовать UpdatePack7R2 от simplix : https://blog.simplix.info
|
3) Использовать готовый патчер-взламыватель ESU - "BypassESU". Его надо искать по названию.
|
||||||
|
|
||||||
|
4) Использовать UpdatePack7R2 от simplix : https://blog.simplix.info
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Но с этим паком есть проблема. Автор из Украины, он очень обиделся на русских.
|
> Но с этим паком есть проблема. Автор из Украины, он очень обиделся на русских.
|
||||||
> Если в панели управления стоит регион RU или BY, появляется неприятный диалог.
|
> Если в панели управления стоит регион RU или BY, появляется неприятный диалог.
|
||||||
@@ -202,22 +219,6 @@ _cygwin_ для обычной работы **winws** не нужен.
|
|||||||
Однако, хотя такой способ и работает, использование **winws** сильно облегчает [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle).
|
Однако, хотя такой способ и работает, использование **winws** сильно облегчает [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle).
|
||||||
Там нет проблемы с `cygwin.dll`.
|
Там нет проблемы с `cygwin.dll`.
|
||||||
|
|
||||||
## Автозапуск winws
|
|
||||||
|
|
||||||
Для запуска **winws** вместе с windows есть 2 варианта. Планировщик задач или службы windows.
|
|
||||||
|
|
||||||
Можно создавать задачи и управлять ими через консольную программу schtasks.
|
|
||||||
В директории `binaries/win64/winws` подготовлены файлы `task_*.cmd` .
|
|
||||||
В них реализовано создание, удаление, старт и стоп одной копии процесса winws с параметрами из переменной `%WINWS1%`.
|
|
||||||
Исправьте параметры на нужную вам стратегию. Если для разных фильтров применяется разная стратегия, размножьте код
|
|
||||||
для задач _winws1_,_winws2_,_winws3_,_..._
|
|
||||||
|
|
||||||
Аналогично настраивается вариант запуска через службы windows. Смотрите `service_*.cmd`.
|
|
||||||
|
|
||||||
Все батники требуется запускать от имени администратора.
|
|
||||||
|
|
||||||
Управлять задачами можно так же из графической программы управления планировщиком `taskschd.msc`
|
|
||||||
|
|
||||||
## Zapret-win-bundle
|
## Zapret-win-bundle
|
||||||
|
|
||||||
Можно не возиться с _cygwin_, а взять готовый пакет, включающий в себя _cygwin_ и _blockcheck_ : https://github.com/bol-van/zapret-win-bundle
|
Можно не возиться с _cygwin_, а взять готовый пакет, включающий в себя _cygwin_ и _blockcheck_ : https://github.com/bol-van/zapret-win-bundle
|
||||||
@@ -256,3 +257,25 @@ _zapret-winws_ - это отдельный комплект для повсед
|
|||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> Поскольку 32-битные windows мало востребованы, _zapret-win-bundle_ существует только в варианте для windows _x64/arm64_.
|
> Поскольку 32-битные windows мало востребованы, _zapret-win-bundle_ существует только в варианте для windows _x64/arm64_.
|
||||||
|
|
||||||
|
## Автозапуск winws
|
||||||
|
|
||||||
|
Для запуска **winws** вместе с windows есть 2 варианта. Планировщик задач или службы windows.
|
||||||
|
|
||||||
|
Можно создавать задачи и управлять ими через консольную программу schtasks.
|
||||||
|
В директории `binaries/windows-x86_64/winws` подготовлены файлы `task_*.cmd` .
|
||||||
|
В них реализовано создание, удаление, старт и стоп одной копии процесса winws с параметрами из переменной `%WINWS1%`.
|
||||||
|
Исправьте параметры на нужную вам стратегию. Если для разных фильтров применяется разная стратегия, размножьте код
|
||||||
|
для задач _winws1_,_winws2_,_winws3_,_..._
|
||||||
|
|
||||||
|
Аналогично настраивается вариант запуска через службы windows. Смотрите `service_*.cmd`.
|
||||||
|
|
||||||
|
Все батники требуется запускать от имени администратора.
|
||||||
|
|
||||||
|
Управлять задачами можно так же из графической программы управления планировщиком `taskschd.msc`
|
||||||
|
|
||||||
|
## Особенности Windows Server
|
||||||
|
|
||||||
|
winws слинкован с wlanapi.dll, который по умолчанию не установлен в windows server.
|
||||||
|
Для решения этой проблемы запустите power shell под администратором и выполните команду `Install-WindowsFeature -Name Wireless-Networking`.
|
||||||
|
После чего перезагрузите систему.
|
||||||
|
|||||||
@@ -1,133 +0,0 @@
|
|||||||
Index: WireGuard-0.0.20190123/src/cookie.c
|
|
||||||
===================================================================
|
|
||||||
--- WireGuard-0.0.20190123.orig/src/cookie.c
|
|
||||||
+++ WireGuard-0.0.20190123/src/cookie.c
|
|
||||||
@@ -193,6 +193,8 @@ void wg_cookie_message_create(struct mes
|
|
||||||
xchacha20poly1305_encrypt(dst->encrypted_cookie, cookie, COOKIE_LEN,
|
|
||||||
macs->mac1, COOKIE_LEN, dst->nonce,
|
|
||||||
checker->cookie_encryption_key);
|
|
||||||
+ // MOD : randomize trash
|
|
||||||
+ dst->header.trash = gen_trash();
|
|
||||||
}
|
|
||||||
|
|
||||||
void wg_cookie_message_consume(struct message_handshake_cookie *src,
|
|
||||||
Index: WireGuard-0.0.20190123/src/messages.h
|
|
||||||
===================================================================
|
|
||||||
--- WireGuard-0.0.20190123.orig/src/messages.h
|
|
||||||
+++ WireGuard-0.0.20190123/src/messages.h
|
|
||||||
@@ -53,23 +53,41 @@ enum limits {
|
|
||||||
MAX_QUEUED_PACKETS = 1024 /* TODO: replace this with DQL */
|
|
||||||
};
|
|
||||||
|
|
||||||
+/*
|
|
||||||
enum message_type {
|
|
||||||
- MESSAGE_INVALID = 0,
|
|
||||||
- MESSAGE_HANDSHAKE_INITIATION = 1,
|
|
||||||
- MESSAGE_HANDSHAKE_RESPONSE = 2,
|
|
||||||
- MESSAGE_HANDSHAKE_COOKIE = 3,
|
|
||||||
- MESSAGE_DATA = 4
|
|
||||||
+ MESSAGE_INVALID = 0,
|
|
||||||
+ MESSAGE_HANDSHAKE_INITIATION = 1,
|
|
||||||
+ MESSAGE_HANDSHAKE_RESPONSE = 2,
|
|
||||||
+ MESSAGE_HANDSHAKE_COOKIE = 3,
|
|
||||||
+ MESSAGE_DATA = 4
|
|
||||||
};
|
|
||||||
+*/
|
|
||||||
+
|
|
||||||
+// MOD : message type
|
|
||||||
+enum message_type {
|
|
||||||
+ MESSAGE_INVALID = 0xE319CCD0,
|
|
||||||
+ MESSAGE_HANDSHAKE_INITIATION = 0x48ADE198,
|
|
||||||
+ MESSAGE_HANDSHAKE_RESPONSE = 0xFCA6A8F3,
|
|
||||||
+ MESSAGE_HANDSHAKE_COOKIE = 0x64A3BB18,
|
|
||||||
+ MESSAGE_DATA = 0x391820AA
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+// MOD : generate fast trash without true RNG
|
|
||||||
+__le32 gen_trash(void);
|
|
||||||
|
|
||||||
struct message_header {
|
|
||||||
- /* The actual layout of this that we want is:
|
|
||||||
- * u8 type
|
|
||||||
- * u8 reserved_zero[3]
|
|
||||||
- *
|
|
||||||
- * But it turns out that by encoding this as little endian,
|
|
||||||
- * we achieve the same thing, and it makes checking faster.
|
|
||||||
- */
|
|
||||||
- __le32 type;
|
|
||||||
+ /* The actual layout of this that we want is:
|
|
||||||
+ * u8 type
|
|
||||||
+ * u8 reserved_zero[3]
|
|
||||||
+ *
|
|
||||||
+ * But it turns out that by encoding this as little endian,
|
|
||||||
+ * we achieve the same thing, and it makes checking faster.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+ // MOD : trash field to change message size and add 4 byte offset to all fields
|
|
||||||
+ __le32 trash;
|
|
||||||
+
|
|
||||||
+ __le32 type;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct message_macs {
|
|
||||||
Index: WireGuard-0.0.20190123/src/noise.c
|
|
||||||
===================================================================
|
|
||||||
--- WireGuard-0.0.20190123.orig/src/noise.c
|
|
||||||
+++ WireGuard-0.0.20190123/src/noise.c
|
|
||||||
@@ -17,6 +17,24 @@
|
|
||||||
#include <linux/highmem.h>
|
|
||||||
#include <crypto/algapi.h>
|
|
||||||
|
|
||||||
+
|
|
||||||
+// MOD : trash generator
|
|
||||||
+__le32 gtrash = 0;
|
|
||||||
+__le32 gen_trash(void)
|
|
||||||
+{
|
|
||||||
+ if (gtrash)
|
|
||||||
+ gtrash = gtrash*1103515243 + 12345;
|
|
||||||
+ else
|
|
||||||
+ // first value is true random
|
|
||||||
+ get_random_bytes_wait(>rash, sizeof(gtrash));
|
|
||||||
+ return gtrash;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* This implements Noise_IKpsk2:
|
|
||||||
*
|
|
||||||
* <- s
|
|
||||||
@@ -515,6 +533,10 @@ wg_noise_handshake_create_initiation(str
|
|
||||||
&handshake->entry);
|
|
||||||
|
|
||||||
handshake->state = HANDSHAKE_CREATED_INITIATION;
|
|
||||||
+
|
|
||||||
+ // MOD : randomize trash
|
|
||||||
+ dst->header.trash = gen_trash();
|
|
||||||
+
|
|
||||||
ret = true;
|
|
||||||
|
|
||||||
out:
|
|
||||||
@@ -655,6 +677,10 @@ bool wg_noise_handshake_create_response(
|
|
||||||
&handshake->entry);
|
|
||||||
|
|
||||||
handshake->state = HANDSHAKE_CREATED_RESPONSE;
|
|
||||||
+
|
|
||||||
+ // MOD : randomize trash
|
|
||||||
+ dst->header.trash = gen_trash();
|
|
||||||
+
|
|
||||||
ret = true;
|
|
||||||
|
|
||||||
out:
|
|
||||||
Index: WireGuard-0.0.20190123/src/send.c
|
|
||||||
===================================================================
|
|
||||||
--- WireGuard-0.0.20190123.orig/src/send.c
|
|
||||||
+++ WireGuard-0.0.20190123/src/send.c
|
|
||||||
@@ -200,6 +200,10 @@ static bool encrypt_packet(struct sk_buf
|
|
||||||
header->header.type = cpu_to_le32(MESSAGE_DATA);
|
|
||||||
header->key_idx = keypair->remote_index;
|
|
||||||
header->counter = cpu_to_le64(PACKET_CB(skb)->nonce);
|
|
||||||
+
|
|
||||||
+ // MOD : randomize trash
|
|
||||||
+ header->header.trash = gen_trash();
|
|
||||||
+
|
|
||||||
pskb_put(skb, trailer, trailer_len);
|
|
||||||
|
|
||||||
/* Now we can encrypt the scattergather segments */
|
|
||||||
@@ -1,250 +0,0 @@
|
|||||||
!!! Эта инструкция написана еще до включения wireguard в ядро linux.
|
|
||||||
!!! Процесс сборки для in-tree модулей отличается.
|
|
||||||
!!! Цель данного чтива - дать идею для программистов как можно исправить исходники wireguard
|
|
||||||
!!! для преодоления DPI. Автор не преследует цели поддерживать готовые патчи для актуальных версий.
|
|
||||||
!!! Вместо патчинга гораздо проще использовать навесное решение ipobfs.
|
|
||||||
|
|
||||||
Посвящено возможной блокировке в РФ VPN протоколов через DPI.
|
|
||||||
Предпосылками являются последние законодательные акты и во всю сочащиеся "секретные" записки.
|
|
||||||
В РФ разрабатываются и готовятся к применению более продвинутые решения по блокировке трафика.
|
|
||||||
Вполне вероятно будут резать стандартные VPN протоколы. Нам надо быть к этому готовыми.
|
|
||||||
|
|
||||||
Один из возможных и перспективных путей решения данного вопроса - кустомная модификация
|
|
||||||
исходников VPN с целью незначительного изменения протокола, ломающего стандартные модули обнаружения в DPI.
|
|
||||||
Это относительно сложно, доступно только для гиков.
|
|
||||||
Никто не будет разрабатывать специальные модули обнаружения в DPI, если только кто-то не сделает простое и
|
|
||||||
удобное решение для всех, и его станут широко применять. Но это маловероятно, и даже если и так,
|
|
||||||
то всегда можно модифицировать протокол чуток по другому. Делать моды для DPI несравненно дольше
|
|
||||||
и дороже, чем клепать на коленке изменения протокола для wireguard.
|
|
||||||
|
|
||||||
|
|
||||||
ЗАМЕЧЕНИЕ : альтернативой модификации конечного софта для VPN является использование "навесных"
|
|
||||||
обфускаторов. см : https://github.com/bol-van/ipobfs
|
|
||||||
|
|
||||||
|
|
||||||
Рассмотрю что нам надо пропатчить в wireguard. Модифицированный wireguard проверен на виртуалках
|
|
||||||
с десктопным linux, он работает, сообщения в wireshark действительно не вписываются в стандартный
|
|
||||||
протокол и не опознаются.
|
|
||||||
|
|
||||||
Wireguard протокол очень простой. Все сообщения описаны в messages.h
|
|
||||||
Поставим себе целью сделать 2 простые модификации :
|
|
||||||
1) Добавим в начало всех сообщений немного мусора, чтобы изменить размер сообщений и смещения полей
|
|
||||||
2) Изменим коды типов сообщений
|
|
||||||
Этого может быть вполне достаточно для обмана DPI
|
|
||||||
|
|
||||||
--messages.h--------------------------
|
|
||||||
/*
|
|
||||||
enum message_type {
|
|
||||||
MESSAGE_INVALID = 0,
|
|
||||||
MESSAGE_HANDSHAKE_INITIATION = 1,
|
|
||||||
MESSAGE_HANDSHAKE_RESPONSE = 2,
|
|
||||||
MESSAGE_HANDSHAKE_COOKIE = 3,
|
|
||||||
MESSAGE_DATA = 4
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
// MOD : message type
|
|
||||||
enum message_type {
|
|
||||||
MESSAGE_INVALID = 0xE319CCD0,
|
|
||||||
MESSAGE_HANDSHAKE_INITIATION = 0x48ADE198,
|
|
||||||
MESSAGE_HANDSHAKE_RESPONSE = 0xFCA6A8F3,
|
|
||||||
MESSAGE_HANDSHAKE_COOKIE = 0x64A3BB18,
|
|
||||||
MESSAGE_DATA = 0x391820AA
|
|
||||||
};
|
|
||||||
|
|
||||||
// MOD : generate fast trash without true RNG
|
|
||||||
__le32 gen_trash(void);
|
|
||||||
|
|
||||||
struct message_header {
|
|
||||||
/* The actual layout of this that we want is:
|
|
||||||
* u8 type
|
|
||||||
* u8 reserved_zero[3]
|
|
||||||
*
|
|
||||||
* But it turns out that by encoding this as little endian,
|
|
||||||
* we achieve the same thing, and it makes checking faster.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// MOD : trash field to change message size and add 4 byte offset to all fields
|
|
||||||
__le32 trash;
|
|
||||||
|
|
||||||
__le32 type;
|
|
||||||
};
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
Напишем функцию для генерации trash. Функция должна быть быстрая, важно не замедлить скорость.
|
|
||||||
Мы не расчитываем, что нас будут специально ловить, иначе бы пришлось делать полноценный обфускатор.
|
|
||||||
Задача лишь сломать стандартный модуль обнаружения протокола wireguard. Потому истинная рандомность
|
|
||||||
trash не важна.
|
|
||||||
Но все же немного "трэша" не повредит. Гонки между тредами так же пофигистичны. Это же трэш.
|
|
||||||
|
|
||||||
--noise.c-----------------------------
|
|
||||||
// MOD : trash generator
|
|
||||||
__le32 gtrash = 0;
|
|
||||||
__le32 gen_trash(void)
|
|
||||||
{
|
|
||||||
if (gtrash)
|
|
||||||
gtrash = gtrash*1103515243 + 12345;
|
|
||||||
else
|
|
||||||
// first value is true random
|
|
||||||
get_random_bytes_wait(>rash, sizeof(gtrash));
|
|
||||||
return gtrash;
|
|
||||||
}
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
Теперь осталось найти все места, где создаются сообщения и внести туда заполнение поля trash.
|
|
||||||
Сообщений всего 4. Их можно найти по присваиванию полю type одного из значений enum message_type.
|
|
||||||
|
|
||||||
2 места в noise.c в функциях wg_noise_handshake_create_initiation и wg_noise_handshake_create_response,
|
|
||||||
1 место в cookie.c в функции wg_cookie_message_create
|
|
||||||
Дописываем в конец инициализации структуры сообщения :
|
|
||||||
|
|
||||||
--------------------------------------
|
|
||||||
// MOD : randomize trash
|
|
||||||
dst->header.trash = gen_trash();
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
и 1 место в send.c в функции encrypt_packet
|
|
||||||
|
|
||||||
--------------------------------------
|
|
||||||
// MOD : randomize trash
|
|
||||||
header->header.trash = gen_trash();
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
Вот и весь патчинг. Полный patch (версия wireguard 0.0.20190123) лежит в 010-wg-mod.patch.
|
|
||||||
Патчинг кода - самое простое. Для десктопного linux дальше все просто.
|
|
||||||
Пересобираем через make, устанавливаем через make install, перегружаем
|
|
||||||
модуль wireguard, перезапускаем интерфейсы, и все готово.
|
|
||||||
|
|
||||||
Настоящий геморой начнется когда вы это попытаетесь засунуть на роутер под openwrt.
|
|
||||||
Одна из больших проблем linux - отсутствие совместимости драйверов на уровне бинариков.
|
|
||||||
Поэтому собирать необходимо в точности под вашу версию ядра и в точности под его .config.
|
|
||||||
Вам придется либо полностью самостоятельно собирать всю прошивку, либо найти SDK в точности
|
|
||||||
от вашей версии прошивки для вашей архитектуры и собрать модуль с помощью этого SDK.
|
|
||||||
Последний вариант более легкий.
|
|
||||||
Для сборки вам понадобится система на linux x86_64. Ее можно установить в виртуалке.
|
|
||||||
Теоретически можно пользоваться WSL из win10, но на практике там очень медленное I/O,
|
|
||||||
по крайней мере на старых версиях win10. Безумно медленное. Будете собирать вечность.
|
|
||||||
Может в новых win10 что-то и улучшили, но я бы сразу расчитывал на полноценный linux.
|
|
||||||
|
|
||||||
Находим здесь вашу версию : https://downloads.openwrt.org/
|
|
||||||
Скачиваем файл openwrt-sdk-*.tar.xz или lede-sdk-*.tar.xz
|
|
||||||
Например : https://downloads.openwrt.org/releases/18.06.2/targets/ar71xx/generic/openwrt-sdk-18.06.2-ar71xx-generic_gcc-7.3.0_musl.Linux-x86_64.tar.xz
|
|
||||||
Если ваша версия непонятна или стара, то проще будет найти последнюю прошивку и перешить роутер.
|
|
||||||
Распаковываем SDK. Следующими командами можно собрать оригинальный вариант wireguard :
|
|
||||||
|
|
||||||
# scripts/feeds update -a
|
|
||||||
# scripts/feeds install -a
|
|
||||||
# make defconfig
|
|
||||||
# make -j 4 package/wireguard/compile
|
|
||||||
|
|
||||||
Сборка будет довольно долгой. Ведь придется подтащить ядро, собрать его, собрать зависимости.
|
|
||||||
"-j 4" означает использовать 4 потока. Впишите вместо 4 количество доступных cpu cores.
|
|
||||||
|
|
||||||
Получим следующие файлы :
|
|
||||||
|
|
||||||
openwrt-sdk-18.06.2-ar71xx-generic_gcc-7.3.0_musl.Linux-x86_64/bin/targets/ar71xx/generic/packages/kmod-wireguard_4.9.152+0.0.20190123-1_mips_24kc.ipk
|
|
||||||
openwrt-sdk-18.06.2-ar71xx-generic_gcc-7.3.0_musl.Linux-x86_64/bin/packages/mips_24kc/base/wireguard-tools_0.0.20190123-1_mips_24kc.ipk
|
|
||||||
|
|
||||||
Но это будет оригинальный wireguard. Нам нужен патченый.
|
|
||||||
Установим quilt и mc для нормального редактора вместо vim :
|
|
||||||
|
|
||||||
# sudo apt-get update
|
|
||||||
# sudo apt-get install quilt mc
|
|
||||||
|
|
||||||
# make package/wireguard/clean
|
|
||||||
# make package/wireguard/prepare V=s QUILT=1
|
|
||||||
|
|
||||||
|
|
||||||
Сорцы приготовлены для сборки в :
|
|
||||||
openwrt-sdk-18.06.2-ar71xx-generic_gcc-7.3.0_musl.Linux-x86_64/build_dir/target-mips_24kc_musl/linux-ar71xx_generic/WireGuard-0.0.20190123/src
|
|
||||||
|
|
||||||
# cd build_dir/target-mips_24kc_musl/linux-ar71xx_generic/WireGuard-0.0.20190123/src
|
|
||||||
# quilt push -a
|
|
||||||
# quilt new 010-wg-mod.patch
|
|
||||||
# export EDITOR=mcedit
|
|
||||||
|
|
||||||
Далее будет открываться редактор mcedit, в который нужно вносить изменения в каждый файл :
|
|
||||||
|
|
||||||
# quilt edit messages.h
|
|
||||||
# quilt edit cookie.c
|
|
||||||
# quilt edit noise.c
|
|
||||||
# quilt edit send.c
|
|
||||||
# quilt diff
|
|
||||||
# quilt refresh
|
|
||||||
|
|
||||||
Получили файл патча в :
|
|
||||||
openwrt-sdk-18.06.2-ar71xx-generic_gcc-7.3.0_musl.Linux-x86_64/build_dir/target-mips_24kc_musl/linux-ar71xx_generic/WireGuard-0.0.20190123/patches/010-wg-mod.patch
|
|
||||||
|
|
||||||
Выходим в корень SDK.
|
|
||||||
|
|
||||||
# make package/wireguard/compile V=99
|
|
||||||
|
|
||||||
Если не было ошибок, то получили измененные ipk.
|
|
||||||
Патч можно зафиксировать в описании пакета :
|
|
||||||
|
|
||||||
# make package/wireguard/update
|
|
||||||
|
|
||||||
Получим :
|
|
||||||
openwrt-sdk-18.06.2-ar71xx-generic_gcc-7.3.0_musl.Linux-x86_64/feeds/base/package/network/services/wireguard/patches/010-wg-mod.patch
|
|
||||||
При последующей очистке и пересборке он будет автоматом применяться.
|
|
||||||
|
|
||||||
|
|
||||||
АЛЬТЕРНАТИВА : можно не возиться с quilt.
|
|
||||||
сделайте
|
|
||||||
# make package/wireguard/clean
|
|
||||||
# make package/wireguard/prepare
|
|
||||||
и напрямую модифицируйте или копируйте файлы в
|
|
||||||
openwrt-sdk-18.06.2-ar71xx-generic_gcc-7.3.0_musl.Linux-x86_64/build_dir/target-mips_24kc_musl/linux-ar71xx_generic/WireGuard-0.0.20190123/src
|
|
||||||
затем
|
|
||||||
# make package/wireguard/compile
|
|
||||||
|
|
||||||
Если нужно поменять версию wireguard, то идите в
|
|
||||||
openwrt-sdk-18.06.2-ar71xx-generic_gcc-7.3.0_musl.Linux-x86_64/feeds/base/package/network/services/wireguard/Makefile
|
|
||||||
поменяйте там версию в PKG_VERSION на последнюю из : https://git.zx2c4.com/WireGuard
|
|
||||||
скачайте tar.xz с этой версией , вычислите его sha256sum, впишите в PKG_HASH
|
|
||||||
|
|
||||||
1 раз где-нибудь пропатчите файлы последней версии wireguard в текстовом редакторе, скопируйте в build_dir,
|
|
||||||
сделайте версию для openwrt. эти же файлы скопируйте на ваш сервер с десктопным linux, сделайте там make / make install
|
|
||||||
|
|
||||||
Но имейте в виду, что build_dir - локация для временных файлов.
|
|
||||||
make clean оттуда все снесет, включая ваши модификации. Модифицированные файлы лучше сохранить отдельно,
|
|
||||||
чтобы потом было легко скопировать обратно.
|
|
||||||
|
|
||||||
Полученные ipk копируем на роутер в /tmp, устанавливаем через
|
|
||||||
# cd /tmp
|
|
||||||
# rm -r /tmp/opkg-lists
|
|
||||||
# opkg install *.ipk
|
|
||||||
Если требует зависимостей, то
|
|
||||||
# opkg update
|
|
||||||
# opkg install .... <зависимости>
|
|
||||||
# rm -r /tmp/opkg-lists
|
|
||||||
# opkg install *.ipk
|
|
||||||
|
|
||||||
В /tmp/opkg-lists opkg хранит кэш списка пакетов. Если попытаться установить файл ipk, и такой же пакет
|
|
||||||
найдется в репозитории, opkg будет устанавливать из репозитория. А нам это не надо.
|
|
||||||
|
|
||||||
# rmmod wireguard
|
|
||||||
# kmodloader
|
|
||||||
# dmesg | tail
|
|
||||||
должны увидеть что-то вроде :
|
|
||||||
[8985.415490] wireguard: WireGuard 0.0.20190123 loaded. See www.wireguard.com for information.
|
|
||||||
[8985.424178] wireguard: Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
|
|
||||||
значит модуль загрузился
|
|
||||||
|
|
||||||
Могут понадобиться ключи opkg --force-reinstall, --force-depends.
|
|
||||||
--force-depends поможет при несоответствии hash версии ядра. То есть версия x.x.x та же самая, но hash конфигурации разный.
|
|
||||||
При несоответствии x.x.x вы что-то делаете не так, работать это не будет.
|
|
||||||
Например : 4.14.56-1-b1186491495127cc6ff81d29c00a91fc, 4.14.56-1-3f8a21a63974cfb7ee67e41f2d4b805d
|
|
||||||
Это свидетельствует о несоответствии .config ядра при сборке прошивки и в SDK.
|
|
||||||
Если несоответствие легкое, то может все прокатить, но при более серьезной разнице в .config модуль может не загрузиться
|
|
||||||
или вызвать стабильные или хаотические падения ядра и перезагрузки (включая вариант беcконечной перезагрузки - bootloop).
|
|
||||||
Так что перед --force-depends убедитесь, что знаете как лечится такая ситуация, и не стоит это делать при отсутствии физического
|
|
||||||
доступа к девайсу.
|
|
||||||
|
|
||||||
Когда поднимите линк, и вдруг ничего не будет работать, то посмотрите в wireshark udp пакеты
|
|
||||||
на порт endpoint. Они не должны начинаться с 0,1,2,3,4. В первых 4 байтах должен быть рандом,
|
|
||||||
в следующих 4 байтах - значения из измененного enum message_type. Если пакет все еще начинается с 0..4,
|
|
||||||
значит модуль wireguard оригинальный, что-то не собралось, не скопировалось, не перезапустилось.
|
|
||||||
В противном случае должен подняться линк, пинги ходить. Значит вы победили, поздравляю.
|
|
||||||
Регулятору будет намного сложнее поймать ваш VPN.
|
|
||||||
@@ -236,7 +236,7 @@ config rule
|
|||||||
|
|
||||||
--- Подготовка zapret ---
|
--- Подготовка zapret ---
|
||||||
|
|
||||||
Выполните install_easy.sh. Он настроит режим обхода DPI. Если обход DPI не нужен - выберите MODE=filter.
|
Выполните install_easy.sh. Он настроит режим обхода DPI. Если обход DPI не нужен - не включайте tpws и nfqws.
|
||||||
Так же инсталятор заресолвит домены из ipset/zapret-hosts-user-ipban.txt и внесет крон-джоб для периодического обновления ip.
|
Так же инсталятор заресолвит домены из ipset/zapret-hosts-user-ipban.txt и внесет крон-джоб для периодического обновления ip.
|
||||||
|
|
||||||
Если вы используете в своих правилах ipset zapret, то он ресолвится и обновляется только, если выбран режим фильтрации обхода DPI по ipset.
|
Если вы используете в своих правилах ipset zapret, то он ресолвится и обновляется только, если выбран режим фильтрации обхода DPI по ipset.
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,22 @@
|
|||||||
|
# This script fixes keenetic issue with nfqws generated udp packets
|
||||||
|
# Keenetic uses proprietary ndmmark and does not masquerade without this mark
|
||||||
|
# If not masqueraded packets go to WAN with LAN IP and get dropped by ISP
|
||||||
|
|
||||||
|
# It's advised to set IFACE_WAN in config
|
||||||
|
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
|
local wan wanif rule
|
||||||
|
|
||||||
|
[ "$DISABLE_IPV4" = "1" ] || {
|
||||||
|
# use IFACE_WAN if defined. if not - search for interfaces with default route.
|
||||||
|
wanif=${IFACE_WAN:-$(sed -nre 's/^([^\t]+)\t00000000\t[0-9A-F]{8}\t[0-9A-F]{4}\t[0-9]+\t[0-9]+\t[0-9]+\t00000000.*$/\1/p' /proc/net/route | sort -u | xargs)}
|
||||||
|
for wan in $wanif; do
|
||||||
|
rule="-o $wan -p udp -m mark --mark $DESYNC_MARK/$DESYNC_MARK"
|
||||||
|
ipt_print_op $1 "$rule" "keenetic udp fix"
|
||||||
|
ipt_add_del $1 POSTROUTING -t nat $rule -j MASQUERADE
|
||||||
|
done
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
# this custom script runs standard mode with extra firewall rules
|
||||||
|
|
||||||
|
# config: use TPWS_ENABLE_OVERRIDE, NFQWS_ENABLE_OVERRIDE to enable standard mode daemons
|
||||||
|
# standard and override switches cannot be enabled simultaneously !
|
||||||
|
|
||||||
|
TPWS_ENABLE_OVERRIDE=${TPWS_ENABLE_OVERRIDE:-0}
|
||||||
|
NFQWS_ENABLE_OVERRIDE=${NFQWS_ENABLE_OVERRIDE:-0}
|
||||||
|
|
||||||
|
# config: some if these values must be set in config. not setting any of these makes this script meaningless.
|
||||||
|
# pre vars put ipt/nft code to the rule beginning
|
||||||
|
#FW_EXTRA_PRE_TPWS_IPT=
|
||||||
|
#FW_EXTRA_PRE_TPWS_NFT=
|
||||||
|
#FW_EXTRA_PRE_NFQWS_IPT="-m mark --mark 0x10000000/0x10000000"
|
||||||
|
#FW_EXTRA_PRE_NFQWS_NFT="mark and 0x10000000 != 0"
|
||||||
|
# post vars put ipt/nft code to the rule end
|
||||||
|
#FW_EXTRA_POST_TPWS_IPT=
|
||||||
|
#FW_EXTRA_POST_TPWS_NFT=
|
||||||
|
#FW_EXTRA_POST_NFQWS_IPT=
|
||||||
|
#FW_EXTRA_POST_NFQWS_NFT=
|
||||||
|
|
||||||
|
check_std_intersect()
|
||||||
|
{
|
||||||
|
[ "$TPWS_ENABLE_OVERRIDE" = 1 -a "$TPWS_ENABLE" = 1 ] && {
|
||||||
|
echo "ERROR ! both TPWS_ENABLE_OVERRIDE and TPWS_ENABLE are enabled"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
[ "$NFQWS_ENABLE_OVERRIDE" = 1 -a "$NFQWS_ENABLE" = 1 ] && {
|
||||||
|
echo "ERROR ! both NFQWS_ENABLE_OVERRIDE and NFQWS_ENABLE are enabled"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
zapret_custom_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
|
check_std_intersect || return
|
||||||
|
|
||||||
|
local TPWS_SOCKS_ENABLE=0 TPWS_ENABLE=$TPWS_ENABLE_OVERRIDE NFQWS_ENABLE=$NFQWS_ENABLE_OVERRIDE
|
||||||
|
standard_mode_daemons "$1"
|
||||||
|
}
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
check_std_intersect || return
|
||||||
|
|
||||||
|
local FW_EXTRA_PRE FW_EXTRA_POST TPWS_ENABLE=$TPWS_ENABLE_OVERRIDE NFQWS_ENABLE=$NFQWS_ENABLE_OVERRIDE
|
||||||
|
FW_EXTRA_PRE="$FW_EXTRA_PRE_TPWS_IPT" FW_EXTRA_POST="$FW_EXTRA_POST_TPWS_IPT"
|
||||||
|
zapret_do_firewall_standard_tpws_rules_ipt $1
|
||||||
|
FW_EXTRA_PRE="$FW_EXTRA_PRE_NFQWS_IPT" FW_EXTRA_POST="$FW_EXTRA_POST_NFQWS_IPT"
|
||||||
|
zapret_do_firewall_standard_nfqws_rules_ipt $1
|
||||||
|
}
|
||||||
|
zapret_custom_firewall_nft()
|
||||||
|
{
|
||||||
|
# stop logic is not required
|
||||||
|
|
||||||
|
check_std_intersect || return
|
||||||
|
|
||||||
|
local FW_EXTRA_PRE FW_EXTRA_POST TPWS_ENABLE=$TPWS_ENABLE_OVERRIDE NFQWS_ENABLE=$NFQWS_ENABLE_OVERRIDE
|
||||||
|
FW_EXTRA_PRE="$FW_EXTRA_PRE_TPWS_NFT" FW_EXTRA_POST="$FW_EXTRA_POST_TPWS_NFT"
|
||||||
|
zapret_apply_firewall_standard_tpws_rules_nft
|
||||||
|
FW_EXTRA_PRE="$FW_EXTRA_PRE_NFQWS_NFT" FW_EXTRA_POST="$FW_EXTRA_POST_NFQWS_NFT"
|
||||||
|
zapret_apply_firewall_standard_nfqws_rules_nft
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
# this custom script runs desync to DHT packets with udp payload length >=5 , without ipset/hostlist filtering
|
||||||
|
# NOTE: @ih requires nft 1.0.1+ and updated kernel version. it's confirmed to work on 5.15 (openwrt 23) and not work on 5.10 (openwrt 22)
|
||||||
|
|
||||||
|
# can override in config :
|
||||||
|
NFQWS_OPT_DESYNC_DHT="${NFQWS_OPT_DESYNC_DHT:---dpi-desync=tamper}"
|
||||||
|
|
||||||
|
alloc_dnum DNUM_DHT4ALL
|
||||||
|
alloc_qnum QNUM_DHT4ALL
|
||||||
|
|
||||||
|
zapret_custom_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
|
local opt="--qnum=$QNUM_DHT4ALL $NFQWS_OPT_DESYNC_DHT"
|
||||||
|
do_nfqws $1 $DNUM_DHT4ALL "$opt"
|
||||||
|
}
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local f uf4 uf6
|
||||||
|
local first_packet_only="$ipt_connbytes 1:1"
|
||||||
|
|
||||||
|
f='-p udp -m u32 --u32'
|
||||||
|
uf4='0>>22&0x3C@4>>16=13:0xFFFF&&0>>22&0x3C@8>>16=0x6431:0x6432'
|
||||||
|
uf6='44>>16=13:0xFFFF&&48>>16=0x6431:0x6432'
|
||||||
|
fw_nfqws_post $1 "$f $uf4 $first_packet_only" "$f $uf6 $first_packet_only" $QNUM_DHT4ALL
|
||||||
|
}
|
||||||
|
zapret_custom_firewall_nft()
|
||||||
|
{
|
||||||
|
# stop logic is not required
|
||||||
|
|
||||||
|
local f
|
||||||
|
local first_packet_only="$nft_connbytes 1"
|
||||||
|
|
||||||
|
f="udp length ge 13 meta l4proto udp @ih,0,16 0x6431-0x6432"
|
||||||
|
nft_fw_nfqws_post "$f $first_packet_only" "$f $first_packet_only" $QNUM_DHT4ALL
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# this custom script runs desync to all discord media packets
|
||||||
|
# NOTE: @ih requires nft 1.0.1+ and updated kernel version. it's confirmed to work on 5.15 (openwrt 23) and not work on 5.10 (openwrt 22)
|
||||||
|
|
||||||
|
# can override in config :
|
||||||
|
NFQWS_OPT_DESYNC_DISCORD_MEDIA="${NFQWS_OPT_DESYNC_DISCORD_MEDIA:---dpi-desync=fake --dpi-desync-repeats=2}"
|
||||||
|
DISCORD_MEDIA_PORT_RANGE="${DISCORD_MEDIA_PORT_RANGE:-50000-50099}"
|
||||||
|
|
||||||
|
alloc_dnum DNUM_DISCORD_MEDIA
|
||||||
|
alloc_qnum QNUM_DISCORD_MEDIA
|
||||||
|
|
||||||
|
zapret_custom_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
|
local opt="--qnum=$QNUM_DISCORD_MEDIA $NFQWS_OPT_DESYNC_DISCORD_MEDIA"
|
||||||
|
do_nfqws $1 $DNUM_DISCORD_MEDIA "$opt"
|
||||||
|
}
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local DISABLE_IPV6=1
|
||||||
|
local port_range=$(replace_char - : $DISCORD_MEDIA_PORT_RANGE)
|
||||||
|
local f="-p udp --dport $port_range -m u32 --u32"
|
||||||
|
# this is simplified test to skip writing monstrous rule. instead of checking 64 bytes for zeroes only check 2 dwords for zero
|
||||||
|
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=0x52&&0>>22&0x3C@8=0x00010046&&0>>22&0x3C@16=0&&0>>22&0x3C@76=0" '' $QNUM_DISCORD_MEDIA
|
||||||
|
}
|
||||||
|
zapret_custom_firewall_nft()
|
||||||
|
{
|
||||||
|
# stop logic is not required
|
||||||
|
|
||||||
|
local DISABLE_IPV6=1
|
||||||
|
local f="udp dport $DISCORD_MEDIA_PORT_RANGE udp length == 82 @ih,0,32 0x00010046 @ih,64,128 0x00000000000000000000000000000000 @ih,192,128 0x00000000000000000000000000000000 @ih,320,128 0x00000000000000000000000000000000 @ih,448,128 0x00000000000000000000000000000000"
|
||||||
|
nft_fw_nfqws_post "$f" '' $QNUM_DISCORD_MEDIA
|
||||||
|
}
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
# this custom script demonstrates how to launch extra nfqws instance limited by ipset
|
||||||
|
|
||||||
|
# can override in config :
|
||||||
|
NFQWS_MY1_OPT="${NFQWS_MY1_OPT:---filter-udp=* --dpi-desync=fake --dpi-desync-repeats=6 --dpi-desync-any-protocol --new --filter-tcp=* --dpi-desync=multisplit}"
|
||||||
|
NFQWS_MY1_SUBNETS4="${NFQWS_MY1_SUBNETS4:-173.194.0.0/16 108.177.0.0/17 74.125.0.0/16 64.233.160.0/19 172.217.0.0/16}"
|
||||||
|
NFQWS_MY1_SUBNETS6="${NFQWS_MY1_SUBNETS6:-2a00:1450::/29}"
|
||||||
|
NFQWS_MY1_PORTS_TCP=${NFQWS_MY1_PORTS_TCP:-$NFQWS_PORTS_TCP}
|
||||||
|
NFQWS_MY1_PORTS_UDP=${NFQWS_MY1_PORTS_UDP:-$NFQWS_PORTS_UDP}
|
||||||
|
NFQWS_MY1_TCP_PKT_OUT=${NFQWS_MY1_TCP_PKT_OUT:-$NFQWS_TCP_PKT_OUT}
|
||||||
|
NFQWS_MY1_UDP_PKT_OUT=${NFQWS_MY1_UDP_PKT_OUT:-$NFQWS_UDP_PKT_OUT}
|
||||||
|
NFQWS_MY1_TCP_PKT_IN=${NFQWS_MY1_TCP_PKT_IN:-$NFQWS_TCP_PKT_IN}
|
||||||
|
NFQWS_MY1_UDP_PKT_IN=${NFQWS_MY1_UDP_PKT_IN:-$NFQWS_UDP_PKT_IN}
|
||||||
|
|
||||||
|
NFQWS_MY1_IPSET_SIZE=${NFQWS_MY1_IPSET_SIZE:-4096}
|
||||||
|
NFQWS_MY1_IPSET_OPT="${NFQWS_MY1_IPSET_OPT:-hash:net hashsize 8192 maxelem $NFQWS_MY1_IPSET_SIZE}"
|
||||||
|
|
||||||
|
alloc_dnum DNUM_NFQWS_MY1
|
||||||
|
alloc_qnum QNUM_NFQWS_MY1
|
||||||
|
NFQWS_MY1_NAME4=my1nfqws4
|
||||||
|
NFQWS_MY1_NAME6=my1nfqws6
|
||||||
|
|
||||||
|
zapret_custom_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local opt="--qnum=$QNUM_NFQWS_MY1 $NFQWS_MY1_OPT"
|
||||||
|
do_nfqws $1 $DNUM_NFQWS_MY1 "$opt"
|
||||||
|
}
|
||||||
|
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local f4 f6 subnet
|
||||||
|
local NFQWS_MY1_PORTS_TCP=$(replace_char - : $NFQWS_MY1_PORTS_TCP)
|
||||||
|
local NFQWS_MY1_PORTS_UDP=$(replace_char - : $NFQWS_MY1_PORTS_UDP)
|
||||||
|
|
||||||
|
[ "$1" = 1 -a "$DISABLE_IPV4" != 1 ] && {
|
||||||
|
ipset create $NFQWS_MY1_NAME4 $NFQWS_MY1_IPSET_OPT family inet 2>/dev/null
|
||||||
|
ipset flush $NFQWS_MY1_NAME4
|
||||||
|
for subnet in $NFQWS_MY1_SUBNETS4; do
|
||||||
|
echo add $NFQWS_MY1_NAME4 $subnet
|
||||||
|
done | ipset -! restore
|
||||||
|
}
|
||||||
|
[ "$1" = 1 -a "$DISABLE_IPV6" != 1 ] && {
|
||||||
|
ipset create $NFQWS_MY1_NAME6 $NFQWS_MY1_IPSET_OPT family inet6 2>/dev/null
|
||||||
|
ipset flush $NFQWS_MY1_NAME6
|
||||||
|
for subnet in $NFQWS_MY1_SUBNETS6; do
|
||||||
|
echo add $NFQWS_MY1_NAME6 $subnet
|
||||||
|
done | ipset -! restore
|
||||||
|
}
|
||||||
|
|
||||||
|
[ -n "$NFQWS_MY1_PORTS_TCP" ] && {
|
||||||
|
[ -n "$NFQWS_MY1_TCP_PKT_OUT" -a "$NFQWS_MY1_TCP_PKT_OUT" != 0 ] && {
|
||||||
|
f4="-p tcp -m multiport --dports $NFQWS_MY1_PORTS_TCP $ipt_connbytes 1:$NFQWS_MY1_TCP_PKT_OUT -m set --match-set"
|
||||||
|
f6="$f4 $NFQWS_MY1_NAME6 dst"
|
||||||
|
f4="$f4 $NFQWS_MY1_NAME4 dst"
|
||||||
|
fw_nfqws_post $1 "$f4" "$f6" $QNUM_NFQWS_MY1
|
||||||
|
}
|
||||||
|
[ -n "$NFQWS_MY1_TCP_PKT_IN" -a "$NFQWS_MY1_TCP_PKT_IN" != 0 ] && {
|
||||||
|
f4="-p tcp -m multiport --sports $NFQWS_MY1_PORTS_TCP $ipt_connbytes 1:$NFQWS_MY1_TCP_PKT_IN -m set --match-set"
|
||||||
|
f6="$f4 $NFQWS_MY1_NAME6 src"
|
||||||
|
f4="$f4 $NFQWS_MY1_NAME4 src"
|
||||||
|
fw_nfqws_pre $1 "$f4" "$f6" $QNUM_NFQWS_MY1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[ -n "$NFQWS_MY1_PORTS_UDP" ] && {
|
||||||
|
[ -n "$NFQWS_MY1_UDP_PKT_OUT" -a "$NFQWS_MY1_UDP_PKT_OUT" != 0 ] && {
|
||||||
|
f4="-p udp -m multiport --dports $NFQWS_MY1_PORTS_UDP $ipt_connbytes 1:$NFQWS_MY1_UDP_PKT_OUT -m set --match-set"
|
||||||
|
f6="$f4 $NFQWS_MY1_NAME6 dst"
|
||||||
|
f4="$f4 $NFQWS_MY1_NAME4 dst"
|
||||||
|
fw_nfqws_post $1 "$f4" "$f6" $QNUM_NFQWS_MY1
|
||||||
|
}
|
||||||
|
[ -n "$NFQWS_MY1_UDP_PKT_IN" -a "$NFQWS_MY1_UDP_PKT_IN" != 0 ] && {
|
||||||
|
f4="-p udp -m multiport --sports $NFQWS_MY1_PORTS_UDP $ipt_connbytes 1:$NFQWS_MY1_UDP_PKT_IN -m set --match-set"
|
||||||
|
f6="$f4 $NFQWS_MY1_NAME6 src"
|
||||||
|
f4="$f4 $NFQWS_MY1_NAME4 src"
|
||||||
|
fw_nfqws_pre $1 "$f4" "$f6" $QNUM_NFQWS_MY1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[ "$1" = 1 ] || {
|
||||||
|
ipset destroy $NFQWS_MY1_NAME4 2>/dev/null
|
||||||
|
ipset destroy $NFQWS_MY1_NAME6 2>/dev/null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zapret_custom_firewall_nft()
|
||||||
|
{
|
||||||
|
local f4 f6 subnets
|
||||||
|
local first_packets_only="$nft_connbytes 1-$NFQWS_MY1_PKT_OUT"
|
||||||
|
|
||||||
|
[ "$DISABLE_IPV4" != 1 ] && {
|
||||||
|
make_comma_list subnets $NFQWS_MY1_SUBNETS4
|
||||||
|
nft_create_set $NFQWS_MY1_NAME4 "type ipv4_addr; size $NFQWS_MY1_IPSET_SIZE; auto-merge; flags interval;"
|
||||||
|
nft_flush_set $NFQWS_MY1_NAME4
|
||||||
|
nft_add_set_element $NFQWS_MY1_NAME4 "$subnets"
|
||||||
|
}
|
||||||
|
[ "$DISABLE_IPV6" != 1 ] && {
|
||||||
|
make_comma_list subnets $NFQWS_MY1_SUBNETS6
|
||||||
|
nft_create_set $NFQWS_MY1_NAME6 "type ipv6_addr; size $NFQWS_MY1_IPSET_SIZE; auto-merge; flags interval;"
|
||||||
|
nft_flush_set $NFQWS_MY1_NAME6
|
||||||
|
nft_add_set_element $NFQWS_MY1_NAME6 "$subnets"
|
||||||
|
}
|
||||||
|
|
||||||
|
[ -n "$NFQWS_MY1_PORTS_TCP" ] && {
|
||||||
|
[ -n "$NFQWS_MY1_TCP_PKT_OUT" -a "$NFQWS_MY1_TCP_PKT_OUT" != 0 ] && {
|
||||||
|
f4="tcp dport {$NFQWS_MY1_PORTS_TCP} $(nft_first_packets $NFQWS_MY1_TCP_PKT_OUT)"
|
||||||
|
f6="$f4 ip6 daddr @$NFQWS_MY1_NAME6"
|
||||||
|
f4="$f4 ip daddr @$NFQWS_MY1_NAME4"
|
||||||
|
nft_fw_nfqws_post $1 "$f4" "$f6" $QNUM_NFQWS_MY1
|
||||||
|
}
|
||||||
|
[ -n "$NFQWS_MY1_TCP_PKT_IN" -a "$NFQWS_MY1_TCP_PKT_IN" != 0 ] && {
|
||||||
|
f4="tcp sport {$NFQWS_MY1_PORTS_TCP} $(nft_first_packets $NFQWS_MY1_TCP_PKT_IN)"
|
||||||
|
f6="$f4 ip6 saddr @$NFQWS_MY1_NAME6"
|
||||||
|
f4="$f4 ip saddr @$NFQWS_MY1_NAME4"
|
||||||
|
nft_fw_nfqws_pre $1 "$f4" "$f6" $QNUM_NFQWS_MY1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[ -n "$NFQWS_MY1_PORTS_UDP" ] && {
|
||||||
|
[ -n "$NFQWS_MY1_UDP_PKT_OUT" -a "$NFQWS_MY1_UDP_PKT_OUT" != 0 ] && {
|
||||||
|
f4="udp dport {$NFQWS_MY1_PORTS_UDP} $(nft_first_packets $NFQWS_MY1_UDP_PKT_OUT)"
|
||||||
|
f6="$f4 ip6 daddr @$NFQWS_MY1_NAME6"
|
||||||
|
f4="$f4 ip daddr @$NFQWS_MY1_NAME4"
|
||||||
|
nft_fw_nfqws_post $1 "$f4" "$f6" $QNUM_NFQWS_MY1
|
||||||
|
}
|
||||||
|
[ -n "$NFQWS_MY1_UDP_PKT_IN" -a "$NFQWS_MY1_UDP_PKT_IN" != 0 ] && {
|
||||||
|
f4="udp sport {$NFQWS_MY1_PORTS_UDP} $(nft_first_packets $NFQWS_MY1_UDP_PKT_IN)"
|
||||||
|
f6="$f4 ip6 saddr @$NFQWS_MY1_NAME6"
|
||||||
|
f4="$f4 ip saddr @$NFQWS_MY1_NAME4"
|
||||||
|
nft_fw_nfqws_pre $1 "$f4" "$f6" $QNUM_NFQWS_MY1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
zapret_custom_firewall_nft_flush()
|
||||||
|
{
|
||||||
|
# this function is called after all nft fw rules are deleted
|
||||||
|
# however sets are not deleted. it's desired to clear sets here.
|
||||||
|
|
||||||
|
nft_del_set $NFQWS_MY1_NAME4 2>/dev/null
|
||||||
|
nft_del_set $NFQWS_MY1_NAME6 2>/dev/null
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# this custom script runs desync to all IETF QUIC initials
|
||||||
|
# NOTE: @ih requires nft 1.0.1+ and updated kernel version. it's confirmed to work on 5.15 (openwrt 23) and not work on 5.10 (openwrt 22)
|
||||||
|
|
||||||
|
# can override in config :
|
||||||
|
NFQWS_OPT_DESYNC_QUIC="${NFQWS_OPT_DESYNC_QUIC:---dpi-desync=fake --dpi-desync-repeats=2}"
|
||||||
|
|
||||||
|
alloc_dnum DNUM_QUIC4ALL
|
||||||
|
alloc_qnum QNUM_QUIC4ALL
|
||||||
|
|
||||||
|
zapret_custom_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
|
local opt="--qnum=$QNUM_QUIC4ALL $NFQWS_OPT_DESYNC_QUIC"
|
||||||
|
do_nfqws $1 $DNUM_QUIC4ALL "$opt"
|
||||||
|
}
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local f='-p udp -m u32 --u32'
|
||||||
|
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=264:65535&&0>>22&0x3C@8>>28=0xC&&0>>22&0x3C@9=0x00000001" "$f 44>>16=264:65535&&48>>28=0xC&&49=0x00000001" $QNUM_QUIC4ALL
|
||||||
|
}
|
||||||
|
zapret_custom_firewall_nft()
|
||||||
|
{
|
||||||
|
# stop logic is not required
|
||||||
|
|
||||||
|
local f="udp length >= 264 @ih,0,4 0xC @ih,8,32 0x00000001"
|
||||||
|
nft_fw_nfqws_post "$f" "$f" $QNUM_QUIC4ALL
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# this custom script runs desync to all stun packets
|
||||||
|
# NOTE: @ih requires nft 1.0.1+ and updated kernel version. it's confirmed to work on 5.15 (openwrt 23) and not work on 5.10 (openwrt 22)
|
||||||
|
|
||||||
|
# can override in config :
|
||||||
|
NFQWS_OPT_DESYNC_STUN="${NFQWS_OPT_DESYNC_STUN:---dpi-desync=fake --dpi-desync-repeats=2}"
|
||||||
|
|
||||||
|
alloc_dnum DNUM_STUN4ALL
|
||||||
|
alloc_qnum QNUM_STUN4ALL
|
||||||
|
|
||||||
|
zapret_custom_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
|
local opt="--qnum=$QNUM_STUN4ALL $NFQWS_OPT_DESYNC_STUN"
|
||||||
|
do_nfqws $1 $DNUM_STUN4ALL "$opt"
|
||||||
|
}
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local f='-p udp -m u32 --u32'
|
||||||
|
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=28:65535&&0>>22&0x3C@12=0x2112A442&&0>>22&0x3C@8&0xC0000003=0" "$f 44>>16=28:65535&&52=0x2112A442&&48&0xC0000003=0" $QNUM_STUN4ALL
|
||||||
|
}
|
||||||
|
zapret_custom_firewall_nft()
|
||||||
|
{
|
||||||
|
# stop logic is not required
|
||||||
|
|
||||||
|
local f="udp length >= 28 @ih,32,32 0x2112A442 @ih,0,2 0 @ih,30,2 0"
|
||||||
|
nft_fw_nfqws_post "$f" "$f" $QNUM_STUN4ALL
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
# this custom script demonstrates how to launch extra tpws instance limited by ipset
|
||||||
|
|
||||||
|
# can override in config :
|
||||||
|
TPWS_MY1_OPT="${TPWS_MY1_OPT:---oob --split-pos=midsld}"
|
||||||
|
TPWS_MY1_PORTS=${TPWS_MY1_PORTS:-$TPWS_PORTS}
|
||||||
|
TPWS_MY1_SUBNETS4="${TPWS_MY1_SUBNETS4:-142.250.0.0/15 64.233.160.0/19 172.217.0.0/16 173.194.0.0/16 108.177.0.0/17 74.125.0.0/16 209.85.128.0/17 216.58.192.0/19}"
|
||||||
|
TPWS_MY1_SUBNETS6="${TPWS_MY1_SUBNETS6:-2607:F8B0::/32 2a00:1450:4000::/37}"
|
||||||
|
|
||||||
|
TPWS_MY1_IPSET_SIZE=${TPWS_MY1_IPSET_SIZE:-4096}
|
||||||
|
TPWS_MY1_IPSET_OPT="${TPWS_MY1_IPSET_OPT:-hash:net hashsize 8192 maxelem $TPWS_MY1_IPSET_SIZE}"
|
||||||
|
|
||||||
|
alloc_dnum DNUM_TPWS_MY1
|
||||||
|
alloc_tpws_port PORT_TPWS_MY1
|
||||||
|
TPWS_MY1_NAME4=my1tpws4
|
||||||
|
TPWS_MY1_NAME6=my1tpws6
|
||||||
|
|
||||||
|
zapret_custom_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local opt="--port=$PORT_TPWS_MY1 $TPWS_MY1_OPT"
|
||||||
|
do_tpws $1 $DNUM_TPWS_MY1 "$opt"
|
||||||
|
}
|
||||||
|
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local f4 f6 subnet
|
||||||
|
local PORTS_IPT=$(replace_char - : $TPWS_MY1_PORTS)
|
||||||
|
|
||||||
|
[ "$1" = 1 -a "$DISABLE_IPV4" != 1 ] && {
|
||||||
|
ipset create $TPWS_MY1_NAME4 $TPWS_MY1_IPSET_OPT family inet 2>/dev/null
|
||||||
|
ipset flush $TPWS_MY1_NAME4
|
||||||
|
for subnet in $TPWS_MY1_SUBNETS4; do
|
||||||
|
echo add $TPWS_MY1_NAME4 $subnet
|
||||||
|
done | ipset -! restore
|
||||||
|
}
|
||||||
|
[ "$1" = 1 -a "$DISABLE_IPV6" != 1 ] && {
|
||||||
|
ipset create $TPWS_MY1_NAME6 $TPWS_MY1_IPSET_OPT family inet6 2>/dev/null
|
||||||
|
ipset flush $TPWS_MY1_NAME6
|
||||||
|
for subnet in $TPWS_MY1_SUBNETS6; do
|
||||||
|
echo add $TPWS_MY1_NAME6 $subnet
|
||||||
|
done | ipset -! restore
|
||||||
|
}
|
||||||
|
|
||||||
|
f4="-p tcp -m multiport --dports $PORTS_IPT -m set --match-set"
|
||||||
|
f6="$f4 $TPWS_MY1_NAME6 dst"
|
||||||
|
f4="$f4 $TPWS_MY1_NAME4 dst"
|
||||||
|
fw_tpws $1 "$f4" "$f6" $PORT_TPWS_MY1
|
||||||
|
|
||||||
|
[ "$1" = 1 ] || {
|
||||||
|
ipset destroy $TPWS_MY1_NAME4 2>/dev/null
|
||||||
|
ipset destroy $TPWS_MY1_NAME6 2>/dev/null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zapret_custom_firewall_nft()
|
||||||
|
{
|
||||||
|
local f4 f6 subnets
|
||||||
|
|
||||||
|
[ "$DISABLE_IPV4" != 1 ] && {
|
||||||
|
make_comma_list subnets $TPWS_MY1_SUBNETS4
|
||||||
|
nft_create_set $TPWS_MY1_NAME4 "type ipv4_addr; size $TPWS_MY1_IPSET_SIZE; auto-merge; flags interval;"
|
||||||
|
nft_flush_set $TPWS_MY1_NAME4
|
||||||
|
nft_add_set_element $TPWS_MY1_NAME4 "$subnets"
|
||||||
|
}
|
||||||
|
[ "$DISABLE_IPV6" != 1 ] && {
|
||||||
|
make_comma_list subnets $TPWS_MY1_SUBNETS6
|
||||||
|
nft_create_set $TPWS_MY1_NAME6 "type ipv6_addr; size $TPWS_MY1_IPSET_SIZE; auto-merge; flags interval;"
|
||||||
|
nft_flush_set $TPWS_MY1_NAME6
|
||||||
|
nft_add_set_element $TPWS_MY1_NAME6 "$subnets"
|
||||||
|
}
|
||||||
|
|
||||||
|
f4="tcp dport {$TPWS_MY1_PORTS}"
|
||||||
|
f6="$f4 ip6 daddr @$TPWS_MY1_NAME6"
|
||||||
|
f4="$f4 ip daddr @$TPWS_MY1_NAME4"
|
||||||
|
nft_fw_tpws "$f4" "$f6" $PORT_TPWS_MY1
|
||||||
|
}
|
||||||
|
|
||||||
|
zapret_custom_firewall_nft_flush()
|
||||||
|
{
|
||||||
|
# this function is called after all nft fw rules are deleted
|
||||||
|
# however sets are not deleted. it's desired to clear sets here.
|
||||||
|
|
||||||
|
nft_del_set $TPWS_MY1_NAME4 2>/dev/null
|
||||||
|
nft_del_set $TPWS_MY1_NAME6 2>/dev/null
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# this custom script runs desync to all wireguard handshake initiation packets
|
||||||
|
# NOTE: this works for original wireguard and may not work for 3rd party implementations such as xray
|
||||||
|
# NOTE: @ih requires nft 1.0.1+ and updated kernel version. it's confirmed to work on 5.15 (openwrt 23) and not work on 5.10 (openwrt 22)
|
||||||
|
|
||||||
|
# can override in config :
|
||||||
|
NFQWS_OPT_DESYNC_WG="${NFQWS_OPT_DESYNC_WG:---dpi-desync=fake --dpi-desync-repeats=2}"
|
||||||
|
|
||||||
|
alloc_dnum DNUM_WG4ALL
|
||||||
|
alloc_qnum QNUM_WG4ALL
|
||||||
|
|
||||||
|
zapret_custom_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
|
local opt="--qnum=$QNUM_WG4ALL $NFQWS_OPT_DESYNC_WG"
|
||||||
|
do_nfqws $1 $DNUM_WG4ALL "$opt"
|
||||||
|
}
|
||||||
|
# size = 156 (8 udp header + 148 payload) && payload starts with 0x01000000
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local f='-p udp -m u32 --u32'
|
||||||
|
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=0x9c&&0>>22&0x3C@8=0x01000000" "$f 44>>16=0x9c&&48=0x01000000" $QNUM_WG4ALL
|
||||||
|
}
|
||||||
|
zapret_custom_firewall_nft()
|
||||||
|
{
|
||||||
|
# stop logic is not required
|
||||||
|
|
||||||
|
local f="udp length 156 @ih,0,32 0x01000000"
|
||||||
|
nft_fw_nfqws_post "$f" "$f" $QNUM_WG4ALL
|
||||||
|
}
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
# this custom script runs desync to DHT packets with udp payload length 101..399 , without ipset/hostlist filtering
|
|
||||||
|
|
||||||
# can override in config :
|
|
||||||
NFQWS_OPT_DESYNC_DHT="${NFQWS_OPT_DESYNC_DHT:---dpi-desync=tamper}"
|
|
||||||
|
|
||||||
alloc_dnum DNUM_DHT4ALL
|
|
||||||
alloc_qnum QNUM_DHT4ALL
|
|
||||||
|
|
||||||
zapret_custom_daemons()
|
|
||||||
{
|
|
||||||
# stop logic is managed by procd
|
|
||||||
|
|
||||||
local opt="--qnum=$QNUM_DHT4ALL $NFQWS_OPT_BASE $NFQWS_OPT_DESYNC_DHT"
|
|
||||||
run_daemon $DNUM_DHT4ALL $NFQWS "$opt"
|
|
||||||
}
|
|
||||||
zapret_custom_firewall()
|
|
||||||
{
|
|
||||||
# $1 - 1 - run, 0 - stop
|
|
||||||
|
|
||||||
local f uf4 uf6
|
|
||||||
local first_packet_only="$ipt_connbytes 1:1"
|
|
||||||
|
|
||||||
f='-p udp -m length --length 109:407 -m u32 --u32'
|
|
||||||
uf4='0>>22&0x3C@8>>16=0x6431'
|
|
||||||
uf6='48>>16=0x6431'
|
|
||||||
fw_nfqws_post $1 "$f $uf4 $first_packet_only" "$f $uf6 $first_packet_only" $QNUM_DHT4ALL
|
|
||||||
|
|
||||||
}
|
|
||||||
zapret_custom_firewall_nft()
|
|
||||||
{
|
|
||||||
# stop logic is not required
|
|
||||||
|
|
||||||
local f
|
|
||||||
local first_packet_only="$nft_connbytes 1"
|
|
||||||
|
|
||||||
f="meta length 109-407 meta l4proto udp @th,64,16 0x6431"
|
|
||||||
nft_fw_nfqws_post "$f $first_packet_only" "$f $first_packet_only" $QNUM_DHT4ALL
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -10,6 +10,7 @@ ZAPRET_CONFIG=${ZAPRET_CONFIG:-"$ZAPRET_RW/config"}
|
|||||||
. "$ZAPRET_BASE/common/ipt.sh"
|
. "$ZAPRET_BASE/common/ipt.sh"
|
||||||
. "$ZAPRET_BASE/common/nft.sh"
|
. "$ZAPRET_BASE/common/nft.sh"
|
||||||
. "$ZAPRET_BASE/common/linux_fw.sh"
|
. "$ZAPRET_BASE/common/linux_fw.sh"
|
||||||
|
. "$ZAPRET_BASE/common/linux_daemons.sh"
|
||||||
. "$ZAPRET_BASE/common/list.sh"
|
. "$ZAPRET_BASE/common/list.sh"
|
||||||
. "$ZAPRET_BASE/common/custom.sh"
|
. "$ZAPRET_BASE/common/custom.sh"
|
||||||
CUSTOM_DIR="$ZAPRET_RW/init.d/openwrt"
|
CUSTOM_DIR="$ZAPRET_RW/init.d/openwrt"
|
||||||
@@ -24,15 +25,8 @@ CUSTOM_DIR="$ZAPRET_RW/init.d/openwrt"
|
|||||||
|
|
||||||
TPWS_LOCALHOST4=127.0.0.127
|
TPWS_LOCALHOST4=127.0.0.127
|
||||||
|
|
||||||
# max wait time for the link local ipv6 on the LAN interface
|
|
||||||
LINKLOCAL_WAIT_SEC=5
|
|
||||||
|
|
||||||
IPSET_CR="$ZAPRET_BASE/ipset/create_ipset.sh"
|
IPSET_CR="$ZAPRET_BASE/ipset/create_ipset.sh"
|
||||||
|
|
||||||
IPSET_EXCLUDE="-m set ! --match-set nozapret"
|
|
||||||
IPSET_EXCLUDE6="-m set ! --match-set nozapret6"
|
|
||||||
|
|
||||||
|
|
||||||
# can be multiple ipv6 outgoing interfaces
|
# can be multiple ipv6 outgoing interfaces
|
||||||
# uplink from isp, tunnelbroker, vpn, ...
|
# uplink from isp, tunnelbroker, vpn, ...
|
||||||
# want them all. who knows what's the real one that blocks sites
|
# want them all. who knows what's the real one that blocks sites
|
||||||
|
|||||||
+18
-29
@@ -81,6 +81,10 @@ run_tpws()
|
|||||||
}
|
}
|
||||||
run_daemon $1 "$TPWS" "$OPT $2"
|
run_daemon $1 "$TPWS" "$OPT $2"
|
||||||
}
|
}
|
||||||
|
do_tpws()
|
||||||
|
{
|
||||||
|
[ "$1" = 0 ] || { shift; run_tpws "$@"; }
|
||||||
|
}
|
||||||
run_tpws_socks()
|
run_tpws_socks()
|
||||||
{
|
{
|
||||||
[ "$DISABLE_IPV4" = "1" ] && [ "$DISABLE_IPV6" = "1" ] && return 0
|
[ "$DISABLE_IPV4" = "1" ] && [ "$DISABLE_IPV6" = "1" ] && return 0
|
||||||
@@ -90,13 +94,10 @@ run_tpws_socks()
|
|||||||
tpws_apply_socks_binds opt
|
tpws_apply_socks_binds opt
|
||||||
run_daemon $1 "$TPWS" "$opt $2"
|
run_daemon $1 "$TPWS" "$opt $2"
|
||||||
}
|
}
|
||||||
|
do_tpws_socks()
|
||||||
stop_tpws()
|
|
||||||
{
|
{
|
||||||
stop_daemon $1 "$TPWS"
|
[ "$1" = 0 ] || { shift; run_tpws_socks "$@"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
tpws_apply_socks_binds()
|
tpws_apply_socks_binds()
|
||||||
{
|
{
|
||||||
local o
|
local o
|
||||||
@@ -105,39 +106,27 @@ tpws_apply_socks_binds()
|
|||||||
[ "$DISABLE_IPV6" = "1" ] || o="$o --bind-addr=::1"
|
[ "$DISABLE_IPV6" = "1" ] || o="$o --bind-addr=::1"
|
||||||
|
|
||||||
for lan in $OPENWRT_LAN; do
|
for lan in $OPENWRT_LAN; do
|
||||||
network_get_device DEVICE $lan
|
network_get_device DEVICE $lan
|
||||||
[ -n "$DEVICE" ] || continue
|
[ -n "$DEVICE" ] || continue
|
||||||
[ "$DISABLE_IPV4" = "1" ] || o="$o --bind-iface4=$DEVICE $TPWS_WAIT"
|
[ "$DISABLE_IPV4" = "1" ] || o="$o --bind-iface4=$DEVICE $TPWS_WAIT"
|
||||||
[ "$DISABLE_IPV6" = "1" ] || o="$o --bind-iface6=$DEVICE --bind-linklocal=unwanted $TPWS_WAIT_SOCKS6"
|
[ "$DISABLE_IPV6" = "1" ] || o="$o --bind-iface6=$DEVICE --bind-linklocal=unwanted $TPWS_WAIT_SOCKS6"
|
||||||
done
|
done
|
||||||
eval $1="\"\$$1 $o\""
|
eval $1="\"\$$1 $o\""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
run_nfqws()
|
||||||
standard_mode_daemons()
|
|
||||||
{
|
{
|
||||||
local opt
|
run_daemon $1 "$NFQWS" "$NFQWS_OPT_BASE $2"
|
||||||
[ "$TPWS_ENABLE" = 1 ] && check_bad_ws_options 1 "$TPWS_OPT" && {
|
}
|
||||||
opt="--port=$TPPORT $TPWS_OPT"
|
do_nfqws()
|
||||||
filter_apply_hostlist_target opt
|
{
|
||||||
run_tpws 1 "$opt"
|
[ "$1" = 0 ] || { shift; run_nfqws "$@"; }
|
||||||
}
|
|
||||||
[ "$TPWS_SOCKS_ENABLE" = 1 ] && {
|
|
||||||
opt="--port=$TPPORT_SOCKS $TPWS_SOCKS_OPT"
|
|
||||||
filter_apply_hostlist_target opt
|
|
||||||
run_tpws_socks 2 "$opt"
|
|
||||||
}
|
|
||||||
[ "$NFQWS_ENABLE" = 1 ] && check_bad_ws_options 1 "$NFQWS_OPT" && {
|
|
||||||
opt="--qnum=$QNUM $NFQWS_OPT_BASE $NFQWS_OPT"
|
|
||||||
filter_apply_hostlist_target opt
|
|
||||||
run_daemon 3 "$NFQWS" "$opt"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start_daemons_procd()
|
start_daemons_procd()
|
||||||
{
|
{
|
||||||
standard_mode_daemons
|
standard_mode_daemons 1
|
||||||
custom_runner zapret_custom_daemons
|
custom_runner zapret_custom_daemons 1
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,4 +21,4 @@ pfctl -d ; pfctl -e
|
|||||||
ipfw delete 100
|
ipfw delete 100
|
||||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg
|
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg
|
||||||
pkill ^dvtws$
|
pkill ^dvtws$
|
||||||
dvtws --daemon --port 989 --dpi-desync=split2
|
dvtws --daemon --port 989 --dpi-desync=multisplit
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# Example systemd service unit for nfqws. Adjust for your installation.
|
||||||
|
|
||||||
|
# WARNING ! This unit requires to compile nfqws using `make systemd`
|
||||||
|
# WARNING ! This makefile target enables special systemd notify support.
|
||||||
|
|
||||||
|
# PREPARE
|
||||||
|
# install build depends
|
||||||
|
# make -C /opt/zapret systemd
|
||||||
|
# cp nfqws@service /lib/systemd/system
|
||||||
|
# systemctl daemon-reload
|
||||||
|
|
||||||
|
# MANAGE INSTANCE
|
||||||
|
# prepare /etc/zapret/nfqws1.conf with nfqws parameters
|
||||||
|
# systemctl start nfqws@nfqws1
|
||||||
|
# systemctl status nfqws@nfqws1
|
||||||
|
# systemctl restart nfqws@nfqws1
|
||||||
|
# systemctl enable nfqws@nfqws1
|
||||||
|
# systemctl disable nfqws@nfqws1
|
||||||
|
# systemctl stop nfqws@nfqws1
|
||||||
|
|
||||||
|
# DELETE
|
||||||
|
# rm /lib/systemd/system/nfqws@.service
|
||||||
|
# systemctl daemon-reload
|
||||||
|
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
ExecSearchPath=/opt/zapret/binaries/my
|
||||||
|
ExecStart=nfqws @${CONFIG_DIR}/${INSTANCE}.conf
|
||||||
|
Environment=CONFIG_DIR=/etc/zapret
|
||||||
|
Environment=INSTANCE=%i
|
||||||
|
|
||||||
|
RestrictAddressFamilies=AF_NETLINK AF_UNIX AF_INET6 AF_INET
|
||||||
|
|
||||||
|
LockPersonality=true
|
||||||
|
MemoryDenyWriteExecute=true
|
||||||
|
PrivateDevices=true
|
||||||
|
PrivateMounts=true
|
||||||
|
PrivateTmp=true
|
||||||
|
ProcSubset=pid
|
||||||
|
ProtectClock=true
|
||||||
|
ProtectControlGroups=true
|
||||||
|
ProtectHome=true
|
||||||
|
ProtectHostname=true
|
||||||
|
ProtectKernelLogs=true
|
||||||
|
ProtectKernelModules=true
|
||||||
|
ProtectKernelTunables=true
|
||||||
|
ProtectProc=invisible
|
||||||
|
ProtectSystem=full
|
||||||
|
RemoveIPC=true
|
||||||
|
RestrictNamespaces=true
|
||||||
|
RestrictRealtime=true
|
||||||
|
RestrictSUIDSGID=true
|
||||||
|
UMask=0077
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
# Example systemd service unit for tpws. Adjust for your installation.
|
||||||
|
|
||||||
|
# WARNING ! This unit requires to compile tpws using `make systemd`
|
||||||
|
# WARNING ! This makefile target enables special systemd notify support.
|
||||||
|
|
||||||
|
# PREPARE
|
||||||
|
# install build depends
|
||||||
|
# make -C /opt/zapret systemd
|
||||||
|
# cp tpws@service /lib/systemd/system
|
||||||
|
# systemctl daemon-reload
|
||||||
|
|
||||||
|
# MANAGE INSTANCE
|
||||||
|
# prepare /etc/zapret/tpws1.conf with tpws parameters
|
||||||
|
# systemctl start tpws@tpws1
|
||||||
|
# systemctl status tpws@tpws1
|
||||||
|
# systemctl restart tpws@tpws1
|
||||||
|
# systemctl enable tpws@tpws1
|
||||||
|
# systemctl disable tpws@tpws1
|
||||||
|
# systemctl stop tpws@tpws1
|
||||||
|
|
||||||
|
# DELETE
|
||||||
|
# rm /lib/systemd/system/tpws@.service
|
||||||
|
# systemctl daemon-reload
|
||||||
|
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
ExecSearchPath=/opt/zapret/binaries/my
|
||||||
|
ExecStart=tpws @${CONFIG_DIR}/${INSTANCE}.conf
|
||||||
|
Environment=CONFIG_DIR=/etc/zapret
|
||||||
|
Environment=INSTANCE=%i
|
||||||
|
|
||||||
|
RestrictAddressFamilies=AF_NETLINK AF_UNIX AF_INET6 AF_INET
|
||||||
|
|
||||||
|
LockPersonality=true
|
||||||
|
MemoryDenyWriteExecute=true
|
||||||
|
PrivateDevices=true
|
||||||
|
PrivateMounts=true
|
||||||
|
PrivateTmp=true
|
||||||
|
ProcSubset=pid
|
||||||
|
ProtectClock=true
|
||||||
|
ProtectControlGroups=true
|
||||||
|
ProtectHome=true
|
||||||
|
ProtectHostname=true
|
||||||
|
ProtectKernelLogs=true
|
||||||
|
ProtectKernelModules=true
|
||||||
|
ProtectProc=invisible
|
||||||
|
ProtectSystem=full
|
||||||
|
RemoveIPC=true
|
||||||
|
RestrictNamespaces=true
|
||||||
|
RestrictRealtime=true
|
||||||
|
RestrictSUIDSGID=true
|
||||||
|
UMask=0077
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# this custom script runs desync to DHT packets with udp payload length 101..399 , without ipset/hostlist filtering
|
|
||||||
|
|
||||||
# can override in config :
|
|
||||||
NFQWS_OPT_DESYNC_DHT="${NFQWS_OPT_DESYNC_DHT:---dpi-desync=tamper}"
|
|
||||||
|
|
||||||
alloc_dnum DNUM_DHT4ALL
|
|
||||||
alloc_qnum QNUM_DHT4ALL
|
|
||||||
|
|
||||||
zapret_custom_daemons()
|
|
||||||
{
|
|
||||||
# stop logic is managed by procd
|
|
||||||
|
|
||||||
local opt="--qnum=$QNUM_DHT4ALL $NFQWS_OPT_BASE $NFQWS_OPT_DESYNC_DHT"
|
|
||||||
do_nfqws $1 $DNUM_DHT4ALL "$opt"
|
|
||||||
}
|
|
||||||
zapret_custom_firewall()
|
|
||||||
{
|
|
||||||
# $1 - 1 - run, 0 - stop
|
|
||||||
|
|
||||||
local f uf4 uf6
|
|
||||||
local first_packet_only="$ipt_connbytes 1:1"
|
|
||||||
|
|
||||||
f='-p udp -m length --length 109:407 -m u32 --u32'
|
|
||||||
uf4='0>>22&0x3C@8>>16=0x6431'
|
|
||||||
uf6='48>>16=0x6431'
|
|
||||||
fw_nfqws_post $1 "$f $uf4 $first_packet_only" "$f $uf6 $first_packet_only" $QNUM_DHT4ALL
|
|
||||||
}
|
|
||||||
zapret_custom_firewall_nft()
|
|
||||||
{
|
|
||||||
# stop logic is not required
|
|
||||||
|
|
||||||
local f
|
|
||||||
local first_packet_only="$nft_connbytes 1"
|
|
||||||
|
|
||||||
f="meta length 109-407 meta l4proto udp @th,64,16 0x6431"
|
|
||||||
nft_fw_nfqws_post "$f $first_packet_only" "$f $first_packet_only" $QNUM_DHT4ALL
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
+23
-73
@@ -10,6 +10,7 @@ ZAPRET_CONFIG=${ZAPRET_CONFIG:-"$ZAPRET_RW/config"}
|
|||||||
. "$ZAPRET_BASE/common/ipt.sh"
|
. "$ZAPRET_BASE/common/ipt.sh"
|
||||||
. "$ZAPRET_BASE/common/nft.sh"
|
. "$ZAPRET_BASE/common/nft.sh"
|
||||||
. "$ZAPRET_BASE/common/linux_fw.sh"
|
. "$ZAPRET_BASE/common/linux_fw.sh"
|
||||||
|
. "$ZAPRET_BASE/common/linux_daemons.sh"
|
||||||
. "$ZAPRET_BASE/common/list.sh"
|
. "$ZAPRET_BASE/common/list.sh"
|
||||||
. "$ZAPRET_BASE/common/custom.sh"
|
. "$ZAPRET_BASE/common/custom.sh"
|
||||||
CUSTOM_DIR="$ZAPRET_RW/init.d/sysv"
|
CUSTOM_DIR="$ZAPRET_RW/init.d/sysv"
|
||||||
@@ -89,20 +90,13 @@ TPWS_WAIT_SOCKS6="$TPWS_WAIT --bind-wait-ip-linklocal=30"
|
|||||||
# first wait for lan to ifup, then wait for bind-wait-ip-linklocal seconds for link local address and bind-wait-ip for any ipv6 as the worst case
|
# first wait for lan to ifup, then wait for bind-wait-ip-linklocal seconds for link local address and bind-wait-ip for any ipv6 as the worst case
|
||||||
TPWS_OPT_BASE6_PRE="--bind-linklocal=prefer $TPWS_WAIT --bind-wait-ip-linklocal=3"
|
TPWS_OPT_BASE6_PRE="--bind-linklocal=prefer $TPWS_WAIT --bind-wait-ip-linklocal=3"
|
||||||
|
|
||||||
# max wait time for the link local ipv6 on the LAN interface
|
|
||||||
LINKLOCAL_WAIT_SEC=5
|
|
||||||
|
|
||||||
IPSET_EXCLUDE="-m set ! --match-set nozapret"
|
|
||||||
IPSET_EXCLUDE6="-m set ! --match-set nozapret6"
|
|
||||||
|
|
||||||
|
|
||||||
dnat6_target()
|
dnat6_target()
|
||||||
{
|
{
|
||||||
_dnat6_target "$@"
|
_dnat6_target "$@"
|
||||||
}
|
}
|
||||||
set_route_localnet()
|
set_route_localnet()
|
||||||
{
|
{
|
||||||
_set_route_localnet $1 "$IFACE_LAN"
|
_set_route_localnet $1 $IFACE_LAN
|
||||||
}
|
}
|
||||||
|
|
||||||
fw_nfqws_post4()
|
fw_nfqws_post4()
|
||||||
@@ -167,22 +161,24 @@ run_daemon()
|
|||||||
# use $PIDDIR/$DAEMONBASE$1.pid as pidfile
|
# use $PIDDIR/$DAEMONBASE$1.pid as pidfile
|
||||||
|
|
||||||
local DAEMONBASE="$(basename "$2")"
|
local DAEMONBASE="$(basename "$2")"
|
||||||
local PIDFILE=$PIDDIR/$DAEMONBASE$1.pid
|
local PID= PIDFILE=$PIDDIR/$DAEMONBASE$1.pid
|
||||||
echo "Starting daemon $1: $2 $3"
|
echo "Starting daemon $1: $2 $3"
|
||||||
if exists start-stop-daemon ; then
|
|
||||||
start-stop-daemon -S -p "$PIDFILE" -m -b -x "$2" -- $3
|
[ -f "$PIDFILE" ] && {
|
||||||
|
read PID <"$PIDFILE"
|
||||||
|
[ -d "/proc/$PID" ] || PID=
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -n "$PID" ]; then
|
||||||
|
echo already running
|
||||||
else
|
else
|
||||||
if [ -f "$PIDFILE" ] && pgrep -F "$PIDFILE" "$DAEMONBASE" >/dev/null; then
|
"$2" $3 >/dev/null &
|
||||||
echo already running
|
PID=$!
|
||||||
|
if [ -n "$PID" ]; then
|
||||||
|
echo $PID >$PIDFILE
|
||||||
else
|
else
|
||||||
"$2" $3 >/dev/null 2>/dev/null &
|
echo could not start daemon $1 : $2 $3
|
||||||
PID=$!
|
false
|
||||||
if [ -n "$PID" ]; then
|
|
||||||
echo $PID >$PIDFILE
|
|
||||||
else
|
|
||||||
echo could not start daemon $1 : $2 $3
|
|
||||||
false
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -192,18 +188,14 @@ stop_daemon()
|
|||||||
# $2 - daemon
|
# $2 - daemon
|
||||||
# use $PIDDIR/$DAEMONBASE$1.pid as pidfile
|
# use $PIDDIR/$DAEMONBASE$1.pid as pidfile
|
||||||
local DAEMONBASE="$(basename "$2")"
|
local DAEMONBASE="$(basename "$2")"
|
||||||
local PIDFILE=$PIDDIR/$DAEMONBASE$1.pid
|
local PID PIDFILE=$PIDDIR/$DAEMONBASE$1.pid
|
||||||
echo "Stopping daemon $1: $2"
|
echo "Stopping daemon $1: $2"
|
||||||
if exists start-stop-daemon ; then
|
if [ -f "$PIDFILE" ]; then
|
||||||
start-stop-daemon -K -p "$PIDFILE" -x "$2"
|
read PID <"$PIDFILE"
|
||||||
|
kill $PID
|
||||||
|
rm -f "$PIDFILE"
|
||||||
else
|
else
|
||||||
if [ -f "$PIDFILE" ]; then
|
echo no pidfile : $PIDFILE
|
||||||
read PID <"$PIDFILE"
|
|
||||||
kill $PID
|
|
||||||
rm -f "$PIDFILE"
|
|
||||||
else
|
|
||||||
echo no pidfile : $PIDFILE
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
do_daemon()
|
do_daemon()
|
||||||
@@ -277,45 +269,3 @@ create_ipset()
|
|||||||
echo "Creating ip list table (firewall type $FWTYPE)"
|
echo "Creating ip list table (firewall type $FWTYPE)"
|
||||||
"$IPSET_CR" "$@"
|
"$IPSET_CR" "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
standard_mode_daemons()
|
|
||||||
{
|
|
||||||
# $1 - 1 - run, 0 - stop
|
|
||||||
|
|
||||||
local opt
|
|
||||||
|
|
||||||
[ "$TPWS_ENABLE" = 1 ] && check_bad_ws_options $1 "$TPWS_OPT" && {
|
|
||||||
opt="--port=$TPPORT $TPWS_OPT"
|
|
||||||
filter_apply_hostlist_target opt
|
|
||||||
do_tpws $1 1 "$opt"
|
|
||||||
}
|
|
||||||
[ "$TPWS_SOCKS_ENABLE" = 1 ] && {
|
|
||||||
opt="--port=$TPPORT_SOCKS $TPWS_SOCKS_OPT"
|
|
||||||
filter_apply_hostlist_target opt
|
|
||||||
do_tpws_socks $1 2 "$opt"
|
|
||||||
}
|
|
||||||
[ "$NFQWS_ENABLE" = 1 ] && check_bad_ws_options $1 "$NFQWS_OPT" && {
|
|
||||||
opt="--qnum=$QNUM $NFQWS_OPT"
|
|
||||||
filter_apply_hostlist_target opt
|
|
||||||
do_nfqws $1 3 "$opt"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
zapret_do_daemons()
|
|
||||||
{
|
|
||||||
# $1 - 1 - run, 0 - stop
|
|
||||||
|
|
||||||
standard_mode_daemons $1
|
|
||||||
custom_runner zapret_custom_daemons $1
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
zapret_run_daemons()
|
|
||||||
{
|
|
||||||
zapret_do_daemons 1 "$@"
|
|
||||||
}
|
|
||||||
zapret_stop_daemons()
|
|
||||||
{
|
|
||||||
zapret_do_daemons 0 "$@"
|
|
||||||
}
|
|
||||||
|
|||||||
+1
-2
@@ -74,8 +74,7 @@ case "$1" in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
N=/etc/init.d/$NAME
|
echo "Usage: $SCRIPT {start|stop|restart|start-fw|stop-fw|restart-fw|start-daemons|stop-daemons|restart-daemons|reload-ifsets|list-ifsets|list-table}" >&2
|
||||||
echo "Usage: $N {start|stop|restart|start-fw|stop-fw|restart-fw|start-daemons|stop-daemons|restart-daemons|reload-ifsets|list-ifsets|list-table}" >&2
|
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
Цель этих фильтров - отсекать полезную нагрузку в режиме ядра, не насилуя процессор перенаправлением целого потока на winws.
|
||||||
|
Задействуются через `winws --wf-raw-part=@filename`. Может быть несколько частичных фильтров. Они могут сочетаться с --wf-tcp и --wf-udp.
|
||||||
|
Однако, язык фильтров windivert не содержит операций с битовыми полями, сдвигов и побитовой логики.
|
||||||
|
Поэтому фильтры получились более слабыми, способными передавать неправильную нагрузку.
|
||||||
|
Дофильтрация производится силами winws.
|
||||||
|
|
||||||
|
Описание языка фильтров : https://reqrypt.org/windivert-doc.html#filter_language
|
||||||
|
Пример инстанса для пробития медиапотоков в discord : `winws --wf-raw-part=@windivert_part.discord_media.txt --wf-raw-part=@windivert_part.stun.txt --filter-l7=stun,discord --dpi-desync=fake`
|
||||||
|
|
||||||
|
|
||||||
|
These filters are invoked using `winws --wf-raw-part=@filename`. Multiple filter parts are supported. They can be combined with --wf-tcp and --wf-udp.
|
||||||
|
Filters are kernel mode and save great amount of CPU.
|
||||||
|
However windivert cannot filter by bit fields, lacks shift and bitwise logic operations.
|
||||||
|
Filters are relaxed and can pass wrong payloads. Finer filtering is done by winws.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
outbound and ip and
|
||||||
|
udp.DstPort>=50000 and udp.DstPort<=50099 and
|
||||||
|
udp.PayloadLength=74 and
|
||||||
|
udp.Payload32[0]=0x00010046 and
|
||||||
|
udp.Payload32[2]=0 and
|
||||||
|
udp.Payload32[3]=0 and
|
||||||
|
udp.Payload32[4]=0 and
|
||||||
|
udp.Payload32[5]=0 and
|
||||||
|
udp.Payload32[6]=0 and
|
||||||
|
udp.Payload32[7]=0 and
|
||||||
|
udp.Payload32[8]=0 and
|
||||||
|
udp.Payload32[9]=0 and
|
||||||
|
udp.Payload32[10]=0 and
|
||||||
|
udp.Payload32[11]=0 and
|
||||||
|
udp.Payload32[12]=0 and
|
||||||
|
udp.Payload32[13]=0 and
|
||||||
|
udp.Payload32[14]=0 and
|
||||||
|
udp.Payload32[15]=0 and
|
||||||
|
udp.Payload32[16]=0 and
|
||||||
|
udp.Payload32[17]=0
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
outbound and
|
||||||
|
udp.PayloadLength>=256 and
|
||||||
|
udp.Payload[0]>=0xC0 and udp.Payload[0]<0xD0 and
|
||||||
|
udp.Payload[1]=0 and udp.Payload16[1]=0 and udp.Payload[4]=1
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
outbound and
|
||||||
|
udp.PayloadLength>=20 and
|
||||||
|
udp.Payload32[1]=0x2112A442 and udp.Payload[0]<0x40
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
outbound and
|
||||||
|
udp.PayloadLength=148 and
|
||||||
|
udp.Payload[0]=0x01
|
||||||
+133
-16
@@ -8,6 +8,68 @@ BINDIR="$EXEDIR/$BINS"
|
|||||||
ZAPRET_BASE=${ZAPRET_BASE:-"$EXEDIR"}
|
ZAPRET_BASE=${ZAPRET_BASE:-"$EXEDIR"}
|
||||||
. "$ZAPRET_BASE/common/base.sh"
|
. "$ZAPRET_BASE/common/base.sh"
|
||||||
|
|
||||||
|
|
||||||
|
read_elf_arch()
|
||||||
|
{
|
||||||
|
# $1 - elf file
|
||||||
|
|
||||||
|
local arch=$(dd if="$1" count=2 bs=1 skip=18 2>/dev/null | hexdump -e '2/1 "%02x"')
|
||||||
|
local bit=$(dd if="$1" count=1 bs=1 skip=4 2>/dev/null | hexdump -e '1/1 "%02x"')
|
||||||
|
echo $bit$arch
|
||||||
|
}
|
||||||
|
|
||||||
|
select_test_method()
|
||||||
|
{
|
||||||
|
local f ELF
|
||||||
|
|
||||||
|
TEST=run
|
||||||
|
|
||||||
|
# ash and dash try to execute invalid executables as a script. they interpret binary garbage with possible negative consequences
|
||||||
|
# bash and zsh do not do this
|
||||||
|
if exists bash; then
|
||||||
|
TEST=bash
|
||||||
|
elif exists zsh && [ "$UNAME" != CYGWIN ] ; then
|
||||||
|
TEST=zsh
|
||||||
|
elif [ "$UNAME" != Darwin -a "$UNAME" != CYGWIN ]; then
|
||||||
|
if exists hexdump and exists dd; then
|
||||||
|
# macos does not use ELF
|
||||||
|
TEST=elf
|
||||||
|
ELF=
|
||||||
|
ELF_ARCH=
|
||||||
|
for f in /bin/sh /system/bin/sh; do
|
||||||
|
[ -x "$f" ] && {
|
||||||
|
ELF=$f
|
||||||
|
break
|
||||||
|
}
|
||||||
|
done
|
||||||
|
[ -n "$ELF" ] && ELF_ARCH=$(read_elf_arch "$ELF")
|
||||||
|
[ -n "$ELF_ARCH" ] && return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# find does not use its own shell exec
|
||||||
|
# it uses execvp(). in musl libc it does not call shell, in glibc it DOES call /bin/sh
|
||||||
|
# that's why prefer bash or zsh if present. otherwise it's our last chance
|
||||||
|
if exists find; then
|
||||||
|
TEST=find
|
||||||
|
FIND=find
|
||||||
|
elif exists busybox; then
|
||||||
|
busybox find /jGHUa3fh1A 2>/dev/null
|
||||||
|
# 127 - command not found
|
||||||
|
[ "$?" = 127 ] || {
|
||||||
|
TEST=find
|
||||||
|
FIND="busybox find"
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_antivirus()
|
||||||
|
{
|
||||||
|
# $1 - dir
|
||||||
|
[ "$UNAME" = Darwin ] && find "$1" -maxdepth 1 -type f -perm +111 -exec xattr -d com.apple.quarantine {} \; 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
check_dir()
|
check_dir()
|
||||||
{
|
{
|
||||||
local dir="$BINDIR/$1"
|
local dir="$BINDIR/$1"
|
||||||
@@ -15,19 +77,36 @@ check_dir()
|
|||||||
local out
|
local out
|
||||||
if [ -f "$exe" ]; then
|
if [ -f "$exe" ]; then
|
||||||
if [ -x "$exe" ]; then
|
if [ -x "$exe" ]; then
|
||||||
# ash and dash try to execute invalid executables as a script. they interpret binary garbage with possible negative consequences
|
disable_antivirus "$dir"
|
||||||
# bash and zsh do not do this
|
case $TEST in
|
||||||
if exists bash; then
|
bash)
|
||||||
out=$(echo 0.0.0.0 | bash -c "\"$exe"\" 2>/dev/null)
|
out=$(echo 0.0.0.0 | bash -c "\"$exe"\" 2>/dev/null)
|
||||||
elif exists zsh; then
|
[ -n "$out" ]
|
||||||
out=$(echo 0.0.0.0 | zsh -c "\"$exe\"" 2>/dev/null)
|
;;
|
||||||
else
|
zsh)
|
||||||
# find does not use its own shell exec
|
out=$(echo 0.0.0.0 | zsh -c "\"$exe\"" 2>/dev/null)
|
||||||
# it uses execvp(). in musl libc it does not call shell, in glibc it DOES call /bin/sh
|
[ -n "$out" ]
|
||||||
# that's why prefer bash or zsh if present. otherwise it's our last chance
|
;;
|
||||||
out=$(echo 0.0.0.0 | find "$dir" -maxdepth 1 -name ip2net -exec {} \; 2>/dev/null)
|
elf)
|
||||||
fi
|
out=$(read_elf_arch "$exe")
|
||||||
[ -n "$out" ]
|
[ "$ELF_ARCH" = "$out" ] && {
|
||||||
|
# exec test to verify it actually works. no illegal instruction or crash.
|
||||||
|
out=$(echo 0.0.0.0 | "$exe" 2>/dev/null)
|
||||||
|
[ -n "$out" ]
|
||||||
|
}
|
||||||
|
;;
|
||||||
|
find)
|
||||||
|
out=$(echo 0.0.0.0 | $FIND "$dir" -maxdepth 1 -name ip2net -exec {} \; 2>/dev/null)
|
||||||
|
[ -n "$out" ]
|
||||||
|
;;
|
||||||
|
run)
|
||||||
|
out=$(echo 0.0.0.0 | "$exe" 2>/dev/null)
|
||||||
|
[ -n "$out" ]
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
false
|
||||||
|
;;
|
||||||
|
esac
|
||||||
else
|
else
|
||||||
echo >&2 "$exe is not executable. set proper chmod."
|
echo >&2 "$exe is not executable. set proper chmod."
|
||||||
return 1
|
return 1
|
||||||
@@ -48,29 +127,65 @@ ccp()
|
|||||||
#cp -f "../$BINS/$1" "$ZAPRET_BASE/$2" && echo copying : "../$BINS/$1" =\> "$ZAPRET_BASE/$2"
|
#cp -f "../$BINS/$1" "$ZAPRET_BASE/$2" && echo copying : "../$BINS/$1" =\> "$ZAPRET_BASE/$2"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
UNAME=$(uname)
|
UNAME=$(uname)
|
||||||
|
|
||||||
|
[ "$1" = getarch ] ||
|
||||||
|
if [ ! -d "$BINDIR" ] || ! dir_is_not_empty "$BINDIR" ]; then
|
||||||
|
echo "no binaries found"
|
||||||
|
case $UNAME in
|
||||||
|
Linux)
|
||||||
|
echo "you need to download release from github or build binaries from source"
|
||||||
|
echo "building from source requires debian/ubuntu packages : make gcc zlib1g-dev libcap-dev libnetfilter-queue-dev libmnl-dev libsystemd-dev"
|
||||||
|
echo "libsystemd-dev required only on systemd based systems"
|
||||||
|
echo "on distributions with other package manager find dev package analogs"
|
||||||
|
echo "to compile on systems with systemd : make systemd"
|
||||||
|
echo "to compile on other systems : make"
|
||||||
|
;;
|
||||||
|
Darwin)
|
||||||
|
echo "you need to download release from github or build binaries from source"
|
||||||
|
echo "to compile : make mac"
|
||||||
|
;;
|
||||||
|
FreeBSD)
|
||||||
|
echo "you need to download release from github or build binaries from source"
|
||||||
|
echo "to compile : make"
|
||||||
|
;;
|
||||||
|
OpenBSD)
|
||||||
|
echo "to compile : make bsd"
|
||||||
|
;;
|
||||||
|
CYGWIN*)
|
||||||
|
echo "you need to download release from github or build binaries from source"
|
||||||
|
echo "to compile : read docs"
|
||||||
|
echo "to make things easier use zapret-win-bundle"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
unset PKTWS
|
unset PKTWS
|
||||||
case $UNAME in
|
case $UNAME in
|
||||||
Linux)
|
Linux)
|
||||||
ARCHLIST="my x86_64 x86 aarch64 arm mips64r2-msb mips32r1-lsb mips32r1-msb ppc"
|
ARCHLIST="my linux-x86_64 linux-x86 linux-arm64 linux-arm linux-mips64 linux-mipsel linux-mips linux-lexra linux-ppc"
|
||||||
PKTWS=nfqws
|
PKTWS=nfqws
|
||||||
;;
|
;;
|
||||||
Darwin)
|
Darwin)
|
||||||
ARCHLIST="my mac64"
|
ARCHLIST="my mac64"
|
||||||
;;
|
;;
|
||||||
FreeBSD)
|
FreeBSD)
|
||||||
ARCHLIST="my freebsd-x64"
|
ARCHLIST="my freebsd-x86_64"
|
||||||
PKTWS=dvtws
|
PKTWS=dvtws
|
||||||
;;
|
;;
|
||||||
CYGWIN*)
|
CYGWIN*)
|
||||||
UNAME=CYGWIN
|
UNAME=CYGWIN
|
||||||
ARCHLIST="win64"
|
ARCHLIST="windows-x86_64 windows-x86"
|
||||||
PKTWS=winws
|
PKTWS=winws
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
ARCHLIST="my"
|
ARCHLIST="my"
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
select_test_method
|
||||||
|
|
||||||
if [ "$1" = "getarch" ]; then
|
if [ "$1" = "getarch" ]; then
|
||||||
for arch in $ARCHLIST
|
for arch in $ARCHLIST
|
||||||
do
|
do
|
||||||
@@ -81,6 +196,8 @@ if [ "$1" = "getarch" ]; then
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
|
echo "using arch detect method : $TEST${ELF_ARCH:+ $ELF_ARCH}"
|
||||||
|
|
||||||
for arch in $ARCHLIST
|
for arch in $ARCHLIST
|
||||||
do
|
do
|
||||||
[ -d "$BINDIR/$arch" ] || continue
|
[ -d "$BINDIR/$arch" ] || continue
|
||||||
|
|||||||
+74
-20
@@ -26,6 +26,7 @@ IPSET_DIR="$ZAPRET_BASE/ipset"
|
|||||||
. "$ZAPRET_BASE/common/ipt.sh"
|
. "$ZAPRET_BASE/common/ipt.sh"
|
||||||
. "$ZAPRET_BASE/common/installer.sh"
|
. "$ZAPRET_BASE/common/installer.sh"
|
||||||
. "$ZAPRET_BASE/common/virt.sh"
|
. "$ZAPRET_BASE/common/virt.sh"
|
||||||
|
. "$ZAPRET_BASE/common/list.sh"
|
||||||
|
|
||||||
GET_LIST="$IPSET_DIR/get_config.sh"
|
GET_LIST="$IPSET_DIR/get_config.sh"
|
||||||
|
|
||||||
@@ -49,6 +50,29 @@ check_readonly_system()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_source()
|
||||||
|
{
|
||||||
|
local bad=0
|
||||||
|
|
||||||
|
echo \* checking source files
|
||||||
|
case $SYSTEM in
|
||||||
|
systemd)
|
||||||
|
[ -f "$EXEDIR/init.d/systemd/zapret.service" ] || bad=1
|
||||||
|
;;
|
||||||
|
openrc)
|
||||||
|
[ -f "$EXEDIR/init.d/openrc/zapret" ] || bad=1
|
||||||
|
;;
|
||||||
|
macos)
|
||||||
|
[ -f "$EXEDIR/init.d/macos/zapret" ] || bad=1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
[ "$bad" = 1 ] && {
|
||||||
|
echo 'some critical files are missing'
|
||||||
|
echo 'are you sure you are not using embedded release ? you need full version for traditional systems'
|
||||||
|
exitp 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
check_bins()
|
check_bins()
|
||||||
{
|
{
|
||||||
echo \* checking executables
|
echo \* checking executables
|
||||||
@@ -56,6 +80,7 @@ check_bins()
|
|||||||
fix_perms_bin_test "$EXEDIR"
|
fix_perms_bin_test "$EXEDIR"
|
||||||
local arch="$(get_bin_arch)"
|
local arch="$(get_bin_arch)"
|
||||||
local make_target
|
local make_target
|
||||||
|
local cf="-march=native"
|
||||||
[ "$FORCE_BUILD" = "1" ] && {
|
[ "$FORCE_BUILD" = "1" ] && {
|
||||||
echo forced build mode
|
echo forced build mode
|
||||||
if [ "$arch" = "my" ]; then
|
if [ "$arch" = "my" ]; then
|
||||||
@@ -68,8 +93,16 @@ check_bins()
|
|||||||
echo found architecture "\"$arch\""
|
echo found architecture "\"$arch\""
|
||||||
elif [ -f "$EXEDIR/Makefile" ] && exists make; then
|
elif [ -f "$EXEDIR/Makefile" ] && exists make; then
|
||||||
echo trying to compile
|
echo trying to compile
|
||||||
[ "$SYSTEM" = "macos" ] && make_target=mac
|
case $SYSTEM in
|
||||||
make -C "$EXEDIR" $make_target || {
|
macos)
|
||||||
|
make_target=mac
|
||||||
|
cf=
|
||||||
|
;;
|
||||||
|
systemd)
|
||||||
|
make_target=systemd
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
CFLAGS="${cf:+$cf }${CFLAGS}" OPTIMIZE=-O2 make -C "$EXEDIR" $make_target || {
|
||||||
echo could not compile
|
echo could not compile
|
||||||
make -C "$EXEDIR" clean
|
make -C "$EXEDIR" clean
|
||||||
exitp 8
|
exitp 8
|
||||||
@@ -115,6 +148,30 @@ ws_opt_validate()
|
|||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
tpws_opt_validate()
|
||||||
|
{
|
||||||
|
ws_opt_validate "$1" || return 1
|
||||||
|
dry_run_tpws || {
|
||||||
|
echo invalid tpws options
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tpws_socks_opt_validate()
|
||||||
|
{
|
||||||
|
# --ipset allowed here
|
||||||
|
dry_run_tpws_socks || {
|
||||||
|
echo invalid tpws options
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nfqws_opt_validate()
|
||||||
|
{
|
||||||
|
ws_opt_validate "$1" || return 1
|
||||||
|
dry_run_nfqws || {
|
||||||
|
echo invalid nfqws options
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
select_mode_group()
|
select_mode_group()
|
||||||
{
|
{
|
||||||
@@ -162,18 +219,17 @@ select_mode_group()
|
|||||||
select_mode_tpws_socks()
|
select_mode_tpws_socks()
|
||||||
{
|
{
|
||||||
local EDITVAR_NEWLINE_DELIMETER="--new" EDITVAR_NEWLINE_VARS="TPWS_SOCKS_OPT"
|
local EDITVAR_NEWLINE_DELIMETER="--new" EDITVAR_NEWLINE_VARS="TPWS_SOCKS_OPT"
|
||||||
# --ipset allowed here
|
select_mode_group TPWS_SOCKS_ENABLE "enable tpws socks mode on port $TPPORT_SOCKS ?" "TPPORT_SOCKS TPWS_SOCKS_OPT" tpws_socks_opt_validate TPWS_SOCKS_OPT
|
||||||
select_mode_group TPWS_SOCKS_ENABLE "enable tpws socks mode on port $TPPORT_SOCKS ?" "TPPORT_SOCKS TPWS_SOCKS_OPT"
|
|
||||||
}
|
}
|
||||||
select_mode_tpws()
|
select_mode_tpws()
|
||||||
{
|
{
|
||||||
local EDITVAR_NEWLINE_DELIMETER="--new" EDITVAR_NEWLINE_VARS="TPWS_OPT"
|
local EDITVAR_NEWLINE_DELIMETER="--new" EDITVAR_NEWLINE_VARS="TPWS_OPT"
|
||||||
select_mode_group TPWS_ENABLE "enable tpws transparent mode ?" "TPWS_PORTS TPWS_OPT" ws_opt_validate TPWS_OPT
|
select_mode_group TPWS_ENABLE "enable tpws transparent mode ?" "TPWS_PORTS TPWS_OPT" tpws_opt_validate TPWS_OPT
|
||||||
}
|
}
|
||||||
select_mode_nfqws()
|
select_mode_nfqws()
|
||||||
{
|
{
|
||||||
local EDITVAR_NEWLINE_DELIMETER="--new" EDITVAR_NEWLINE_VARS="NFQWS_OPT"
|
local EDITVAR_NEWLINE_DELIMETER="--new" EDITVAR_NEWLINE_VARS="NFQWS_OPT"
|
||||||
select_mode_group NFQWS_ENABLE "enable nfqws ?" "NFQWS_PORTS_TCP NFQWS_PORTS_UDP NFQWS_TCP_PKT_OUT NFQWS_TCP_PKT_IN NFQWS_UDP_PKT_OUT NFQWS_UDP_PKT_IN NFQWS_PORTS_TCP_KEEPALIVE NFQWS_PORTS_UDP_KEEPALIVE NFQWS_OPT" ws_opt_validate NFQWS_OPT
|
select_mode_group NFQWS_ENABLE "enable nfqws ?" "NFQWS_PORTS_TCP NFQWS_PORTS_UDP NFQWS_TCP_PKT_OUT NFQWS_TCP_PKT_IN NFQWS_UDP_PKT_OUT NFQWS_UDP_PKT_IN NFQWS_PORTS_TCP_KEEPALIVE NFQWS_PORTS_UDP_KEEPALIVE NFQWS_OPT" nfqws_opt_validate NFQWS_OPT
|
||||||
}
|
}
|
||||||
|
|
||||||
select_mode_mode()
|
select_mode_mode()
|
||||||
@@ -199,9 +255,9 @@ select_mode_filter()
|
|||||||
|
|
||||||
select_mode()
|
select_mode()
|
||||||
{
|
{
|
||||||
|
select_mode_filter
|
||||||
select_mode_mode
|
select_mode_mode
|
||||||
select_mode_iface
|
select_mode_iface
|
||||||
select_mode_filter
|
|
||||||
}
|
}
|
||||||
|
|
||||||
select_getlist()
|
select_getlist()
|
||||||
@@ -212,10 +268,10 @@ select_getlist()
|
|||||||
echo
|
echo
|
||||||
if ask_yes_no $D "do you want to auto download ip/host list"; then
|
if ask_yes_no $D "do you want to auto download ip/host list"; then
|
||||||
if [ "$MODE_FILTER" = "hostlist" -o "$MODE_FILTER" = "autohostlist" ] ; then
|
if [ "$MODE_FILTER" = "hostlist" -o "$MODE_FILTER" = "autohostlist" ] ; then
|
||||||
GETLISTS="get_refilter_domains.sh get_antizapret_domains.sh get_reestr_resolvable_domains.sh get_reestr_hostlist.sh"
|
GETLISTS="get_refilter_domains.sh get_antizapret_domains.sh get_reestr_resolvable_domains.sh"
|
||||||
GETLIST_DEF="get_antizapret_domains.sh"
|
GETLIST_DEF="get_antizapret_domains.sh"
|
||||||
else
|
else
|
||||||
GETLISTS="get_user.sh get_refilter_ipsum.sh get_antifilter_ip.sh get_antifilter_ipsmart.sh get_antifilter_ipsum.sh get_antifilter_ipresolve.sh get_antifilter_allyouneed.sh get_reestr_resolve.sh get_reestr_preresolved.sh get_reestr_preresolved_smart.sh"
|
GETLISTS="get_user.sh get_refilter_ipsum.sh get_antifilter_ip.sh get_antifilter_ipsmart.sh get_antifilter_ipsum.sh get_antifilter_ipresolve.sh get_antifilter_allyouneed.sh get_reestr_preresolved.sh get_reestr_preresolved_smart.sh"
|
||||||
GETLIST_DEF="get_antifilter_allyouneed.sh"
|
GETLIST_DEF="get_antifilter_allyouneed.sh"
|
||||||
fi
|
fi
|
||||||
ask_list GETLIST "$GETLISTS" "$GETLIST_DEF" && write_config_var GETLIST
|
ask_list GETLIST "$GETLISTS" "$GETLIST_DEF" && write_config_var GETLIST
|
||||||
@@ -268,7 +324,7 @@ ask_config_tmpdir()
|
|||||||
echo default tmpfs has size of 50% RAM
|
echo default tmpfs has size of 50% RAM
|
||||||
echo "RAM : $(get_ram_mb) Mb"
|
echo "RAM : $(get_ram_mb) Mb"
|
||||||
echo "DISK : $(get_free_space_mb) Mb"
|
echo "DISK : $(get_free_space_mb) Mb"
|
||||||
echo select temp file location
|
echo select temp file location
|
||||||
[ -z "$TMPDIR" ] && TMPDIR=/tmp
|
[ -z "$TMPDIR" ] && TMPDIR=/tmp
|
||||||
ask_list TMPDIR "/tmp $EXEDIR/tmp" && {
|
ask_list TMPDIR "/tmp $EXEDIR/tmp" && {
|
||||||
[ "$TMPDIR" = "/tmp" ] && TMPDIR=
|
[ "$TMPDIR" = "/tmp" ] && TMPDIR=
|
||||||
@@ -364,13 +420,13 @@ copy_openwrt()
|
|||||||
local ARCH="$(get_bin_arch)"
|
local ARCH="$(get_bin_arch)"
|
||||||
local BINDIR="$1/binaries/$ARCH"
|
local BINDIR="$1/binaries/$ARCH"
|
||||||
local file
|
local file
|
||||||
|
|
||||||
[ -d "$2" ] || mkdir -p "$2"
|
[ -d "$2" ] || mkdir -p "$2"
|
||||||
|
|
||||||
mkdir "$2/tpws" "$2/nfq" "$2/ip2net" "$2/mdig" "$2/binaries" "$2/binaries/$ARCH" "$2/init.d" "$2/tmp" "$2/files"
|
mkdir "$2/tpws" "$2/nfq" "$2/ip2net" "$2/mdig" "$2/binaries" "$2/binaries/$ARCH" "$2/init.d" "$2/tmp" "$2/files"
|
||||||
cp -R "$1/files/fake" "$2/files"
|
cp -R "$1/files/fake" "$2/files"
|
||||||
cp -R "$1/common" "$1/ipset" "$2"
|
cp -R "$1/common" "$1/ipset" "$2"
|
||||||
cp -R "$1/init.d/openwrt" "$2/init.d"
|
cp -R "$1/init.d/openwrt" "$1/init.d/custom.d.examples.linux" "$2/init.d"
|
||||||
cp "$1/config" "$1/config.default" "$1/install_easy.sh" "$1/uninstall_easy.sh" "$1/install_bin.sh" "$1/install_prereq.sh" "$1/blockcheck.sh" "$2"
|
cp "$1/config" "$1/config.default" "$1/install_easy.sh" "$1/uninstall_easy.sh" "$1/install_bin.sh" "$1/install_prereq.sh" "$1/blockcheck.sh" "$2"
|
||||||
cp "$BINDIR/tpws" "$BINDIR/nfqws" "$BINDIR/ip2net" "$BINDIR/mdig" "$2/binaries/$ARCH"
|
cp "$BINDIR/tpws" "$BINDIR/nfqws" "$BINDIR/ip2net" "$BINDIR/mdig" "$2/binaries/$ARCH"
|
||||||
}
|
}
|
||||||
@@ -458,7 +514,7 @@ _restore_settings()
|
|||||||
[ -z "$f" -o "$f" = "/" ] && continue
|
[ -z "$f" -o "$f" = "/" ] && continue
|
||||||
|
|
||||||
[ -f "/tmp/zapret-bkp-$i" ] && {
|
[ -f "/tmp/zapret-bkp-$i" ] && {
|
||||||
mv -f "/tmp/zapret-bkp-$i" "$ZAPRET_TARGET/$f" || rm -f "/tmp/zapret-bkp-$i"
|
mv -f "/tmp/zapret-bkp-$i" "$ZAPRET_TARGET/$f" || rm -f "/tmp/zapret-bkp-$i"
|
||||||
}
|
}
|
||||||
[ -d "/tmp/zapret-bkp-$i" ] && {
|
[ -d "/tmp/zapret-bkp-$i" ] && {
|
||||||
[ -d "$ZAPRET_TARGET/$f" ] && rm -r "$ZAPRET_TARGET/$f"
|
[ -d "$ZAPRET_TARGET/$f" ] && rm -r "$ZAPRET_TARGET/$f"
|
||||||
@@ -549,7 +605,7 @@ service_install_systemd()
|
|||||||
|
|
||||||
if [ -w "$SYSTEMD_SYSTEM_DIR" ] ; then
|
if [ -w "$SYSTEMD_SYSTEM_DIR" ] ; then
|
||||||
rm -f "$INIT_SCRIPT"
|
rm -f "$INIT_SCRIPT"
|
||||||
ln -fs "$EXEDIR/init.d/systemd/zapret.service" "$SYSTEMD_SYSTEM_DIR"
|
cp -f "$EXEDIR/init.d/systemd/zapret.service" "$SYSTEMD_SYSTEM_DIR"
|
||||||
"$SYSTEMCTL" daemon-reload
|
"$SYSTEMCTL" daemon-reload
|
||||||
"$SYSTEMCTL" enable zapret || {
|
"$SYSTEMCTL" enable zapret || {
|
||||||
echo could not enable systemd service
|
echo could not enable systemd service
|
||||||
@@ -567,8 +623,8 @@ timer_install_systemd()
|
|||||||
if [ -w "$SYSTEMD_SYSTEM_DIR" ] ; then
|
if [ -w "$SYSTEMD_SYSTEM_DIR" ] ; then
|
||||||
"$SYSTEMCTL" disable zapret-list-update.timer
|
"$SYSTEMCTL" disable zapret-list-update.timer
|
||||||
"$SYSTEMCTL" stop zapret-list-update.timer
|
"$SYSTEMCTL" stop zapret-list-update.timer
|
||||||
ln -fs "$EXEDIR/init.d/systemd/zapret-list-update.service" "$SYSTEMD_SYSTEM_DIR"
|
cp -f "$EXEDIR/init.d/systemd/zapret-list-update.service" "$SYSTEMD_SYSTEM_DIR"
|
||||||
ln -fs "$EXEDIR/init.d/systemd/zapret-list-update.timer" "$SYSTEMD_SYSTEM_DIR"
|
cp -f "$EXEDIR/init.d/systemd/zapret-list-update.timer" "$SYSTEMD_SYSTEM_DIR"
|
||||||
"$SYSTEMCTL" daemon-reload
|
"$SYSTEMCTL" daemon-reload
|
||||||
"$SYSTEMCTL" enable zapret-list-update.timer || {
|
"$SYSTEMCTL" enable zapret-list-update.timer || {
|
||||||
echo could not enable zapret-list-update.timer
|
echo could not enable zapret-list-update.timer
|
||||||
@@ -700,7 +756,7 @@ install_linux()
|
|||||||
crontab_del_quiet
|
crontab_del_quiet
|
||||||
# desktop system. more likely up at daytime
|
# desktop system. more likely up at daytime
|
||||||
crontab_add 10 22
|
crontab_add 10 22
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo '!!! WARNING. YOUR SETUP IS INCOMPLETE !!!'
|
echo '!!! WARNING. YOUR SETUP IS INCOMPLETE !!!'
|
||||||
echo you must manually add to auto start : $INIT_SCRIPT_SRC start
|
echo you must manually add to auto start : $INIT_SCRIPT_SRC start
|
||||||
@@ -748,7 +804,6 @@ deoffload_openwrt_firewall()
|
|||||||
else
|
else
|
||||||
echo system wide software flow offloading disabled. ok
|
echo system wide software flow offloading disabled. ok
|
||||||
fi
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -853,8 +908,7 @@ umask 0022
|
|||||||
fix_sbin_path
|
fix_sbin_path
|
||||||
fsleep_setup
|
fsleep_setup
|
||||||
check_system
|
check_system
|
||||||
|
check_source
|
||||||
[ "$SYSTEM" = "macos" ] && . "$EXEDIR/init.d/macos/functions"
|
|
||||||
|
|
||||||
case $SYSTEM in
|
case $SYSTEM in
|
||||||
systemd)
|
systemd)
|
||||||
|
|||||||
+12
-7
@@ -1,5 +1,6 @@
|
|||||||
CC ?= gcc
|
CC ?= cc
|
||||||
CFLAGS += -std=gnu99 -O3
|
OPTIMIZE ?= -Os
|
||||||
|
CFLAGS += -std=gnu99 $(OPTIMIZE) -flto=auto
|
||||||
CFLAGS_BSD = -Wno-address-of-packed-member
|
CFLAGS_BSD = -Wno-address-of-packed-member
|
||||||
CFLAGS_WIN = -static
|
CFLAGS_WIN = -static
|
||||||
LIBS =
|
LIBS =
|
||||||
@@ -9,20 +10,24 @@ SRC_FILES = ip2net.c qsort.c
|
|||||||
all: ip2net
|
all: ip2net
|
||||||
|
|
||||||
ip2net: $(SRC_FILES)
|
ip2net: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) -o $@ $(SRC_FILES) $(LDFLAGS) $(LIBS)
|
$(CC) -s $(CFLAGS) -o ip2net $(SRC_FILES) $(LIBS) $(LDFLAGS)
|
||||||
|
|
||||||
|
systemd: ip2net
|
||||||
|
|
||||||
|
android: ip2net
|
||||||
|
|
||||||
bsd: $(SRC_FILES)
|
bsd: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_BSD) -o ip2net $(SRC_FILES) $(LDFLAGS) $(LIBS)
|
$(CC) -s $(CFLAGS) $(CFLAGS_BSD) -o ip2net $(SRC_FILES) $(LIBS) $(LDFLAGS)
|
||||||
|
|
||||||
mac: $(SRC_FILES)
|
mac: $(SRC_FILES)
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o ip2neta $(SRC_FILES) $(LDFLAGS) -target arm64-apple-macos10.8 $(LIBS)
|
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o ip2neta $(SRC_FILES) -target arm64-apple-macos10.8 $(LIBS) $(LDFLAGS)
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o ip2netx $(SRC_FILES) $(LDFLAGS) -target x86_64-apple-macos10.8 $(LIBS)
|
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o ip2netx $(SRC_FILES) -target x86_64-apple-macos10.8 $(LIBS) $(LDFLAGS)
|
||||||
strip ip2neta ip2netx
|
strip ip2neta ip2netx
|
||||||
lipo -create -output ip2net ip2netx ip2neta
|
lipo -create -output ip2net ip2netx ip2neta
|
||||||
rm -f ip2netx ip2neta
|
rm -f ip2netx ip2neta
|
||||||
|
|
||||||
win: $(SRC_FILES)
|
win: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_WIN) -o ip2net $(SRC_FILES) $(LDFLAGS) $(LIBS_WIN)
|
$(CC) -s $(CFLAGS) $(CFLAGS_WIN) -o ip2net $(SRC_FILES) $(LIBS_WIN) $(LDFLAGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f ip2net *.o
|
rm -f ip2net *.o
|
||||||
|
|||||||
+39
-18
@@ -192,7 +192,7 @@ static void ip6_and(const struct in6_addr * restrict a, const struct in6_addr *
|
|||||||
static void rtrim(char *s)
|
static void rtrim(char *s)
|
||||||
{
|
{
|
||||||
if (s)
|
if (s)
|
||||||
for (char *p = s + strlen(s) - 1; p >= s && (*p == '\n' || *p == '\r'); p--) *p = '\0';
|
for (char *p = s + strlen(s) - 1; p >= s && (*p == '\n' || *p == '\r' || *p == ' ' || *p == '\t'); p--) *p = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -217,6 +217,36 @@ static void exithelp(void)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define STRINGIFY(x) #x
|
||||||
|
#define TOSTRING(x) STRINGIFY(x)
|
||||||
|
#if defined(ZAPRET_GH_VER) || defined (ZAPRET_GH_HASH)
|
||||||
|
#define PRINT_VER printf("github version %s (%s)\n\n", TOSTRING(ZAPRET_GH_VER), TOSTRING(ZAPRET_GH_HASH))
|
||||||
|
#else
|
||||||
|
#define PRINT_VER printf("self-built version %s %s\n\n", __DATE__, __TIME__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum opt_indices {
|
||||||
|
IDX_HELP,
|
||||||
|
IDX_H,
|
||||||
|
IDX_4,
|
||||||
|
IDX_6,
|
||||||
|
IDX_PREFIX_LENGTH,
|
||||||
|
IDX_V4_THRESHOLD,
|
||||||
|
IDX_V6_THRESHOLD,
|
||||||
|
IDX_LAST,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct option long_options[] = {
|
||||||
|
[IDX_HELP] = {"help", no_argument, 0, 0},
|
||||||
|
[IDX_H] = {"h", no_argument, 0, 0},
|
||||||
|
[IDX_4] = {"4", no_argument, 0, 0},
|
||||||
|
[IDX_6] = {"6", no_argument, 0, 0},
|
||||||
|
[IDX_PREFIX_LENGTH] = {"prefix-length", required_argument, 0, 0},
|
||||||
|
[IDX_V4_THRESHOLD] = {"v4-threshold", required_argument, 0, 0},
|
||||||
|
[IDX_V6_THRESHOLD] = {"v6-threshold", required_argument, 0, 0},
|
||||||
|
[IDX_LAST] = {NULL, 0, NULL, 0},
|
||||||
|
};
|
||||||
|
|
||||||
static void parse_params(int argc, char *argv[])
|
static void parse_params(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
@@ -228,32 +258,23 @@ static void parse_params(int argc, char *argv[])
|
|||||||
params.pctdiv = DEFAULT_PCTDIV;
|
params.pctdiv = DEFAULT_PCTDIV;
|
||||||
params.v6_threshold = DEFAULT_V6_THRESHOLD;
|
params.v6_threshold = DEFAULT_V6_THRESHOLD;
|
||||||
|
|
||||||
const struct option long_options[] = {
|
|
||||||
{ "help",no_argument,0,0 },// optidx=0
|
|
||||||
{ "h",no_argument,0,0 },// optidx=1
|
|
||||||
{ "4",no_argument,0,0 },// optidx=2
|
|
||||||
{ "6",no_argument,0,0 },// optidx=3
|
|
||||||
{ "prefix-length",required_argument,0,0 },// optidx=4
|
|
||||||
{ "v4-threshold",required_argument,0,0 },// optidx=5
|
|
||||||
{ "v6-threshold",required_argument,0,0 },// optidx=6
|
|
||||||
{ NULL,0,NULL,0 }
|
|
||||||
};
|
|
||||||
while ((v = getopt_long_only(argc, argv, "", long_options, &option_index)) != -1)
|
while ((v = getopt_long_only(argc, argv, "", long_options, &option_index)) != -1)
|
||||||
{
|
{
|
||||||
if (v) exithelp();
|
if (v) exithelp();
|
||||||
switch (option_index)
|
switch (option_index)
|
||||||
{
|
{
|
||||||
case 0:
|
case IDX_HELP:
|
||||||
case 1:
|
case IDX_H:
|
||||||
|
PRINT_VER;
|
||||||
exithelp();
|
exithelp();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case IDX_4:
|
||||||
params.ipv6 = false;
|
params.ipv6 = false;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case IDX_6:
|
||||||
params.ipv6 = true;
|
params.ipv6 = true;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case IDX_PREFIX_LENGTH:
|
||||||
i = sscanf(optarg,"%u-%u",&plen1,&plen2);
|
i = sscanf(optarg,"%u-%u",&plen1,&plen2);
|
||||||
if (i == 1) plen2 = plen1;
|
if (i == 1) plen2 = plen1;
|
||||||
if (i<=0 || plen2<plen1 || !plen1 || !plen2)
|
if (i<=0 || plen2<plen1 || !plen1 || !plen2)
|
||||||
@@ -262,7 +283,7 @@ static void parse_params(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 5:
|
case IDX_V4_THRESHOLD:
|
||||||
i = sscanf(optarg, "%u/%u", ¶ms.pctmult, ¶ms.pctdiv);
|
i = sscanf(optarg, "%u/%u", ¶ms.pctmult, ¶ms.pctdiv);
|
||||||
if (i!=2 || params.pctdiv<2 || params.pctmult<1 || params.pctmult>=params.pctdiv)
|
if (i!=2 || params.pctdiv<2 || params.pctmult<1 || params.pctmult>=params.pctdiv)
|
||||||
{
|
{
|
||||||
@@ -270,7 +291,7 @@ static void parse_params(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case IDX_V6_THRESHOLD:
|
||||||
i = sscanf(optarg, "%u", ¶ms.v6_threshold);
|
i = sscanf(optarg, "%u", ¶ms.v6_threshold);
|
||||||
if (i != 1 || params.v6_threshold<1)
|
if (i != 1 || params.v6_threshold<1)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ get_antifilter()
|
|||||||
[ "$DISABLE_IPV4" != "1" ] && {
|
[ "$DISABLE_IPV4" != "1" ] && {
|
||||||
curl --fail --max-time 150 --connect-timeout 20 --max-filesize 41943040 -k -L "$1" | cut_local >"$ZIPLISTTMP" &&
|
curl --fail --max-time 150 --connect-timeout 20 --max-filesize 41943040 -k -L "$1" | cut_local >"$ZIPLISTTMP" &&
|
||||||
{
|
{
|
||||||
dlsize=$(LANG=C wc -c "$ZIPLISTTMP" | xargs | cut -f 1 -d ' ')
|
dlsize=$(LC_ALL=C LANG=C wc -c "$ZIPLISTTMP" | xargs | cut -f 1 -d ' ')
|
||||||
if [ $dlsize -lt 102400 ]; then
|
if [ $dlsize -lt 102400 ]; then
|
||||||
echo list file is too small. can be bad.
|
echo list file is too small. can be bad.
|
||||||
exit 2
|
exit 2
|
||||||
|
|||||||
+27
-1
@@ -5,7 +5,7 @@ ZAPRET_RW=${ZAPRET_RW:-"$ZAPRET_BASE"}
|
|||||||
ZAPRET_CONFIG=${ZAPRET_CONFIG:-"$ZAPRET_RW/config"}
|
ZAPRET_CONFIG=${ZAPRET_CONFIG:-"$ZAPRET_RW/config"}
|
||||||
IPSET_RW_DIR="$ZAPRET_RW/ipset"
|
IPSET_RW_DIR="$ZAPRET_RW/ipset"
|
||||||
|
|
||||||
. "$ZAPRET_CONFIG"
|
[ -f "$ZAPRET_CONFIG" ] && . "$ZAPRET_CONFIG"
|
||||||
. "$ZAPRET_BASE/common/base.sh"
|
. "$ZAPRET_BASE/common/base.sh"
|
||||||
|
|
||||||
[ -z "$TMPDIR" ] && TMPDIR=/tmp
|
[ -z "$TMPDIR" ] && TMPDIR=/tmp
|
||||||
@@ -141,6 +141,18 @@ zzsize()
|
|||||||
printf 0
|
printf 0
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
zzcopy()
|
||||||
|
{
|
||||||
|
local is_gz=0
|
||||||
|
zztest "$1" && is_gz=1
|
||||||
|
if [ "$GZIP_LISTS" = 1 -a $is_gz = 1 ]; then
|
||||||
|
cp "$1" "${2}.gz"
|
||||||
|
elif [ "$GZIP_LISTS" != 1 -a $is_gz != 1 ]; then
|
||||||
|
cp "$1" "$2"
|
||||||
|
else
|
||||||
|
zzcat "$1" | zz "$2"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
digger()
|
digger()
|
||||||
{
|
{
|
||||||
@@ -255,3 +267,17 @@ getipban()
|
|||||||
_get_ipban
|
_get_ipban
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hup_zapret_daemons()
|
||||||
|
{
|
||||||
|
echo forcing zapret daemons to reload their hostlist
|
||||||
|
if exists killall; then
|
||||||
|
killall -HUP tpws nfqws dvtws 2>/dev/null
|
||||||
|
elif exists pkill; then
|
||||||
|
pkill -HUP ^tpws$
|
||||||
|
pkill -HUP ^nfqws$
|
||||||
|
pkill -HUP ^dvtws$
|
||||||
|
else
|
||||||
|
echo no mass killer available ! cant HUP zapret daemons
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ curl -H "Accept-Encoding: gzip" -k --fail --max-time 600 --connect-timeout 5 --r
|
|||||||
exit 2
|
exit 2
|
||||||
}
|
}
|
||||||
|
|
||||||
dlsize=$(LANG=C wc -c "$ZDOM" | xargs | cut -f 1 -d ' ')
|
dlsize=$(LC_ALL=C LANG=C wc -c "$ZDOM" | xargs | cut -f 1 -d ' ')
|
||||||
if test $dlsize -lt 102400; then
|
if test $dlsize -lt 102400; then
|
||||||
echo list file is too small. can be bad.
|
echo list file is too small. can be bad.
|
||||||
exit 2
|
exit 2
|
||||||
@@ -31,4 +31,6 @@ sort -u "$ZDOM" | zz "$ZHOSTLIST"
|
|||||||
|
|
||||||
rm -f "$ZDOM"
|
rm -f "$ZDOM"
|
||||||
|
|
||||||
|
hup_zapret_daemons
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
IPSET_DIR="$(dirname "$0")"
|
IPSET_DIR="$(dirname "$0")"
|
||||||
IPSET_DIR="$(cd "$IPSET_DIR"; pwd)"
|
IPSET_DIR="$(cd "$IPSET_DIR"; pwd)"
|
||||||
|
|
||||||
. "$IPSET_DIR/../config"
|
[ -f "$IPSET_DIR/../config" ] && . "$IPSET_DIR/../config"
|
||||||
|
|
||||||
[ -z "$GETLIST" ] && GETLIST=get_ipban.sh
|
[ -z "$GETLIST" ] && GETLIST=get_ipban.sh
|
||||||
[ -x "$IPSET_DIR/$GETLIST" ] && exec "$IPSET_DIR/$GETLIST"
|
[ -x "$IPSET_DIR/$GETLIST" ] && exec "$IPSET_DIR/$GETLIST"
|
||||||
|
|||||||
@@ -1,63 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
IPSET_DIR="$(dirname "$0")"
|
|
||||||
IPSET_DIR="$(cd "$IPSET_DIR"; pwd)"
|
|
||||||
|
|
||||||
. "$IPSET_DIR/def.sh"
|
|
||||||
|
|
||||||
ZREESTR="$TMPDIR/zapret.txt"
|
|
||||||
IPB="$TMPDIR/ipb.txt"
|
|
||||||
ZURL_REESTR=https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv
|
|
||||||
|
|
||||||
dl_checked()
|
|
||||||
{
|
|
||||||
# $1 - url
|
|
||||||
# $2 - file
|
|
||||||
# $3 - minsize
|
|
||||||
# $4 - maxsize
|
|
||||||
# $5 - maxtime
|
|
||||||
curl -k --fail --max-time $5 --connect-timeout 10 --retry 4 --max-filesize $4 -o "$2" "$1" ||
|
|
||||||
{
|
|
||||||
echo list download failed : $1
|
|
||||||
return 2
|
|
||||||
}
|
|
||||||
dlsize=$(LANG=C wc -c "$2" | xargs | cut -f 1 -d ' ')
|
|
||||||
if test $dlsize -lt $3; then
|
|
||||||
echo list is too small : $dlsize bytes. can be bad.
|
|
||||||
return 2
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
reestr_list()
|
|
||||||
{
|
|
||||||
LANG=C cut -s -f2 -d';' "$ZREESTR" | LANG=C nice -n 5 sed -Ee 's/^\*\.(.+)$/\1/' -ne 's/^[a-z0-9A-Z._-]+$/&/p' | $AWK '{ print tolower($0) }'
|
|
||||||
}
|
|
||||||
reestr_extract_ip()
|
|
||||||
{
|
|
||||||
LANG=C nice -n 5 $AWK -F ';' '($1 ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/) && (($2 == "" && $3 == "") || ($1 == $2)) {gsub(/ \| /, RS); print $1}' "$ZREESTR" | LANG=C $AWK '{split($1, a, /\|/); for (i in a) {print a[i]}}'
|
|
||||||
}
|
|
||||||
|
|
||||||
ipban_fin()
|
|
||||||
{
|
|
||||||
getipban
|
|
||||||
"$IPSET_DIR/create_ipset.sh"
|
|
||||||
}
|
|
||||||
|
|
||||||
dl_checked "$ZURL_REESTR" "$ZREESTR" 204800 251658240 600 || {
|
|
||||||
ipban_fin
|
|
||||||
exit 2
|
|
||||||
}
|
|
||||||
|
|
||||||
reestr_list | sort -u | zz "$ZHOSTLIST"
|
|
||||||
|
|
||||||
reestr_extract_ip <"$ZREESTR" >"$IPB"
|
|
||||||
|
|
||||||
rm -f "$ZREESTR"
|
|
||||||
[ "$DISABLE_IPV4" != "1" ] && $AWK '/^([0-9]{1,3}\.){3}[0-9]{1,3}($|(\/[0-9]{2}$))/' "$IPB" | cut_local | ip2net4 | zz "$ZIPLIST_IPBAN"
|
|
||||||
[ "$DISABLE_IPV6" != "1" ] && $AWK '/^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}($|(\/[0-9]{2,3}$))/' "$IPB" | cut_local6 | ip2net6 | zz "$ZIPLIST_IPBAN6"
|
|
||||||
rm -f "$IPB"
|
|
||||||
|
|
||||||
ipban_fin
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -10,8 +10,8 @@ TMPLIST="$TMPDIR/list.txt"
|
|||||||
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
||||||
URL4="$BASEURL/reestr_resolved4.txt"
|
URL4="$BASEURL/reestr_resolved4.txt"
|
||||||
URL6="$BASEURL/reestr_resolved6.txt"
|
URL6="$BASEURL/reestr_resolved6.txt"
|
||||||
IPB4="$BASEURL/reestr_ipban4.txt"
|
#IPB4="$BASEURL/reestr_ipban4.txt"
|
||||||
IPB6="$BASEURL/reestr_ipban6.txt"
|
#IPB6="$BASEURL/reestr_ipban6.txt"
|
||||||
|
|
||||||
dl()
|
dl()
|
||||||
{
|
{
|
||||||
@@ -24,23 +24,23 @@ dl()
|
|||||||
echo list download failed : $1
|
echo list download failed : $1
|
||||||
exit 2
|
exit 2
|
||||||
}
|
}
|
||||||
dlsize=$(LANG=C wc -c "$TMPLIST" | xargs | cut -f 1 -d ' ')
|
dlsize=$(LC_ALL=C LANG=C wc -c "$TMPLIST" | xargs | cut -f 1 -d ' ')
|
||||||
if test $dlsize -lt $3; then
|
if test $dlsize -lt $3; then
|
||||||
echo list is too small : $dlsize bytes. can be bad.
|
echo list is too small : $dlsize bytes. can be bad.
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
zzcat "$TMPLIST" | zz "$2"
|
zzcopy "$TMPLIST" "$2"
|
||||||
rm -f "$TMPLIST"
|
rm -f "$TMPLIST"
|
||||||
}
|
}
|
||||||
|
|
||||||
getuser && {
|
getuser && {
|
||||||
[ "$DISABLE_IPV4" != "1" ] && {
|
[ "$DISABLE_IPV4" != "1" ] && {
|
||||||
dl "$URL4" "$ZIPLIST" 32768 4194304
|
dl "$URL4" "$ZIPLIST" 4096 4194304
|
||||||
dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
# dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
||||||
}
|
}
|
||||||
[ "$DISABLE_IPV6" != "1" ] && {
|
[ "$DISABLE_IPV6" != "1" ] && {
|
||||||
dl "$URL6" "$ZIPLIST6" 8192 4194304
|
dl "$URL6" "$ZIPLIST6" 2048 4194304
|
||||||
dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
# dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ TMPLIST="$TMPDIR/list.txt"
|
|||||||
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
||||||
URL4="$BASEURL/reestr_smart4.txt"
|
URL4="$BASEURL/reestr_smart4.txt"
|
||||||
URL6="$BASEURL/reestr_smart6.txt"
|
URL6="$BASEURL/reestr_smart6.txt"
|
||||||
IPB4="$BASEURL/reestr_ipban4.txt"
|
#IPB4="$BASEURL/reestr_ipban4.txt"
|
||||||
IPB6="$BASEURL/reestr_ipban6.txt"
|
#IPB6="$BASEURL/reestr_ipban6.txt"
|
||||||
|
|
||||||
dl()
|
dl()
|
||||||
{
|
{
|
||||||
@@ -24,23 +24,23 @@ dl()
|
|||||||
echo list download failed : $1
|
echo list download failed : $1
|
||||||
exit 2
|
exit 2
|
||||||
}
|
}
|
||||||
dlsize=$(LANG=C wc -c "$TMPLIST" | xargs | cut -f 1 -d ' ')
|
dlsize=$(LC_ALL=C LANG=C wc -c "$TMPLIST" | xargs | cut -f 1 -d ' ')
|
||||||
if test $dlsize -lt $3; then
|
if test $dlsize -lt $3; then
|
||||||
echo list is too small : $dlsize bytes. can be bad.
|
echo list is too small : $dlsize bytes. can be bad.
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
zzcat "$TMPLIST" | zz "$2"
|
zzcopy "$TMPLIST" "$2"
|
||||||
rm -f "$TMPLIST"
|
rm -f "$TMPLIST"
|
||||||
}
|
}
|
||||||
|
|
||||||
getuser && {
|
getuser && {
|
||||||
[ "$DISABLE_IPV4" != "1" ] && {
|
[ "$DISABLE_IPV4" != "1" ] && {
|
||||||
dl "$URL4" "$ZIPLIST" 32768 4194304
|
dl "$URL4" "$ZIPLIST" 4096 4194304
|
||||||
dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
# dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
||||||
}
|
}
|
||||||
[ "$DISABLE_IPV6" != "1" ] && {
|
[ "$DISABLE_IPV6" != "1" ] && {
|
||||||
dl "$URL6" "$ZIPLIST6" 8192 4194304
|
dl "$URL6" "$ZIPLIST6" 2048 4194304
|
||||||
dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
# dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ TMPLIST="$TMPDIR/list_nethub.txt"
|
|||||||
|
|
||||||
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
||||||
URL="$BASEURL/reestr_hostname_resolvable.txt"
|
URL="$BASEURL/reestr_hostname_resolvable.txt"
|
||||||
IPB4="$BASEURL/reestr_ipban4.txt"
|
#IPB4="$BASEURL/reestr_ipban4.txt"
|
||||||
IPB6="$BASEURL/reestr_ipban6.txt"
|
#IPB6="$BASEURL/reestr_ipban6.txt"
|
||||||
|
|
||||||
dl()
|
dl()
|
||||||
{
|
{
|
||||||
@@ -23,19 +23,21 @@ dl()
|
|||||||
echo list download failed : $1
|
echo list download failed : $1
|
||||||
exit 2
|
exit 2
|
||||||
}
|
}
|
||||||
dlsize=$(LANG=C wc -c "$TMPLIST" | xargs | cut -f 1 -d ' ')
|
dlsize=$(LC_ALL=C LANG=C wc -c "$TMPLIST" | xargs | cut -f 1 -d ' ')
|
||||||
if test $dlsize -lt $3; then
|
if test $dlsize -lt $3; then
|
||||||
echo list is too small : $dlsize bytes. can be bad.
|
echo list is too small : $dlsize bytes. can be bad.
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
zzcat "$TMPLIST" | zz "$2"
|
zzcopy "$TMPLIST" "$2"
|
||||||
rm -f "$TMPLIST"
|
rm -f "$TMPLIST"
|
||||||
}
|
}
|
||||||
|
|
||||||
dl "$URL" "$ZHOSTLIST" 65536 67108864
|
dl "$URL" "$ZHOSTLIST" 65536 67108864
|
||||||
|
|
||||||
[ "$DISABLE_IPV4" != "1" ] && dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
hup_zapret_daemons
|
||||||
[ "$DISABLE_IPV6" != "1" ] && dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
|
||||||
|
#[ "$DISABLE_IPV4" != "1" ] && dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
||||||
|
#[ "$DISABLE_IPV6" != "1" ] && dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
||||||
|
|
||||||
getipban
|
getipban
|
||||||
"$IPSET_DIR/create_ipset.sh"
|
"$IPSET_DIR/create_ipset.sh"
|
||||||
|
|||||||
@@ -1,83 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
IPSET_DIR="$(dirname "$0")"
|
|
||||||
IPSET_DIR="$(cd "$IPSET_DIR"; pwd)"
|
|
||||||
|
|
||||||
. "$IPSET_DIR/def.sh"
|
|
||||||
|
|
||||||
ZREESTR="$TMPDIR/zapret.txt"
|
|
||||||
ZDIG="$TMPDIR/zapret-dig.txt"
|
|
||||||
IPB="$TMPDIR/ipb.txt"
|
|
||||||
ZIPLISTTMP="$TMPDIR/zapret-ip.txt"
|
|
||||||
#ZURL=https://reestr.rublacklist.net/api/current
|
|
||||||
ZURL_REESTR=https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv
|
|
||||||
|
|
||||||
dl_checked()
|
|
||||||
{
|
|
||||||
# $1 - url
|
|
||||||
# $2 - file
|
|
||||||
# $3 - minsize
|
|
||||||
# $4 - maxsize
|
|
||||||
# $5 - maxtime
|
|
||||||
curl -k --fail --max-time $5 --connect-timeout 10 --retry 4 --max-filesize $4 -o "$2" "$1" ||
|
|
||||||
{
|
|
||||||
echo list download failed : $1
|
|
||||||
return 2
|
|
||||||
}
|
|
||||||
dlsize=$(LANG=C wc -c "$2" | xargs | cut -f 1 -d ' ')
|
|
||||||
if test $dlsize -lt $3; then
|
|
||||||
echo list is too small : $dlsize bytes. can be bad.
|
|
||||||
return 2
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
reestr_list()
|
|
||||||
{
|
|
||||||
LANG=C cut -s -f2 -d';' "$ZREESTR" | LANG=C nice -n 5 sed -Ee 's/^\*\.(.+)$/\1/' -ne 's/^[a-z0-9A-Z._-]+$/&/p'
|
|
||||||
}
|
|
||||||
reestr_extract_ip()
|
|
||||||
{
|
|
||||||
LANG=C nice -n 5 $AWK -F ';' '($1 ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/) && (($2 == "" && $3 == "") || ($1 == $2)) {gsub(/ \| /, RS); print $1}' "$ZREESTR" | LANG=C $AWK '{split($1, a, /\|/); for (i in a) {print a[i]}}'
|
|
||||||
}
|
|
||||||
|
|
||||||
getuser && {
|
|
||||||
# both disabled
|
|
||||||
[ "$DISABLE_IPV4" = "1" ] && [ "$DISABLE_IPV6" = "1" ] && exit 0
|
|
||||||
|
|
||||||
dl_checked "$ZURL_REESTR" "$ZREESTR" 204800 251658240 600 || exit 2
|
|
||||||
|
|
||||||
echo preparing ipban list ..
|
|
||||||
|
|
||||||
reestr_extract_ip <"$ZREESTR" >"$IPB"
|
|
||||||
[ "$DISABLE_IPV4" != "1" ] && $AWK '/^([0-9]{1,3}\.){3}[0-9]{1,3}($|(\/[0-9]{2}$))/' "$IPB" | cut_local | ip2net4 | zz "$ZIPLIST_IPBAN"
|
|
||||||
[ "$DISABLE_IPV6" != "1" ] && $AWK '/^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}($|(\/[0-9]{2,3}$))/' "$IPB" | cut_local6 | ip2net6 | zz "$ZIPLIST_IPBAN6"
|
|
||||||
rm -f "$IPB"
|
|
||||||
|
|
||||||
echo preparing dig list ..
|
|
||||||
reestr_list | sort -u >"$ZDIG"
|
|
||||||
|
|
||||||
rm -f "$ZREESTR"
|
|
||||||
|
|
||||||
echo digging started. this can take long ...
|
|
||||||
|
|
||||||
[ "$DISABLE_IPV4" != "1" ] && {
|
|
||||||
filedigger "$ZDIG" 4 | cut_local >"$ZIPLISTTMP" || {
|
|
||||||
rm -f "$ZDIG"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
ip2net4 <"$ZIPLISTTMP" | zz "$ZIPLIST"
|
|
||||||
rm -f "$ZIPLISTTMP"
|
|
||||||
}
|
|
||||||
[ "$DISABLE_IPV6" != "1" ] && {
|
|
||||||
filedigger "$ZDIG" 6 | cut_local6 >"$ZIPLISTTMP" || {
|
|
||||||
rm -f "$ZDIG"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
ip2net6 <"$ZIPLISTTMP" | zz "$ZIPLIST6"
|
|
||||||
rm -f "$ZIPLISTTMP"
|
|
||||||
}
|
|
||||||
rm -f "$ZDIG"
|
|
||||||
}
|
|
||||||
|
|
||||||
"$IPSET_DIR/create_ipset.sh"
|
|
||||||
@@ -20,12 +20,12 @@ dl()
|
|||||||
echo list download failed : $1
|
echo list download failed : $1
|
||||||
exit 2
|
exit 2
|
||||||
}
|
}
|
||||||
dlsize=$(LANG=C wc -c "$TMPLIST" | xargs | cut -f 1 -d ' ')
|
dlsize=$(LC_ALL=C LANG=C wc -c "$TMPLIST" | xargs | cut -f 1 -d ' ')
|
||||||
if test $dlsize -lt $3; then
|
if test $dlsize -lt $3; then
|
||||||
echo list is too small : $dlsize bytes. can be bad.
|
echo list is too small : $dlsize bytes. can be bad.
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
zzcat "$TMPLIST" | tr -d '\015' | zz "$2"
|
zzcopy "$TMPLIST" "$2"
|
||||||
rm -f "$TMPLIST"
|
rm -f "$TMPLIST"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,4 +37,6 @@ getipban || FAIL=1
|
|||||||
|
|
||||||
dl "$URL" "$ZHOSTLIST" 32768 4194304
|
dl "$URL" "$ZHOSTLIST" 32768 4194304
|
||||||
|
|
||||||
|
hup_zapret_daemons
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
@@ -20,13 +20,12 @@ dl()
|
|||||||
echo list download failed : $1
|
echo list download failed : $1
|
||||||
exit 2
|
exit 2
|
||||||
}
|
}
|
||||||
dlsize=$(LANG=C wc -c "$TMPLIST" | xargs | cut -f 1 -d ' ')
|
dlsize=$(LC_ALL=C LANG=C wc -c "$TMPLIST" | xargs | cut -f 1 -d ' ')
|
||||||
if test $dlsize -lt $3; then
|
if test $dlsize -lt $3; then
|
||||||
echo list is too small : $dlsize bytes. can be bad.
|
echo list is too small : $dlsize bytes. can be bad.
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
# remove DOS EOL \r
|
zzcopy "$TMPLIST" "$2"
|
||||||
zzcat "$TMPLIST" | tr -d '\015' | zz "$2"
|
|
||||||
rm -f "$TMPLIST"
|
rm -f "$TMPLIST"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
|
127.0.0.0/8
|
||||||
10.0.0.0/8
|
10.0.0.0/8
|
||||||
172.16.0.0/12
|
172.16.0.0/12
|
||||||
192.168.0.0/16
|
192.168.0.0/16
|
||||||
169.254.0.0/16
|
169.254.0.0/16
|
||||||
|
100.64.0.0/10
|
||||||
|
::1
|
||||||
fc00::/7
|
fc00::/7
|
||||||
fe80::/10
|
fe80::/10
|
||||||
|
|||||||
+14
-7
@@ -1,28 +1,35 @@
|
|||||||
CC ?= gcc
|
CC ?= cc
|
||||||
CFLAGS += -std=gnu99 -O3
|
OPTIMIZE ?= -Os
|
||||||
|
CFLAGS += -std=gnu99 $(OPTIMIZE)
|
||||||
CFLAGS_BSD = -Wno-address-of-packed-member
|
CFLAGS_BSD = -Wno-address-of-packed-member
|
||||||
CFLAGS_WIN = -static
|
CFLAGS_WIN = -static
|
||||||
LIBS = -lpthread
|
LIBS = -lpthread
|
||||||
|
LIBS_ANDROID =
|
||||||
LIBS_WIN = -lws2_32
|
LIBS_WIN = -lws2_32
|
||||||
SRC_FILES = *.c
|
SRC_FILES = *.c
|
||||||
|
|
||||||
all: mdig
|
all: mdig
|
||||||
|
|
||||||
mdig: $(SRC_FILES)
|
mdig: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) -o $@ $(SRC_FILES) $(LDFLAGS) $(LIBS)
|
$(CC) -s $(CFLAGS) -o mdig $(SRC_FILES) $(LIBS) $(LDFLAGS)
|
||||||
|
|
||||||
|
systemd: mdig
|
||||||
|
|
||||||
|
android: $(SRC_FILES)
|
||||||
|
$(CC) -s $(CFLAGS) -o mdig $(SRC_FILES) $(LIBS_ANDROID) $(LDFLAGS)
|
||||||
|
|
||||||
bsd: $(SRC_FILES)
|
bsd: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_BSD) -o mdig $(SRC_FILES) $(LDFLAGS) $(LIBS)
|
$(CC) -s $(CFLAGS) $(CFLAGS_BSD) -o mdig $(SRC_FILES) $(LIBS) $(LDFLAGS)
|
||||||
|
|
||||||
mac: $(SRC_FILES)
|
mac: $(SRC_FILES)
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o mdiga $(SRC_FILES) $(LDFLAGS) -target arm64-apple-macos10.8 $(LIBS_BSD)
|
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o mdiga $(SRC_FILES) -target arm64-apple-macos10.8 $(LIBS_BSD) $(LDFLAGS)
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o mdigx $(SRC_FILES) $(LDFLAGS) -target x86_64-apple-macos10.8 $(LIBS_BSD)
|
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o mdigx $(SRC_FILES) -target x86_64-apple-macos10.8 $(LIBS_BSD) $(LDFLAGS)
|
||||||
strip mdiga mdigx
|
strip mdiga mdigx
|
||||||
lipo -create -output mdig mdigx mdiga
|
lipo -create -output mdig mdigx mdiga
|
||||||
rm -f mdigx mdiga
|
rm -f mdigx mdiga
|
||||||
|
|
||||||
win: $(SRC_FILES)
|
win: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_WIN) -o mdig $(SRC_FILES) $(LDFLAGS) $(LIBS_WIN)
|
$(CC) -s $(CFLAGS) $(CFLAGS_WIN) -o mdig $(SRC_FILES) $(LIBS_WIN) $(LDFLAGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f mdig *.o
|
rm -f mdig *.o
|
||||||
|
|||||||
+55
-25
@@ -12,7 +12,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -21,7 +20,9 @@
|
|||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#include <ws2ipdef.h>
|
#include <ws2ipdef.h>
|
||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#else
|
#else
|
||||||
|
#include <unistd.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
@@ -34,7 +35,7 @@
|
|||||||
static void trimstr(char *s)
|
static void trimstr(char *s)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
for (p = s + strlen(s) - 1; p >= s && (*p == '\n' || *p == '\r'); p--) *p = '\0';
|
for (p = s + strlen(s) - 1; p >= s && (*p == '\n' || *p == '\r' || *p == ' ' || *p == '\t'); p--) *p = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* eai_str(int r)
|
static const char* eai_str(int r)
|
||||||
@@ -364,6 +365,9 @@ int dns_make_query(const char *dom, char family)
|
|||||||
fprintf(stderr, "could not make DNS query\n");
|
fprintf(stderr, "could not make DNS query\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#ifdef _WIN32
|
||||||
|
_setmode(_fileno(stdout), _O_BINARY);
|
||||||
|
#endif
|
||||||
if (fwrite(q,l,1,stdout)!=1)
|
if (fwrite(q,l,1,stdout)!=1)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "could not write DNS query blob to stdout\n");
|
fprintf(stderr, "could not write DNS query blob to stdout\n");
|
||||||
@@ -420,8 +424,11 @@ bool dns_parse_print(const uint8_t *a, size_t len)
|
|||||||
}
|
}
|
||||||
int dns_parse_query()
|
int dns_parse_query()
|
||||||
{
|
{
|
||||||
uint8_t a[1500];
|
uint8_t a[8192];
|
||||||
size_t l;
|
size_t l;
|
||||||
|
#ifdef _WIN32
|
||||||
|
_setmode(_fileno(stdin), _O_BINARY);
|
||||||
|
#endif
|
||||||
l = fread(a,1,sizeof(a),stdin);
|
l = fread(a,1,sizeof(a),stdin);
|
||||||
if (!l || !feof(stdin))
|
if (!l || !feof(stdin))
|
||||||
{
|
{
|
||||||
@@ -451,25 +458,47 @@ static void exithelp(void)
|
|||||||
);
|
);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define STRINGIFY(x) #x
|
||||||
|
#define TOSTRING(x) STRINGIFY(x)
|
||||||
|
#if defined(ZAPRET_GH_VER) || defined (ZAPRET_GH_HASH)
|
||||||
|
#define PRINT_VER printf("github version %s (%s)\n\n", TOSTRING(ZAPRET_GH_VER), TOSTRING(ZAPRET_GH_HASH))
|
||||||
|
#else
|
||||||
|
#define PRINT_VER printf("self-built version %s %s\n\n", __DATE__, __TIME__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum opt_indices {
|
||||||
|
IDX_HELP,
|
||||||
|
IDX_THREADS,
|
||||||
|
IDX_FAMILY,
|
||||||
|
IDX_VERBOSE,
|
||||||
|
IDX_STATS,
|
||||||
|
IDX_LOG_RESOLVED,
|
||||||
|
IDX_LOG_FAILED,
|
||||||
|
IDX_DNS_MAKE_QUERY,
|
||||||
|
IDX_DNS_PARSE_QUERY,
|
||||||
|
IDX_LAST,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct option long_options[] = {
|
||||||
|
[IDX_HELP] = {"help", no_argument, 0, 0},
|
||||||
|
[IDX_THREADS] = {"threads", required_argument, 0, 0},
|
||||||
|
[IDX_FAMILY] = {"family", required_argument, 0, 0},
|
||||||
|
[IDX_VERBOSE] = {"verbose", no_argument, 0, 0},
|
||||||
|
[IDX_STATS] = {"stats", required_argument, 0, 0},
|
||||||
|
[IDX_LOG_RESOLVED] = {"log-resolved", required_argument, 0, 0},
|
||||||
|
[IDX_LOG_FAILED] = {"log-failed", required_argument, 0, 0},
|
||||||
|
[IDX_DNS_MAKE_QUERY] = {"dns-make-query", required_argument, 0, 0},
|
||||||
|
[IDX_DNS_PARSE_QUERY] = {"dns-parse-query", no_argument, 0, 0},
|
||||||
|
[IDX_LAST] = {NULL, 0, NULL, 0},
|
||||||
|
};
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int r, v, option_index = 0;
|
int r, v, option_index = 0;
|
||||||
char fn1[256],fn2[256];
|
char fn1[256],fn2[256];
|
||||||
char dom[256];
|
char dom[256];
|
||||||
|
|
||||||
static const struct option long_options[] = {
|
|
||||||
{"help",no_argument,0,0}, // optidx=0
|
|
||||||
{"threads",required_argument,0,0}, // optidx=1
|
|
||||||
{"family",required_argument,0,0}, // optidx=2
|
|
||||||
{"verbose",no_argument,0,0}, // optidx=3
|
|
||||||
{"stats",required_argument,0,0}, // optidx=4
|
|
||||||
{"log-resolved",required_argument,0,0}, // optidx=5
|
|
||||||
{"log-failed",required_argument,0,0}, // optidx=6
|
|
||||||
{"dns-make-query",required_argument,0,0}, // optidx=7
|
|
||||||
{"dns-parse-query",no_argument,0,0}, // optidx=8
|
|
||||||
{NULL,0,NULL,0}
|
|
||||||
};
|
|
||||||
|
|
||||||
memset(&glob, 0, sizeof(glob));
|
memset(&glob, 0, sizeof(glob));
|
||||||
*fn1 = *fn2 = *dom = 0;
|
*fn1 = *fn2 = *dom = 0;
|
||||||
glob.family = FAMILY4;
|
glob.family = FAMILY4;
|
||||||
@@ -479,10 +508,11 @@ int main(int argc, char **argv)
|
|||||||
if (v) exithelp();
|
if (v) exithelp();
|
||||||
switch (option_index)
|
switch (option_index)
|
||||||
{
|
{
|
||||||
case 0: /* help */
|
case IDX_HELP:
|
||||||
|
PRINT_VER;
|
||||||
exithelp();
|
exithelp();
|
||||||
break;
|
break;
|
||||||
case 1: /* threads */
|
case IDX_THREADS:
|
||||||
glob.threads = optarg ? atoi(optarg) : 0;
|
glob.threads = optarg ? atoi(optarg) : 0;
|
||||||
if (glob.threads <= 0 || glob.threads > 100)
|
if (glob.threads <= 0 || glob.threads > 100)
|
||||||
{
|
{
|
||||||
@@ -490,7 +520,7 @@ int main(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: /* family */
|
case IDX_FAMILY:
|
||||||
if (!strcmp(optarg, "4"))
|
if (!strcmp(optarg, "4"))
|
||||||
glob.family = FAMILY4;
|
glob.family = FAMILY4;
|
||||||
else if (!strcmp(optarg, "6"))
|
else if (!strcmp(optarg, "6"))
|
||||||
@@ -503,25 +533,25 @@ int main(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3: /* verbose */
|
case IDX_VERBOSE:
|
||||||
glob.verbose = '\1';
|
glob.verbose = '\1';
|
||||||
break;
|
break;
|
||||||
case 4: /* stats */
|
case IDX_STATS:
|
||||||
glob.stats_every = optarg ? atoi(optarg) : 0;
|
glob.stats_every = optarg ? atoi(optarg) : 0;
|
||||||
break;
|
break;
|
||||||
case 5: /* log-resolved */
|
case IDX_LOG_RESOLVED:
|
||||||
strncpy(fn1,optarg,sizeof(fn1));
|
strncpy(fn1,optarg,sizeof(fn1));
|
||||||
fn1[sizeof(fn1)-1] = 0;
|
fn1[sizeof(fn1)-1] = 0;
|
||||||
break;
|
break;
|
||||||
case 6: /* log-failed */
|
case IDX_LOG_FAILED:
|
||||||
strncpy(fn2,optarg,sizeof(fn2));
|
strncpy(fn2,optarg,sizeof(fn2));
|
||||||
fn2[sizeof(fn2)-1] = 0;
|
fn2[sizeof(fn2)-1] = 0;
|
||||||
break;
|
break;
|
||||||
case 7: /* dns-make-query */
|
case IDX_DNS_MAKE_QUERY:
|
||||||
strncpy(dom,optarg,sizeof(dom));
|
strncpy(dom,optarg,sizeof(dom));
|
||||||
dom[sizeof(dom)-1] = 0;
|
dom[sizeof(dom)-1] = 0;
|
||||||
break;
|
break;
|
||||||
case 8: /* dns-parse-query */
|
case IDX_DNS_PARSE_QUERY:
|
||||||
return dns_parse_query();
|
return dns_parse_query();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -1,12 +1,13 @@
|
|||||||
CC ?= cc
|
CC ?= cc
|
||||||
CFLAGS += -std=gnu99 -s -O3 -Wno-address-of-packed-member
|
OPTIMIZE ?= -Os
|
||||||
|
CFLAGS += -std=gnu99 -s $(OPTIMIZE) -flto=auto -Wno-address-of-packed-member
|
||||||
LIBS = -lz
|
LIBS = -lz
|
||||||
SRC_FILES = *.c crypto/*.c
|
SRC_FILES = *.c crypto/*.c
|
||||||
|
|
||||||
all: dvtws
|
all: dvtws
|
||||||
|
|
||||||
dvtws: $(SRC_FILES)
|
dvtws: $(SRC_FILES)
|
||||||
$(CC) $(CFLAGS) -o $@ $(SRC_FILES) $(LDFLAGS) $(LIBS)
|
$(CC) $(CFLAGS) -o dvtws $(SRC_FILES) $(LIBS) $(LDFLAGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f dvtws
|
rm -f dvtws
|
||||||
|
|||||||
+20
-11
@@ -1,11 +1,14 @@
|
|||||||
CC ?= gcc
|
CC ?= cc
|
||||||
CFLAGS += -std=gnu99 -O3
|
OPTIMIZE ?= -Os
|
||||||
|
CFLAGS += -std=gnu99 $(OPTIMIZE) -flto=auto
|
||||||
|
CFLAGS_SYSTEMD = -DUSE_SYSTEMD
|
||||||
CFLAGS_BSD = -Wno-address-of-packed-member
|
CFLAGS_BSD = -Wno-address-of-packed-member
|
||||||
CFLAGS_MAC = -mmacosx-version-min=10.8
|
|
||||||
CFLAGS_CYGWIN = -Wno-address-of-packed-member -static
|
CFLAGS_CYGWIN = -Wno-address-of-packed-member -static
|
||||||
LIBS_LINUX = -lnetfilter_queue -lnfnetlink -lz
|
LDFLAGS_ANDROID = -llog
|
||||||
|
LIBS_LINUX = -lz -lnetfilter_queue -lnfnetlink -lmnl
|
||||||
|
LIBS_SYSTEMD = -lsystemd
|
||||||
LIBS_BSD = -lz
|
LIBS_BSD = -lz
|
||||||
LIBS_CYGWIN = -lz -Lwindows/windivert -Iwindows -lwlanapi -lole32 -loleaut32 -luuid
|
LIBS_CYGWIN = -lz -Lwindows/windivert -Iwindows -lwlanapi -lole32 -loleaut32
|
||||||
LIBS_CYGWIN32 = -lwindivert32
|
LIBS_CYGWIN32 = -lwindivert32
|
||||||
LIBS_CYGWIN64 = -lwindivert64
|
LIBS_CYGWIN64 = -lwindivert64
|
||||||
RES_CYGWIN32 = windows/res/32/winmanifest.o windows/res/32/winicon.o
|
RES_CYGWIN32 = windows/res/32/winmanifest.o windows/res/32/winicon.o
|
||||||
@@ -15,22 +18,28 @@ SRC_FILES = *.c crypto/*.c
|
|||||||
all: nfqws
|
all: nfqws
|
||||||
|
|
||||||
nfqws: $(SRC_FILES)
|
nfqws: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) -o $@ $(SRC_FILES) $(LDFLAGS) $(LIBS_LINUX)
|
$(CC) -s $(CFLAGS) -o nfqws $(SRC_FILES) $(LIBS_LINUX) $(LDFLAGS)
|
||||||
|
|
||||||
|
systemd: $(SRC_FILES)
|
||||||
|
$(CC) -s $(CFLAGS) $(CFLAGS_SYSTEMD) -o nfqws $(SRC_FILES) $(LIBS_LINUX) $(LIBS_SYSTEMD) $(LDFLAGS)
|
||||||
|
|
||||||
|
android: $(SRC_FILES)
|
||||||
|
$(CC) -s $(CFLAGS) -o nfqws $(SRC_FILES) $(LIBS_LINUX) $(LDFLAGS) $(LDFLAGS_ANDROID)
|
||||||
|
|
||||||
bsd: $(SRC_FILES)
|
bsd: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_BSD) -o dvtws $(SRC_FILES) $(LDFLAGS) $(LIBS_BSD)
|
$(CC) -s $(CFLAGS) $(CFLAGS_BSD) -o dvtws $(SRC_FILES) $(LIBS_BSD) $(LDFLAGS)
|
||||||
|
|
||||||
mac: $(SRC_FILES)
|
mac: $(SRC_FILES)
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o dvtwsa $(SRC_FILES) $(LDFLAGS) -target arm64-apple-macos10.8 $(LIBS_BSD)
|
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o dvtwsa $(SRC_FILES) -target arm64-apple-macos10.8 $(LIBS_BSD) $(LDFLAGS)
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o dvtwsx $(SRC_FILES) $(LDFLAGS) -target x86_64-apple-macos10.8 $(LIBS_BSD)
|
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o dvtwsx $(SRC_FILES) -target x86_64-apple-macos10.8 $(LIBS_BSD) $(LDFLAGS)
|
||||||
strip dvtwsa dvtwsx
|
strip dvtwsa dvtwsx
|
||||||
lipo -create -output dvtws dvtwsx dvtwsa
|
lipo -create -output dvtws dvtwsx dvtwsa
|
||||||
rm -f dvtwsx dvtwsa
|
rm -f dvtwsx dvtwsa
|
||||||
|
|
||||||
cygwin64:
|
cygwin64:
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_CYGWIN) -o winws $(SRC_FILES) $(LDFLAGS) $(LIBS_CYGWIN) $(LIBS_CYGWIN64) $(RES_CYGWIN64)
|
$(CC) -s $(CFLAGS) $(CFLAGS_CYGWIN) -o winws $(SRC_FILES) $(LIBS_CYGWIN) $(LIBS_CYGWIN64) $(RES_CYGWIN64) $(LDFLAGS)
|
||||||
cygwin32:
|
cygwin32:
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_CYGWIN) -o winws $(SRC_FILES) $(LDFLAGS) $(LIBS_CYGWIN) $(LIBS_CYGWIN32) $(RES_CYGWIN32)
|
$(CC) -s $(CFLAGS) $(CFLAGS_CYGWIN) -o winws $(SRC_FILES) $(LIBS_CYGWIN) $(LIBS_CYGWIN32) $(RES_CYGWIN32) $(LDFLAGS)
|
||||||
cygwin: cygwin64
|
cygwin: cygwin64
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|||||||
+12
-37
@@ -12,29 +12,6 @@ static void ut_oom_recover(void *elem)
|
|||||||
oom = true;
|
oom = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *l7proto_str(t_l7proto l7)
|
|
||||||
{
|
|
||||||
switch(l7)
|
|
||||||
{
|
|
||||||
case HTTP: return "http";
|
|
||||||
case TLS: return "tls";
|
|
||||||
case QUIC: return "quic";
|
|
||||||
case WIREGUARD: return "wireguard";
|
|
||||||
case DHT: return "dht";
|
|
||||||
default: return "unknown";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool l7_proto_match(t_l7proto l7proto, uint32_t filter_l7)
|
|
||||||
{
|
|
||||||
return (l7proto==UNKNOWN && (filter_l7 & L7_PROTO_UNKNOWN)) ||
|
|
||||||
(l7proto==HTTP && (filter_l7 & L7_PROTO_HTTP)) ||
|
|
||||||
(l7proto==TLS && (filter_l7 & L7_PROTO_TLS)) ||
|
|
||||||
(l7proto==QUIC && (filter_l7 & L7_PROTO_QUIC)) ||
|
|
||||||
(l7proto==WIREGUARD && (filter_l7 & L7_PROTO_WIREGUARD)) ||
|
|
||||||
(l7proto==DHT && (filter_l7 & L7_PROTO_DHT));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static const char *connstate_s[]={"SYN","ESTABLISHED","FIN"};
|
static const char *connstate_s[]={"SYN","ESTABLISHED","FIN"};
|
||||||
|
|
||||||
static void connswap(const t_conn *c, t_conn *c2)
|
static void connswap(const t_conn *c, t_conn *c2)
|
||||||
@@ -50,11 +27,9 @@ static void connswap(const t_conn *c, t_conn *c2)
|
|||||||
|
|
||||||
void ConntrackClearHostname(t_ctrack *track)
|
void ConntrackClearHostname(t_ctrack *track)
|
||||||
{
|
{
|
||||||
if (track->hostname)
|
free(track->hostname);
|
||||||
{
|
track->hostname = NULL;
|
||||||
free(track->hostname);
|
track->hostname_is_ip = false;
|
||||||
track->hostname = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
static void ConntrackClearTrack(t_ctrack *track)
|
static void ConntrackClearTrack(t_ctrack *track)
|
||||||
{
|
{
|
||||||
@@ -169,8 +144,11 @@ static void ConntrackFeedPacket(t_ctrack *t, bool bReverse, const struct tcphdr
|
|||||||
}
|
}
|
||||||
else if (tcp_synack_segment(tcphdr))
|
else if (tcp_synack_segment(tcphdr))
|
||||||
{
|
{
|
||||||
if (t->state!=SYN) ConntrackReInitTrack(t); // erase current entry
|
// ignore SA dups
|
||||||
if (!t->seq0) t->seq0 = ntohl(tcphdr->th_ack)-1;
|
uint32_t seq0 = ntohl(tcphdr->th_ack)-1;
|
||||||
|
if (t->state!=SYN && t->seq0!=seq0)
|
||||||
|
ConntrackReInitTrack(t); // erase current entry
|
||||||
|
if (!t->seq0) t->seq0 = seq0;
|
||||||
t->ack0 = ntohl(tcphdr->th_seq);
|
t->ack0 = ntohl(tcphdr->th_seq);
|
||||||
}
|
}
|
||||||
else if (tcphdr->th_flags & (TH_FIN|TH_RST))
|
else if (tcphdr->th_flags & (TH_FIN|TH_RST))
|
||||||
@@ -364,19 +342,16 @@ void ConntrackPoolDump(const t_conntrack *p)
|
|||||||
printf("rseq=%u pos_orig=%u rack=%u pos_reply=%u",
|
printf("rseq=%u pos_orig=%u rack=%u pos_reply=%u",
|
||||||
t->track.seq_last, t->track.pos_orig,
|
t->track.seq_last, t->track.pos_orig,
|
||||||
t->track.ack_last, t->track.pos_reply);
|
t->track.ack_last, t->track.pos_reply);
|
||||||
printf(" req_retrans=%u cutoff=%u wss_cutoff=%u d_cutoff=%u hostname=%s l7proto=%s\n",
|
printf(" req_retrans=%u cutoff=%u wss_cutoff=%u desync_cutoff=%u dup_cutoff=%u orig_cutoff=%u hostname=%s l7proto=%s\n",
|
||||||
t->track.req_retrans_counter, t->track.b_cutoff, t->track.b_wssize_cutoff, t->track.b_desync_cutoff, t->track.hostname, l7proto_str(t->track.l7proto));
|
t->track.req_retrans_counter, t->track.b_cutoff, t->track.b_wssize_cutoff, t->track.b_desync_cutoff, t->track.b_dup_cutoff, t->track.b_orig_mod_cutoff, t->track.hostname, l7proto_str(t->track.l7proto));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ReasmClear(t_reassemble *reasm)
|
void ReasmClear(t_reassemble *reasm)
|
||||||
{
|
{
|
||||||
if (reasm->packet)
|
free(reasm->packet);
|
||||||
{
|
reasm->packet = NULL;
|
||||||
free(reasm->packet);
|
|
||||||
reasm->packet = NULL;
|
|
||||||
}
|
|
||||||
reasm->size = reasm->size_present = 0;
|
reasm->size = reasm->size_present = 0;
|
||||||
}
|
}
|
||||||
bool ReasmInit(t_reassemble *reasm, size_t size_requested, uint32_t seq_start)
|
bool ReasmInit(t_reassemble *reasm, size_t size_requested, uint32_t seq_start)
|
||||||
|
|||||||
+10
-15
@@ -4,8 +4,6 @@
|
|||||||
// this conntrack is not bullet-proof
|
// this conntrack is not bullet-proof
|
||||||
// its designed to satisfy dpi desync needs only
|
// its designed to satisfy dpi desync needs only
|
||||||
|
|
||||||
#include "packet_queue.h"
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@@ -19,6 +17,8 @@
|
|||||||
#include <netinet/tcp.h>
|
#include <netinet/tcp.h>
|
||||||
#include <netinet/udp.h>
|
#include <netinet/udp.h>
|
||||||
|
|
||||||
|
#include "packet_queue.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
|
||||||
//#define HASH_BLOOM 20
|
//#define HASH_BLOOM 20
|
||||||
#define HASH_NONFATAL_OOM 1
|
#define HASH_NONFATAL_OOM 1
|
||||||
@@ -53,16 +53,6 @@ typedef struct {
|
|||||||
// FIN - FIN or RST received
|
// FIN - FIN or RST received
|
||||||
typedef enum {SYN=0, ESTABLISHED, FIN} t_connstate;
|
typedef enum {SYN=0, ESTABLISHED, FIN} t_connstate;
|
||||||
|
|
||||||
typedef enum {UNKNOWN=0, HTTP, TLS, QUIC, WIREGUARD, DHT} t_l7proto;
|
|
||||||
#define L7_PROTO_HTTP 0x00000001
|
|
||||||
#define L7_PROTO_TLS 0x00000002
|
|
||||||
#define L7_PROTO_QUIC 0x00000004
|
|
||||||
#define L7_PROTO_WIREGUARD 0x00000008
|
|
||||||
#define L7_PROTO_DHT 0x00000010
|
|
||||||
#define L7_PROTO_UNKNOWN 0x80000000
|
|
||||||
const char *l7proto_str(t_l7proto l7);
|
|
||||||
bool l7_proto_match(t_l7proto l7proto, uint32_t filter_l7);
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
bool bCheckDone, bCheckResult, bCheckExcluded; // hostlist check result cache
|
bool bCheckDone, bCheckResult, bCheckExcluded; // hostlist check result cache
|
||||||
@@ -87,16 +77,21 @@ typedef struct
|
|||||||
bool req_seq_present,req_seq_finalized,req_seq_abandoned;
|
bool req_seq_present,req_seq_finalized,req_seq_abandoned;
|
||||||
uint32_t req_seq_start,req_seq_end; // sequence interval of the request (to track retransmissions)
|
uint32_t req_seq_start,req_seq_end; // sequence interval of the request (to track retransmissions)
|
||||||
|
|
||||||
uint8_t incoming_ttl, autottl;
|
uint8_t incoming_ttl, desync_autottl, orig_autottl, dup_autottl;
|
||||||
|
bool b_autottl_discovered;
|
||||||
|
|
||||||
bool b_cutoff; // mark for deletion
|
bool b_cutoff; // mark for deletion
|
||||||
bool b_wssize_cutoff, b_desync_cutoff;
|
bool b_wssize_cutoff, b_desync_cutoff, b_dup_cutoff, b_orig_mod_cutoff;
|
||||||
|
|
||||||
|
uint16_t ip_id;
|
||||||
|
|
||||||
t_l7proto l7proto;
|
t_l7proto l7proto;
|
||||||
bool l7proto_discovered;
|
bool l7proto_discovered;
|
||||||
char *hostname;
|
char *hostname;
|
||||||
|
bool hostname_is_ip;
|
||||||
|
bool hostname_discovered;
|
||||||
bool hostname_ah_check; // should perform autohostlist checks
|
bool hostname_ah_check; // should perform autohostlist checks
|
||||||
|
|
||||||
t_reassemble reasm_orig;
|
t_reassemble reasm_orig;
|
||||||
struct rawpacket_tailhead delayed;
|
struct rawpacket_tailhead delayed;
|
||||||
} t_ctrack;
|
} t_ctrack;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user