fixbind
Differences
This shows you the differences between two versions of the page.
fixbind [2021-04-21 19:11] – created zugschlus | fixbind [2022-07-01 18:43] (current) – removed zugschlus | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== FixBind ====== | ||
- | |||
- | Kurzzusammenfassung: | ||
- | |||
- | Der Wrapper soll pro Programm konfigurierbar sein, d.h. unterschiedliche Programme (ggf. mit unterschiedlichen Parametern) bekommen unterschiedliche source IPs | ||
- | |||
- | Wenn ein Programm den bind() Wrapper anruft und dabei selbst explizit eine bestimmte Source-IP anfordert, dann gewinnt die vom Programm angeforderte IP. | ||
- | |||
- | ===== Situation ===== | ||
- | |||
- | * ein LAN mit zwei verschiedenen IPv6-Uplinks | ||
- | * | ||
- | * | ||
- | * Der statische Prefix steht bei anderen Netzen (Kundennetzen etc) in Accesslisten und darf " | ||
- | * ein Linux- Rechner hat je eine IP-Adresse aus beiden Prefixen | ||
- | * über den bind() Call beim Socketaufbau kann ein Prozess auswählen welche IP-Adresse er für seine ausgehende Verbindung wählt | ||
- | * Das kann aber nicht jedes Programm. Git kann es zum Beispiel nicht. | ||
- | |||
- | ===== Aufgabe ===== | ||
- | |||
- | * | ||
- | * | ||
- | * Das kann auch abhängig vom Rest der Kommandozeile entschieden werden müssen! | ||
- | |||
- | ===== Lösung ===== | ||
- | |||
- | * Ein LD_PRELOAD-Wrapper um den bind()-Call, | ||
- | * | ||
- | * srcip sei eine Liste von IP-Adressen und Netzen. Jeder Eintrag der Liste wird gegen die auf dem System vorhandenen Adressen gematcht, die erste passende Adresse wird genommen | ||
- | * | ||
- | * | ||
- | * | ||
- | |||
- | ===== Gedanken zur Konfiguration ==== | ||
- | |||
- | pseudoyaml? | ||
- | |||
- | < | ||
- | - cmdline: " | ||
- | srcip: | ||
- | - 2001: | ||
- | - 2001: | ||
- | - cmdline: " | ||
- | addrlabel: " | ||
- | - cmdline: " | ||
- | | ||
- | - 192.168.182.28 | ||
- | </ | ||
- | |||
- | Wenn man sich die Yaml-Library ersparen möchte könnte ich mir auch ein einfacheres Konfigformat vorstellen wie: | ||
- | |||
- | < | ||
- | binaryname Ip-Prefix-List | ||
- | / | ||
- | </ | ||
- | |||
- | IP-prefix-list kann auch " | ||
- | |||
- | ===== Verworfene Lösungen ===== | ||
- | |||
- | * Einfach für gewisse Zielhosts eine Route auf den langsamen, statischen Zugang setzen | ||
- | * große Downloads von diesem Host möchte ich doch gerne über den schnellen Zugang machen | ||
- | * Network Namespaces, Mandatory Access Control | ||
- | * Ja, geht, ist aber overkill für die Aufgabe | ||
- | * Lösung in der Firewall / im Kernel | ||
- | * Sehr unschön, u.a. weil dann die Ausgabe von netstat und die Debugausgabe / Logs u.U. nicht richtig sind. | ||
- | * SOCKS | ||
- | * Das würde vermutlich gehen, aber den Aufwand würde ich mir ungerne ans Bein binden, sonst könnte ich einfach den dynamischen Prefix nur auf den SOCKS-Proxy routen und über " | ||
- | |||
- | ===== Beispielcode ===== | ||
- | |||
- | < | ||
- | bindwrapper() { | ||
- | |||
- | if(srcIP == NULL) { | ||
- | |||
- | srcIP = read_config(programmname); | ||
- | // kennt man an der stelle den programmnamen des aufrufers überhaupt? | ||
- | // Ich denke den kennt man über ${ENV[0]}. | ||
- | |||
- | // ggf. andere attribute setzen | ||
- | |||
- | } | ||
- | |||
- | bind(srcIP); | ||
- | |||
- | } | ||
- | </ | ||
- | |||
- | Wie einfach oder kompliziert du read_config() baust ist ja eher Nebenbaustelle, | ||
- | |||
- | Blueprint könnte das hier sein: http:// | ||
- | |||
- | Hier mit IPv6_Support: | ||
- | |||
- | Es gibt auch was ähnlich altes vom Pöttering: http:// | ||
- | |||
- | Daniel Lange hat dazu gebloggt: https:// | ||
- | | ||
- | Damit kannste die Konfiguration über ein Shellscript machen. | ||
- | |||
- | < | ||
- | git() { export BIND_ADDR=$(setsrcaddr " | ||
- | setsrcaddr() liest dann deine config. und das geht in die .shellrc und fertig. | ||
- | </ | ||
- | |||
- | Die Lösung nimmt natürlich keine Rücksicht auf die Wunsch IP und weitere Attribute. | ||
- | Das müsste man noch einbauen, und eigentlich hätte ich es schon gerne etwas schöner, und würde gerne ohne hunderte von Shell-Aliases auskokmmen. | ||
- | |||
fixbind.1619032262.txt.gz · Last modified: 2021-04-21 19:11 by zugschlus